diff options
| author | Marc Vertes <mvertes@free.fr> | 2026-01-07 19:06:23 +0100 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2026-01-07 19:06:23 +0100 |
| commit | 6875facb39de63eb6353be2f700b9eacb631e9fa (patch) | |
| tree | 31b8d7c8701df2f52a7b3cecc82dd775c9d9f428 /parser/expr.go | |
| parent | ca80eeaa812b49afea75d3084d0c62770e4a8d18 (diff) | |
fix: improve handling of composite literal struct expressions
Diffstat (limited to 'parser/expr.go')
| -rw-r--r-- | parser/expr.go | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/parser/expr.go b/parser/expr.go index 3327ec5..3895ea8 100644 --- a/parser/expr.go +++ b/parser/expr.go @@ -89,9 +89,6 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { ops = append(ops, t) case lang.Ident: - if i < lin-1 && in[i].Tok == lang.Colon { - continue - } s, sc, ok := p.Symbols.Get(t.Str, p.scope) if ok && sc != "" { t.Str = sc + "/" + t.Str @@ -123,7 +120,7 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { } case lang.BraceBlock: - toks, err := p.parseExprStr(t.Block(), typeStr) + toks, err := p.parseComposite(t.Block(), typeStr) out = append(out, toks...) if err != nil { return out, err @@ -163,6 +160,32 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { return out, err } +func (p *Parser) parseComposite(s, typ string) (Tokens, error) { + tokens, err := p.Scan(s, false) + if err != nil { + return nil, err + } + + noColon := len(tokens) > 0 && tokens.Index(lang.Colon) == -1 + var result Tokens + for i, sub := range tokens.Split(lang.Comma) { + toks, err := p.parseExpr(sub, typ) + if err != nil { + return result, err + } + if noColon { + // Insert a numeric index key and a colon operator. + result = append(result, scanner.Token{Tok: lang.Int, Str: strconv.Itoa(i)}) + result = append(result, toks...) + result = append(result, scanner.Token{Tok: lang.Colon, Str: ":"}) + } else { + result = append(result, toks...) + } + } + + return result, nil +} + func (p *Parser) parseExprStr(s, typ string) (tokens Tokens, err error) { if tokens, err = p.Scan(s, false); err != nil { return tokens, err |
