From 5da3a651ba08859ccc1cdf1094603411696c8df2 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Thu, 14 Mar 2024 23:22:23 +0100 Subject: feat: improve debug output of tokens --- parser/compiler.go | 28 ++++++---------------------- parser/expr.go | 14 ++++++++------ parser/parse.go | 25 +++++++++++++++---------- parser/tokens.go | 4 +--- 4 files changed, 30 insertions(+), 41 deletions(-) (limited to 'parser') diff --git a/parser/compiler.go b/parser/compiler.go index 886da9b..4594ab9 100644 --- a/parser/compiler.go +++ b/parser/compiler.go @@ -212,9 +212,8 @@ func (c *Compiler) Codegen(tokens Tokens) (err error) { } case lang.JumpFalse: - label := t.Str[10:] var i int64 - if s, ok := c.symbols[label]; !ok { + if s, ok := c.symbols[t.Str]; !ok { // t.Beg contains the position in code which needs to be fixed. t.Beg = len(c.Code) fixList = append(fixList, t) @@ -224,9 +223,8 @@ func (c *Compiler) Codegen(tokens Tokens) (err error) { emit(int64(t.Pos), vm.JumpFalse, i) case lang.JumpSetFalse: - label := t.Str[13:] var i int64 - if s, ok := c.symbols[label]; !ok { + if s, ok := c.symbols[t.Str]; !ok { // t.Beg contains the position in code which needs to be fixed. t.Beg = len(c.Code) fixList = append(fixList, t) @@ -236,9 +234,8 @@ func (c *Compiler) Codegen(tokens Tokens) (err error) { emit(int64(t.Pos), vm.JumpSetFalse, i) case lang.JumpSetTrue: - label := t.Str[12:] var i int64 - if s, ok := c.symbols[label]; !ok { + if s, ok := c.symbols[t.Str]; !ok { // t.Beg contains the position in code which needs to be fixed. t.Beg = len(c.Code) fixList = append(fixList, t) @@ -248,9 +245,8 @@ func (c *Compiler) Codegen(tokens Tokens) (err error) { emit(int64(t.Pos), vm.JumpSetTrue, int64(i)) case lang.Goto: - label := t.Str[5:] var i int64 - if s, ok := c.symbols[label]; !ok { + if s, ok := c.symbols[t.Str]; !ok { t.Beg = len(c.Code) fixList = append(fixList, t) } else { @@ -275,21 +271,9 @@ func (c *Compiler) Codegen(tokens Tokens) (err error) { // Finally we fix unresolved labels for jump destinations. for _, t := range fixList { - var label string - // TODO: this could be simplified. - switch t.Id { - case lang.Goto: - label = t.Str[5:] - case lang.JumpFalse: - label = t.Str[10:] - case lang.JumpSetFalse: - label = t.Str[13:] - case lang.JumpSetTrue: - label = t.Str[12:] - } - s, ok := c.symbols[label] + s, ok := c.symbols[t.Str] if !ok { - return fmt.Errorf("label not found: %q", label) + return fmt.Errorf("label not found: %q", t.Str) } c.Code[t.Beg][2] = s.value.Data.Int() - int64(t.Beg) diff --git a/parser/expr.go b/parser/expr.go index 0b2ad2a..73b860e 100644 --- a/parser/expr.go +++ b/parser/expr.go @@ -88,18 +88,20 @@ func (p *Parser) ParseExpr(in Tokens) (out Tokens, err error) { log.Println("callExpr:", t2.Str, p.scope, s, ok, sc) if s.kind == symValue { // Store the number of input parameters in the token Beg field. - ops = append(ops, scanner.Token{Str: "callX", Id: lang.CallX, Pos: t.Pos, Beg: p.numItems(t.Block(), lang.Comma)}) + ops = append(ops, scanner.Token{Id: lang.CallX, Pos: t.Pos, Beg: p.numItems(t.Block(), lang.Comma)}) break } } } - ops = append(ops, scanner.Token{Str: "call", Id: lang.Call, Pos: t.Pos}) + ops = append(ops, scanner.Token{Id: lang.Call, Pos: t.Pos}) case lang.BracketBlock: out = append(out, t) vl++ - ops = append(ops, scanner.Token{Str: "index", Id: lang.Index, Pos: t.Pos}) + ops = append(ops, scanner.Token{Id: lang.Index, Pos: t.Pos}) + case lang.Comment: + return out, nil default: - return nil, fmt.Errorf("expression not supported yet: %q", t.Str) + return nil, fmt.Errorf("expression not supported yet: %v: %q", t.Id, t.Str) } if len(selectors) > 0 { out = append(out, selectors...) @@ -196,9 +198,9 @@ func (p *Parser) ParseLogical(in Tokens) (out Tokens, err error) { } out = append(out, lhs...) if in[l].Id == lang.Lor { - out = append(out, scanner.Token{Id: lang.JumpSetTrue, Str: "JumpSetTrue " + p.scope + "x" + xp}) + out = append(out, scanner.Token{Id: lang.JumpSetTrue, Str: p.scope + "x" + xp}) } else { - out = append(out, scanner.Token{Id: lang.JumpSetFalse, Str: "JumpSetFalse " + p.scope + "x" + xp}) + out = append(out, scanner.Token{Id: lang.JumpSetFalse, Str: p.scope + "x" + xp}) } out = append(out, rhs...) out = append(out, scanner.Token{Id: lang.Label, Str: p.scope + "x" + xp}) diff --git a/parser/parse.go b/parser/parse.go index 36ff125..95f9af3 100644 --- a/parser/parse.go +++ b/parser/parse.go @@ -82,10 +82,15 @@ func (p *Parser) ParseStmt(in Tokens) (out Tokens, err error) { return p.ParseFor(in) case lang.Func: return p.ParseFunc(in) + case lang.Defer, lang.Go, lang.Fallthrough, lang.Import, lang.Select: + return out, fmt.Errorf("not yet implemented: %v", t.Id) case lang.Goto: return p.ParseGoto(in) case lang.If: return p.ParseIf(in) + case lang.Package: + // TODO: support packages + return out, err case lang.Return: return p.ParseReturn(in) case lang.Switch: @@ -118,7 +123,7 @@ func (p *Parser) ParseBreak(in Tokens) (out Tokens, err error) { default: return nil, fmt.Errorf("invalid break statement") } - out = Tokens{{Id: lang.Goto, Str: "goto " + label}} + out = Tokens{{Id: lang.Goto, Str: label}} return out, err } @@ -136,7 +141,7 @@ func (p *Parser) ParseContinue(in Tokens) (out Tokens, err error) { default: return nil, fmt.Errorf("invalid continue statement") } - out = Tokens{{Id: lang.Goto, Str: "goto " + label}} + out = Tokens{{Id: lang.Goto, Str: label}} return out, err } @@ -145,7 +150,7 @@ func (p *Parser) ParseGoto(in Tokens) (out Tokens, err error) { return nil, fmt.Errorf("invalid goto statement") } // TODO: check validity of user provided label - return Tokens{{Id: lang.Goto, Str: "goto " + p.funcScope + "/" + in[1].Str}}, nil + return Tokens{{Id: lang.Goto, Str: p.funcScope + "/" + in[1].Str}}, nil } func (p *Parser) ParseFor(in Tokens) (out Tokens, err error) { @@ -181,7 +186,7 @@ func (p *Parser) ParseFor(in Tokens) (out Tokens, err error) { return nil, err } out = append(out, cond...) - out = append(out, scanner.Token{Id: lang.JumpFalse, Str: "JumpFalse " + p.scope + "e"}) + out = append(out, scanner.Token{Id: lang.JumpFalse, Str: p.scope + "e"}) } if body, err = p.Parse(in[len(in)-1].Block()); err != nil { return nil, err @@ -194,7 +199,7 @@ func (p *Parser) ParseFor(in Tokens) (out Tokens, err error) { out = append(out, post...) } out = append(out, - scanner.Token{Id: lang.Goto, Str: "goto " + p.scope + "b"}, + scanner.Token{Id: lang.Goto, Str: p.scope + "b"}, scanner.Token{Id: lang.Label, Str: p.scope + "e"}) return out, err } @@ -230,7 +235,7 @@ func (p *Parser) ParseFunc(in Tokens) (out Tokens, err error) { }() out = Tokens{ - {Id: lang.Goto, Str: "goto " + fname + "_end"}, // Skip function definition. + {Id: lang.Goto, Str: fname + "_end"}, // Skip function definition. {Id: lang.Label, Pos: in[0].Pos, Str: fname}} bi := in.Index(lang.BraceBlock) @@ -283,7 +288,7 @@ func (p *Parser) ParseIf(in Tokens) (out Tokens, err error) { return nil, err } if sc > 0 { - pre = append(pre, scanner.Token{Id: lang.Goto, Str: "goto " + p.scope + "e0"}) + pre = append(pre, scanner.Token{Id: lang.Goto, Str: p.scope + "e0"}) } pre = append(pre, scanner.Token{Id: lang.Label, Str: p.scope + "e" + ssc}) out = append(pre, out...) @@ -313,7 +318,7 @@ func (p *Parser) ParseIf(in Tokens) (out Tokens, err error) { return nil, err } pre = append(pre, cond...) - pre = append(pre, scanner.Token{Id: lang.JumpFalse, Str: "JumpFalse " + p.scope + "e" + ssc}) + pre = append(pre, scanner.Token{Id: lang.JumpFalse, Str: p.scope + "e" + ssc}) out = append(pre, out...) i = ifp if i > 1 && in[i].Id == lang.If && in[i-1].Id == lang.Else { // Step over 'else if'. @@ -412,11 +417,11 @@ func (p *Parser) ParseCaseClause(in Tokens, index, max int, condSwitch bool) (ou if condSwitch { out = append(out, scanner.Token{Id: lang.EqualSet}) } - out = append(out, scanner.Token{Id: lang.JumpFalse, Str: "JumpFalse " + next}) + out = append(out, scanner.Token{Id: lang.JumpFalse, Str: next}) } out = append(out, body...) if i != len(lcond)-1 || index != max { - out = append(out, scanner.Token{Id: lang.Goto, Str: "Goto " + p.scope + "e"}) + out = append(out, scanner.Token{Id: lang.Goto, Str: p.scope + "e"}) } } return out, err diff --git a/parser/tokens.go b/parser/tokens.go index e581eb5..51085d9 100644 --- a/parser/tokens.go +++ b/parser/tokens.go @@ -1,8 +1,6 @@ package parser import ( - "fmt" - "github.com/mvertes/parscan/lang" "github.com/mvertes/parscan/scanner" ) @@ -11,7 +9,7 @@ type Tokens []scanner.Token func (toks Tokens) String() (s string) { for _, t := range toks { - s += fmt.Sprintf("%#v ", t.Str) + s += t.String() + " " } return s } -- cgit v1.2.3