summaryrefslogtreecommitdiff
path: root/parser/expr.go
diff options
context:
space:
mode:
Diffstat (limited to 'parser/expr.go')
-rw-r--r--parser/expr.go21
1 files changed, 17 insertions, 4 deletions
diff --git a/parser/expr.go b/parser/expr.go
index 3895ea8..e00113f 100644
--- a/parser/expr.go
+++ b/parser/expr.go
@@ -128,6 +128,18 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) {
ops = append(ops, scanner.Token{Tok: lang.Composite, Pos: t.Pos, Str: typeStr})
case lang.BracketBlock:
+ if i == 0 || in[i-1].Tok.IsOperator() {
+ // array or slice type expression
+ typ, err := p.parseTypeExpr(in[i:])
+ if err != nil {
+ return out, err
+ }
+ typeStr = typ.String()
+ p.Symbols.Add(symbol.UnsetAddr, typ.String(), vm.NewValue(typ), symbol.Type, typ, p.funcScope != "")
+ out = append(out, scanner.Token{Tok: lang.Ident, Pos: t.Pos, Str: typeStr})
+ i++
+ break
+ }
toks, err := p.parseExprStr(t.Block(), typeStr)
if err != nil {
return out, err
@@ -135,9 +147,6 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) {
out = append(out, toks...)
ops = append(ops, scanner.Token{Tok: lang.Index, Pos: t.Pos})
- case lang.Comment:
- // return out, nil
-
case lang.Struct:
typ, err := p.parseTypeExpr(in[i : i+2])
if err != nil {
@@ -146,9 +155,10 @@ func (p *Parser) parseExpr(in Tokens, typeStr string) (out Tokens, err error) {
typeStr = typ.String()
p.Symbols.Add(symbol.UnsetAddr, typ.String(), vm.NewValue(typ), symbol.Type, typ, p.funcScope != "")
out = append(out, scanner.Token{Tok: lang.Ident, Pos: t.Pos, Str: typeStr})
- log.Println("### typ:", typ)
i++
+ case lang.Comment:
+
default:
log.Println("unxexpected token:", t)
}
@@ -168,6 +178,7 @@ func (p *Parser) parseComposite(s, typ string) (Tokens, error) {
noColon := len(tokens) > 0 && tokens.Index(lang.Colon) == -1
var result Tokens
+ var sliceLen int
for i, sub := range tokens.Split(lang.Comma) {
toks, err := p.parseExpr(sub, typ)
if err != nil {
@@ -178,10 +189,12 @@ func (p *Parser) parseComposite(s, typ string) (Tokens, error) {
result = append(result, scanner.Token{Tok: lang.Int, Str: strconv.Itoa(i)})
result = append(result, toks...)
result = append(result, scanner.Token{Tok: lang.Colon, Str: ":"})
+ sliceLen++
} else {
result = append(result, toks...)
}
}
+ p.Symbols[typ].SliceLen = sliceLen
return result, nil
}