summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
Diffstat (limited to 'parser')
-rw-r--r--parser/parse.go17
-rw-r--r--parser/tokens.go2
2 files changed, 12 insertions, 7 deletions
diff --git a/parser/parse.go b/parser/parse.go
index daf30ca..e72e16e 100644
--- a/parser/parse.go
+++ b/parser/parse.go
@@ -201,6 +201,7 @@ func (p *Parser) parseGoto(in Tokens) (out Tokens, err error) {
func (p *Parser) parseFor(in Tokens) (out Tokens, err error) {
// TODO: detect invalid code.
var init, cond, post, body, final Tokens
+ hasRange := in.Index(lang.Range) >= 0
fc := strconv.Itoa(p.labelCount[p.scope])
p.labelCount[p.scope]++
breakLabel, continueLabel := p.breakLabel, p.continueLabel
@@ -213,10 +214,10 @@ func (p *Parser) parseFor(in Tokens) (out Tokens, err error) {
pre := in[1 : len(in)-1].Split(lang.Semicolon)
switch len(pre) {
case 1:
- if in.Index(lang.Range) >= 0 {
+ if hasRange {
init = pre[0]
- cond = Tokens{{Token: scanner.Token{Tok: lang.Next}}}
- final = Tokens{{Token: scanner.Token{Tok: lang.Stop}}}
+ cond = Tokens{newNext(p.breakLabel, in[1].Pos)}
+ final = Tokens{newStop(in[1].Pos)}
} else {
cond = pre[0]
}
@@ -231,13 +232,15 @@ func (p *Parser) parseFor(in Tokens) (out Tokens, err error) {
}
out = init
}
- out = append(out, newLabel(p.scope+"b", in[0].Pos))
+ out = append(out, newLabel(p.continueLabel, in[0].Pos))
if len(cond) > 0 {
if cond, err = p.parseExpr(cond, ""); err != nil {
return nil, err
}
out = append(out, cond...)
- out = append(out, newJumpFalse(p.scope+"e", in[0].Pos))
+ if !hasRange {
+ out = append(out, newJumpFalse(p.breakLabel, in[0].Pos))
+ }
}
if body, err = p.Parse(in[len(in)-1].Block()); err != nil {
return nil, err
@@ -250,8 +253,8 @@ func (p *Parser) parseFor(in Tokens) (out Tokens, err error) {
out = append(out, post...)
}
out = append(out,
- newGoto(p.scope+"b", in[0].Pos),
- newLabel(p.scope+"e", in[0].Pos),
+ newGoto(p.continueLabel, in[0].Pos),
+ newLabel(p.breakLabel, in[0].Pos),
)
out = append(out, final...)
return out, err
diff --git a/parser/tokens.go b/parser/tokens.go
index a0a93fa..7a241f3 100644
--- a/parser/tokens.go
+++ b/parser/tokens.go
@@ -79,6 +79,8 @@ func newCall(pos int, arg ...any) Token { return newToken(lang.Cal
func newGoto(label string, pos int) Token { return newToken(lang.Goto, label, pos) }
func newLabel(label string, pos int) Token { return newToken(lang.Label, label, pos) }
func newJumpFalse(label string, pos int) Token { return newToken(lang.JumpFalse, label, pos) }
+func newNext(label string, pos int) Token { return newToken(lang.Next, label, pos) }
+func newStop(pos int) Token { return newToken(lang.Stop, "", pos) }
func newGrow(size, pos int) Token { return newToken(lang.Grow, "", pos, size) }
func newSemicolon(pos int) Token { return newToken(lang.Semicolon, "", pos) }
func newEqualSet(pos int) Token { return newToken(lang.EqualSet, "", pos) }