summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
Diffstat (limited to 'parser')
-rw-r--r--parser/parse.go28
-rw-r--r--parser/tokens.go1
2 files changed, 28 insertions, 1 deletions
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) }