diff options
| author | Marc Vertes <mvertes@free.fr> | 2026-01-25 14:36:10 +0100 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2026-01-25 14:36:10 +0100 |
| commit | ece8bdbc45afc3ea626db884ea3283d9a8395ae5 (patch) | |
| tree | 859b7d2e653841d07ebd438eaa85ab07058915ba | |
| parent | 95c50e35888fb54ced38907dc6e97dc683937e70 (diff) | |
| -rw-r--r-- | interp/interpreter_test.go | 1 | ||||
| -rw-r--r-- | parser/parse.go | 17 | ||||
| -rw-r--r-- | parser/tokens.go | 1 |
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) } |
