diff options
| -rw-r--r-- | interp/interpreter_test.go | 5 | ||||
| -rw-r--r-- | parser/parse.go | 28 | ||||
| -rw-r--r-- | parser/tokens.go | 1 |
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) } |
