summaryrefslogtreecommitdiff
path: root/parser/parse.go
diff options
context:
space:
mode:
Diffstat (limited to 'parser/parse.go')
-rw-r--r--parser/parse.go27
1 files changed, 18 insertions, 9 deletions
diff --git a/parser/parse.go b/parser/parse.go
index 46b1724..67d8657 100644
--- a/parser/parse.go
+++ b/parser/parse.go
@@ -193,25 +193,33 @@ 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
fc := strconv.Itoa(p.labelCount[p.scope])
p.labelCount[p.scope]++
- var init, cond, post, body Tokens
+ breakLabel, continueLabel := p.breakLabel, p.continueLabel
+ p.pushScope("for" + fc)
+ p.breakLabel, p.continueLabel = p.scope+"e", p.scope+"b"
+ defer func() {
+ p.breakLabel, p.continueLabel = breakLabel, continueLabel
+ p.popScope()
+ }()
pre := in[1 : len(in)-1].Split(lang.Semicolon)
switch len(pre) {
case 1:
- cond = pre[0]
+ if in.Index(lang.Range) >= 0 {
+ init = pre[0]
+ // cond = Tokens{{Tok: lang.Next, Str: p.scope + "c"}}
+ // final = Tokens{{Tok: lang.Stop, Str: p.scope + "f"}}
+ cond = Tokens{{Tok: lang.Next}}
+ final = Tokens{{Tok: lang.Stop}}
+ } else {
+ cond = pre[0]
+ }
case 3:
init, cond, post = pre[0], pre[1], pre[2]
default:
return nil, ErrFor
}
- breakLabel, continueLabel := p.breakLabel, p.continueLabel
- p.pushScope("for" + fc)
- p.breakLabel, p.continueLabel = p.scope+"e", p.scope+"b"
- defer func() {
- p.breakLabel, p.continueLabel = breakLabel, continueLabel
- p.popScope()
- }()
if len(init) > 0 {
if init, err = p.parseStmt(init); err != nil {
return nil, err
@@ -239,6 +247,7 @@ func (p *Parser) parseFor(in Tokens) (out Tokens, err error) {
out = append(out,
scanner.Token{Tok: lang.Goto, Str: p.scope + "b"},
scanner.Token{Tok: lang.Label, Str: p.scope + "e"})
+ out = append(out, final...)
return out, err
}