summaryrefslogtreecommitdiff
path: root/parser/parse.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2026-01-24 23:06:55 +0100
committerMarc Vertes <mvertes@free.fr>2026-01-24 23:06:55 +0100
commit95c50e35888fb54ced38907dc6e97dc683937e70 (patch)
treefd68ffe15104f0c94700648c6893ed90a3d32423 /parser/parse.go
parent51e11a29f9d2a9e571c3ea7c406863a025749ad6 (diff)
fix: improve parsing of assign statements
Handle assign statements in parseAssign function. Detect multi-assign by the presence of comma in the right hand side tokens. The case of swap is not handled yet.
Diffstat (limited to 'parser/parse.go')
-rw-r--r--parser/parse.go28
1 files changed, 27 insertions, 1 deletions
diff --git a/parser/parse.go b/parser/parse.go
index e72e16e..f42193a 100644
--- a/parser/parse.go
+++ b/parser/parse.go
@@ -145,15 +145,41 @@ func (p *Parser) parseStmt(in Tokens) (out Tokens, err error) {
case lang.Var:
return p.parseVar(in)
case lang.Ident:
- if len(in) == 2 && in[1].Tok == lang.Colon {
+ if in.Index(lang.Colon) == 1 {
return p.parseLabel(in)
}
+ if i := in.Index(lang.Assign); i > 0 {
+ return p.parseAssign(in, i)
+ }
fallthrough
default:
return p.parseExpr(in, "")
}
}
+func (p *Parser) parseAssign(in Tokens, aindex int) (out Tokens, err error) {
+ rhs := in[aindex+1:].Split(lang.Comma)
+ lr := len(rhs)
+ if lr == 1 {
+ return p.parseExpr(in, "")
+ }
+ lhs := in[:aindex].Split(lang.Comma)
+ for i, e := range rhs {
+ toks, err := p.parseExpr(lhs[i], "")
+ if err != nil {
+ return out, err
+ }
+ out = append(out, toks...)
+ toks, err = p.parseExpr(e, "")
+ if err != nil {
+ return out, err
+ }
+ out = append(out, toks...)
+ out = append(out, newAssign(in[aindex].Pos))
+ }
+ return out, err
+}
+
func (p *Parser) parseBreak(in Tokens) (out Tokens, err error) {
var label string
switch len(in) {