From 3cf8207c708f23d1bd8400de5483b6b8eadb01ca Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Fri, 19 Dec 2025 18:00:34 +0100 Subject: fix lang: attribute properties to tokens, not strings --- parser/expr.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ parser/parse.go | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) (limited to 'parser') diff --git a/parser/expr.go b/parser/expr.go index 5958279..d3161a5 100644 --- a/parser/expr.go +++ b/parser/expr.go @@ -11,7 +11,53 @@ import ( "github.com/mvertes/parscan/vm" ) +// parseExpr transform an infix expression into a postfix notation func (p *Parser) parseExpr(in Tokens) (out Tokens, err error) { + log.Println("parseExpr2 in:", in) + var ops Tokens + + popop := func() (t scanner.Token) { l := len(ops) - 1; t = ops[l]; ops = ops[:l]; return t } + + for i, t := range in { + switch t.Tok { + case lang.Int, lang.String: + out = append(out, t) + + case lang.Add, lang.Assign, lang.Define, lang.Equal, lang.Greater, lang.Less, lang.Mul: + // Apply operator precedence rule. + for len(ops) > 0 && p.precedence(t) < p.precedence(ops[len(ops)-1]) { + out = append(out, popop()) + } + ops = append(ops, t) + + case lang.Ident: + _, sc, ok := p.Symbols.Get(t.Str, p.scope) + if ok { + // t.Str = sc + "/" + t.Str + _ = sc + } + out = append(out, t) + if i+1 < len(in) && in[i+1].Tok == lang.Define { + log.Println("t:", t.Str) + p.Symbols.Add(symbol.UnsetAddr, t.Str, vm.Value{}, symbol.Var, nil, false) + } + + case lang.ParenBlock: + toks, err := p.parseExprStr(t.Block()) + if err != nil { + return out, err + } + out = append(out, toks...) + } + } + for len(ops) > 0 { + out = append(out, popop()) + } + log.Println("Final out:", out) + return out, err +} + +func (p *Parser) parseExpr2(in Tokens) (out Tokens, err error) { log.Println("parseExpr in:", in) var ops, selectors Tokens var vl int diff --git a/parser/parse.go b/parser/parse.go index e7d5399..75bc963 100644 --- a/parser/parse.go +++ b/parser/parse.go @@ -519,5 +519,5 @@ func (p *Parser) popScope() { } func (p *Parser) precedence(t scanner.Token) int { - return p.TokenProps[t.Str].Precedence + return p.TokenProps[t.Tok].Precedence } -- cgit v1.2.3