summaryrefslogtreecommitdiff
path: root/parser/parse.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2026-01-25 14:36:10 +0100
committerMarc Vertes <mvertes@free.fr>2026-01-25 14:36:10 +0100
commitece8bdbc45afc3ea626db884ea3283d9a8395ae5 (patch)
tree859b7d2e653841d07ebd438eaa85ab07058915ba /parser/parse.go
parent95c50e35888fb54ced38907dc6e97dc683937e70 (diff)
feat: handle define expression with multiple right valuesHEADmain
Diffstat (limited to 'parser/parse.go')
-rw-r--r--parser/parse.go17
1 files changed, 14 insertions, 3 deletions
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
}