summaryrefslogtreecommitdiff
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
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.
-rw-r--r--interp/interpreter_test.go5
-rw-r--r--parser/parse.go28
-rw-r--r--parser/tokens.go1
3 files changed, 31 insertions, 3 deletions
diff --git a/interp/interpreter_test.go b/interp/interpreter_test.go
index adb550b..27b7dd8 100644
--- a/interp/interpreter_test.go
+++ b/interp/interpreter_test.go
@@ -72,8 +72,9 @@ func TestExpr(t *testing.T) {
func TestAssign(t *testing.T) {
run(t, []etest{
- {src: "var a int = 1; a", res: "1"}, // #00
- {src: "var a, b int = 1, 2; b", res: "2"}, // #01
+ {src: "var a int = 1; a", res: "1"}, // #00
+ {src: "var a, b int = 1, 2; b", res: "2"}, // #01
+ {src: "var a, b int; a, b = 1, 2; b", res: "2"}, // #02
})
}
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) {
diff --git a/parser/tokens.go b/parser/tokens.go
index 7a241f3..b8f462f 100644
--- a/parser/tokens.go
+++ b/parser/tokens.go
@@ -94,3 +94,4 @@ func newInt(i, pos int) Token { return newToken(lang.Int
func newColon(pos int) Token { return newToken(lang.Colon, "", pos) }
func newLen(i, pos int) Token { return newToken(lang.Len, "", pos, i) }
func newSlice(pos int) Token { return newToken(lang.Slice, "", pos) }
+func newAssign(pos int) Token { return newToken(lang.Assign, "", pos) }