From 6ae0a2530c9a57fc093d2159591d9cae8140d641 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Thu, 8 Jan 2026 23:46:02 +0100 Subject: fix: improve composite literal for slices --- parser/expr.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'parser/expr.go') diff --git a/parser/expr.go b/parser/expr.go index 3895ea8..e00113f 100644 --- a/parser/expr.go +++ b/parser/expr.go @@ -128,6 +128,18 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { ops = append(ops, scanner.Token{Tok: lang.Composite, Pos: t.Pos, Str: typeStr}) case lang.BracketBlock: + if i == 0 || in[i-1].Tok.IsOperator() { + // array or slice type expression + typ, err := p.parseTypeExpr(in[i:]) + if err != nil { + return out, err + } + typeStr = typ.String() + p.Symbols.Add(symbol.UnsetAddr, typ.String(), vm.NewValue(typ), symbol.Type, typ, p.funcScope != "") + out = append(out, scanner.Token{Tok: lang.Ident, Pos: t.Pos, Str: typeStr}) + i++ + break + } toks, err := p.parseExprStr(t.Block(), typeStr) if err != nil { return out, err @@ -135,9 +147,6 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { out = append(out, toks...) ops = append(ops, scanner.Token{Tok: lang.Index, Pos: t.Pos}) - case lang.Comment: - // return out, nil - case lang.Struct: typ, err := p.parseTypeExpr(in[i : i+2]) if err != nil { @@ -146,9 +155,10 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { typeStr = typ.String() p.Symbols.Add(symbol.UnsetAddr, typ.String(), vm.NewValue(typ), symbol.Type, typ, p.funcScope != "") out = append(out, scanner.Token{Tok: lang.Ident, Pos: t.Pos, Str: typeStr}) - log.Println("### typ:", typ) i++ + case lang.Comment: + default: log.Println("unxexpected token:", t) } @@ -168,6 +178,7 @@ func (p *Parser) parseComposite(s, typ string) (Tokens, error) { noColon := len(tokens) > 0 && tokens.Index(lang.Colon) == -1 var result Tokens + var sliceLen int for i, sub := range tokens.Split(lang.Comma) { toks, err := p.parseExpr(sub, typ) if err != nil { @@ -178,10 +189,12 @@ func (p *Parser) parseComposite(s, typ string) (Tokens, error) { 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: ":"}) + sliceLen++ } else { result = append(result, toks...) } } + p.Symbols[typ].SliceLen = sliceLen return result, nil } -- cgit v1.2.3