From ee21c324ce8c41b589e5a39e5715223ffd154315 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Fri, 17 Nov 2023 16:45:58 +0100 Subject: parser: support selector expression to get / set struct fields The structures are reresented by reflect values. New instructions `Field` and `Vassign` have been added to the VM to assign reflect values and access struct fields. --- parser/expr.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'parser/expr.go') diff --git a/parser/expr.go b/parser/expr.go index 2cd19c6..c2d5eeb 100644 --- a/parser/expr.go +++ b/parser/expr.go @@ -10,8 +10,9 @@ import ( func (p *Parser) ParseExpr(in Tokens) (out Tokens, err error) { log.Println("ParseExpr in:", in) - var ops Tokens + var ops, selectors Tokens var vl int + var selectorId string // // Process tokens from last to first, the goal is to reorder the tokens in // a stack machine processing order, so it can be directly interpreted. @@ -21,8 +22,11 @@ func (p *Parser) ParseExpr(in Tokens) (out Tokens, err error) { // temporary assumptions: binary operators, returning 1 value switch t.Id { case lang.Ident: + if i > 0 && in[i-1].Id == lang.Period { + selectorId = t.Str + continue + } // resolve symbol if not a selector rhs. - // TODO: test for selector expr. _, sc, ok := p.getSym(t.Str, p.scope) if ok { if sc != "" { @@ -31,6 +35,10 @@ func (p *Parser) ParseExpr(in Tokens) (out Tokens, err error) { } out = append(out, t) vl++ + case lang.Period: + t.Str += selectorId + selectors = append(Tokens{t}, selectors...) + continue case lang.Int, lang.String: out = append(out, t) vl++ @@ -64,6 +72,10 @@ func (p *Parser) ParseExpr(in Tokens) (out Tokens, err error) { } ops = append(ops, scanner.Token{Str: "call", Id: lang.Call, Pos: t.Pos}) } + if len(selectors) > 0 { + out = append(out, selectors...) + selectors = nil + } if lops, lout := len(ops), len(out); lops > 0 && vl > lops { op := ops[lops-1] ops = ops[:lops-1] -- cgit v1.2.3