Skip to content

Commit

Permalink
refactor(parser): Use assignment() in forStmt
Browse files Browse the repository at this point in the history
  • Loading branch information
ngjunsiang committed May 4, 2022
1 parent c579bae commit 95d7387
Showing 1 changed file with 10 additions and 23 deletions.
33 changes: 10 additions & 23 deletions parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,40 +283,27 @@ def repeatStmt(tokens):
return Loop('repeat', None, cond, stmts)

def forStmt(tokens):
name = identifier(tokens)
expectElseError(tokens, '<-', "after name")
start = value(tokens)
init = assignment(tokens)
# name = identifier(tokens)
# expectElseError(tokens, '<-', "after name")
# start = value(tokens)
expectElseError(tokens, 'TO', "after start value")
end = value(tokens)
step = makeExpr(type='INTEGER', value=1, token=end.token())
step = makeExpr(type='INTEGER', value=1, token=init.token())
if match(tokens, 'STEP'):
step = value(tokens)
expectElseError(tokens, '\n', "at end of FOR")
stmts = []
while not atEnd(tokens) and not match(tokens, 'ENDFOR'):
stmts += [statement(tokens)]
expectElseError(tokens, '\n', "after ENDFOR")
# Initialise name to start
init = Assign('assign', name.name, start)
# Generate loop cond
cond = Binary(
makeExpr(frame=NULL, name=name.name, token=name),
lte,
end,
token=name,
)
getCounter = makeExpr(frame=NULL, name=init.name, token=init.token())
cond = Binary(getCounter, lte, end, token=init.token())
# Add increment statement
incr = Assign(
'assign',
name,
Binary(
makeExpr(frame=NULL, name=name.name, token=name),
add,
step,
token=name,
),
)
return Loop('while', init, cond, stmts + [incr])
incr = Binary(getCounter, add, step, token=step.token())
update = Assign(name=init.name, expr=incr, token=init.token())
return Loop('while', init, cond, stmts + [update])

def procedureStmt(tokens):
name = identifier(tokens).name
Expand Down

0 comments on commit 95d7387

Please sign in to comment.