From b44ca46e92c5d48de825f1f1e5b1b042461448ef Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Wed, 5 Nov 2014 20:38:35 +0200 Subject: Implement a foreach loop construct. Closes #17. --- mparser.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'mparser.py') diff --git a/mparser.py b/mparser.py index d0058ac80..e85a15473 100644 --- a/mparser.py +++ b/mparser.py @@ -17,6 +17,8 @@ import re import sys from coredata import MesonException +from array import array +from orca.messages import itemsFound class ParseException(MesonException): def __init__(self, text, lineno, colno): @@ -39,7 +41,7 @@ class Token: class Lexer: def __init__(self): self.keywords = {'true', 'false', 'if', 'else', 'elif', - 'endif', 'and', 'or', 'not'} + 'endif', 'and', 'or', 'not', 'foreach', 'endforeach'} self.token_specification = [ # Need to be sorted longest to shortest. ('ignore', re.compile(r'[ \t]')), @@ -214,6 +216,14 @@ class AssignmentNode: assert(isinstance(var_name, str)) self.value = value +class ForeachClauseNode(): + def __init__(self, lineno, colno, varname, items, block): + self.lineno = lineno + self.colno = colno + self.varname = varname + self.items = items + self.block = block + class IfClauseNode(): def __init__(self, lineno, colno): self.lineno = lineno @@ -417,6 +427,15 @@ class Parser: return self.method_call(method) return method + def foreachblock(self): + t = self.current + self.expect('id') + varname = t + self.expect('colon') + items = self.statement() + block = self.codeblock() + return ForeachClauseNode(varname.lineno, varname.colno, varname, items, block) + def ifblock(self): condition = self.statement() clause = IfClauseNode(condition.lineno, condition.colno) @@ -445,6 +464,10 @@ class Parser: block = self.ifblock() self.expect('endif') return block + if self.accept('foreach'): + block = self.foreachblock() + self.expect('endforeach') + return block return self.statement() def codeblock(self): -- cgit v1.2.3