From 5220ccb741c7f3688731d3b3df6e5e851f50f5c5 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Wed, 8 Nov 2023 10:29:33 +0100 Subject: parser: fix break in switch statements --- parser/interpreter_test.go | 6 ++++-- parser/parse.go | 31 ++----------------------------- 2 files changed, 6 insertions(+), 31 deletions(-) (limited to 'parser') diff --git a/parser/interpreter_test.go b/parser/interpreter_test.go index d73d282..42223d4 100644 --- a/parser/interpreter_test.go +++ b/parser/interpreter_test.go @@ -130,7 +130,8 @@ func TestSwitch(t *testing.T) { switch a { default: a = 0 case 1,2: a = a+1 - case 3: a = a+2 + case 3: a = a+2; break; a = 3 + case 4: a = 10 } return a } @@ -148,7 +149,8 @@ func TestSwitch(t *testing.T) { {src: src0 + "f(1)", res: "2"}, {src: src0 + "f(2)", res: "3"}, {src: src0 + "f(3)", res: "5"}, - {src: src0 + "f(4)", res: "0"}, + {src: src0 + "f(4)", res: "10"}, + {src: src0 + "f(5)", res: "0"}, {src: src1 + "f(1)", res: "2"}, {src: src1 + "f(4)", res: "5"}, diff --git a/parser/parse.go b/parser/parse.go index be8b31a..40cec5b 100644 --- a/parser/parse.go +++ b/parser/parse.go @@ -85,32 +85,6 @@ func (p *Parser) Parse(src string) (out Tokens, err error) { return out, err } return p.ParseStmts(in) - /* - log.Println("Parse in:", in) - for len(in) > 0 { - endstmt := in.Index(lang.Semicolon) - if endstmt == -1 { - return out, scanner.ErrBlock - } - // Skip over simple init statements for some tokens (if, for, ...) - if lang.HasInit[in[0].Id] { - for in[endstmt-1].Id != lang.BraceBlock { - e2 := in[endstmt+1:].Index(lang.Semicolon) - if e2 == -1 { - return out, scanner.ErrBlock - } - endstmt += 1 + e2 - } - } - o, err := p.ParseStmt(in[:endstmt]) - if err != nil { - return out, err - } - out = append(out, o...) - in = in[endstmt+1:] - } - return out, err - */ } func (p *Parser) ParseStmts(in Tokens) (out Tokens, err error) { @@ -387,12 +361,11 @@ func (p *Parser) ParseSwitch(in Tokens) (out Tokens, err error) { p.labelCount[p.scope]++ breakLabel := p.breakLabel p.pushScope(label) - p.breakLabel = p.scope + p.breakLabel = p.scope + "e" defer func() { p.breakLabel = breakLabel p.popScope() }() - log.Println("### ic:", initcond, "#init:", init, "#cond:", cond) if len(init) > 0 { if init, err = p.ParseStmt(init); err != nil { return nil, err @@ -427,7 +400,7 @@ func (p *Parser) ParseSwitch(in Tokens) (out Tokens, err error) { } out = append(out, co...) } - out = append(out, scanner.Token{Id: lang.Label, Str: p.scope + "e"}) + out = append(out, scanner.Token{Id: lang.Label, Str: p.breakLabel}) return out, err } -- cgit v1.2.3