diff options
| author | Marc Vertes <mvertes@free.fr> | 2026-01-11 19:02:27 +0100 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2026-01-11 19:02:27 +0100 |
| commit | 5a04b5512a128bd1805792cca4eabacf5fd49b27 (patch) | |
| tree | a9d4fa09d14bc2b1e17ea2ff14878f556ed41536 /parser | |
| parent | 7520aa4474ea30985cf26631c6bbdebf38484a0d (diff) | |
fix: handle assign statements on map elements
A new token MapAssign is added to implement assignements involving
a map, slice or array, an index key expression and a value expression.
Diffstat (limited to 'parser')
| -rw-r--r-- | parser/README.md | 1 | ||||
| -rw-r--r-- | parser/expr.go | 9 | ||||
| -rw-r--r-- | parser/parse.go | 2 |
3 files changed, 10 insertions, 2 deletions
diff --git a/parser/README.md b/parser/README.md index 9f40e77..ccf580d 100644 --- a/parser/README.md +++ b/parser/README.md @@ -59,6 +59,7 @@ Go language support: - [x] iota expression - [ ] defer statement - [ ] recover statement +- [ ] range clause - [ ] go statement - [x] if statement (including else and else if) - [x] for statement diff --git a/parser/expr.go b/parser/expr.go index 0a87999..35e54ff 100644 --- a/parser/expr.go +++ b/parser/expr.go @@ -145,7 +145,14 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) { return out, err } out = append(out, toks...) - ops = append(ops, scanner.Token{Tok: lang.Index, Pos: t.Pos}) + if i < len(in)-2 && in[i+1].Tok == lang.Assign { + // A brace block followed by assign implies a MapAssing token, + // as assignement to a map element cannot be implemented through a normal Assign. + ops = append(ops, scanner.Token{Tok: lang.MapAssign, Pos: t.Pos}) + i++ + } else { + ops = append(ops, scanner.Token{Tok: lang.Index, Pos: t.Pos}) + } case lang.Struct: typ, err := p.parseTypeExpr(in[i : i+2]) diff --git a/parser/parse.go b/parser/parse.go index c049b87..32ee0e3 100644 --- a/parser/parse.go +++ b/parser/parse.go @@ -59,7 +59,7 @@ func (p *Parser) Scan(s string, endSemi bool) (Tokens, error) { return p.Scanner.Scan(s, endSemi) } -// Parse performs syntax analysis on s and return Tokens or an error. +// Parse performs syntax analysis on s and returns Tokens or an error. func (p *Parser) Parse(src string) (out Tokens, err error) { in, err := p.Scan(src, true) if err != nil { |
