summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2026-01-11 19:02:27 +0100
committerMarc Vertes <mvertes@free.fr>2026-01-11 19:02:27 +0100
commit5a04b5512a128bd1805792cca4eabacf5fd49b27 (patch)
treea9d4fa09d14bc2b1e17ea2ff14878f556ed41536 /parser
parent7520aa4474ea30985cf26631c6bbdebf38484a0d (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.md1
-rw-r--r--parser/expr.go9
-rw-r--r--parser/parse.go2
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 {