summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interp/interpreter_test.go1
-rw-r--r--parser/parse.go17
-rw-r--r--parser/tokens.go1
3 files changed, 15 insertions, 4 deletions
diff --git a/interp/interpreter_test.go b/interp/interpreter_test.go
index 27b7dd8..30f3fac 100644
--- a/interp/interpreter_test.go
+++ b/interp/interpreter_test.go
@@ -75,6 +75,7 @@ func TestAssign(t *testing.T) {
{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
+ {src: "a, b := 1, 2; b", res: "2"}, // #03
})
}
diff --git a/parser/parse.go b/parser/parse.go
index f42193a..18613f4 100644
--- a/parser/parse.go
+++ b/parser/parse.go
@@ -11,6 +11,7 @@ import (
"github.com/mvertes/parscan/lang"
"github.com/mvertes/parscan/scanner"
"github.com/mvertes/parscan/symbol"
+ "github.com/mvertes/parscan/vm"
)
// Parser represents the state of a parser.
@@ -151,6 +152,9 @@ func (p *Parser) parseStmt(in Tokens) (out Tokens, err error) {
if i := in.Index(lang.Assign); i > 0 {
return p.parseAssign(in, i)
}
+ if i := in.Index(lang.Define); i > 0 {
+ return p.parseAssign(in, i)
+ }
fallthrough
default:
return p.parseExpr(in, "")
@@ -159,23 +163,30 @@ func (p *Parser) parseStmt(in Tokens) (out Tokens, err error) {
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 {
+ if len(rhs) == 1 {
return p.parseExpr(in, "")
}
lhs := in[:aindex].Split(lang.Comma)
+ define := in[aindex].Tok == lang.Define
for i, e := range rhs {
toks, err := p.parseExpr(lhs[i], "")
if err != nil {
return out, err
}
out = append(out, toks...)
+ if define {
+ for _, t := range toks {
+ if t.Tok == lang.Ident {
+ p.Symbols.Add(symbol.UnsetAddr, t.Str, vm.Value{}, symbol.Var, nil, p.funcScope != "")
+ }
+ }
+ }
toks, err = p.parseExpr(e, "")
if err != nil {
return out, err
}
out = append(out, toks...)
- out = append(out, newAssign(in[aindex].Pos))
+ out = append(out, newToken(in[aindex].Tok, "", in[aindex].Pos))
}
return out, err
}
diff --git a/parser/tokens.go b/parser/tokens.go
index b8f462f..7a241f3 100644
--- a/parser/tokens.go
+++ b/parser/tokens.go
@@ -94,4 +94,3 @@ 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) }