diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2015-03-15 22:31:10 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2015-03-15 22:31:10 +0200 |
commit | fa2c659825031c599f59e0a863e8266614e6756f (patch) | |
tree | 0e2f6acb4ffed827f785883ca1f029484ed3cf0b /mparser.py | |
parent | cdbfed21bc0f21d3cd63fbd33a01c848ac1f7180 (diff) | |
download | meson-fa2c659825031c599f59e0a863e8266614e6756f.zip meson-fa2c659825031c599f59e0a863e8266614e6756f.tar.gz meson-fa2c659825031c599f59e0a863e8266614e6756f.tar.bz2 |
Parse arguments iteratively instead of recursively to support argument lists of arbitrary size.
Diffstat (limited to 'mparser.py')
-rw-r--r-- | mparser.py | 44 |
1 files changed, 24 insertions, 20 deletions
@@ -131,6 +131,9 @@ class IdNode: self.value = token.value assert(isinstance(self.value, str)) + def __str__(self): + return "Id node: '%s' (%d, %d)." % (self.value, self.lineno, self.colno) + class NumberNode: def __init__(self, token): self.lineno = token.lineno @@ -145,6 +148,9 @@ class StringNode: self.value = token.value assert(isinstance(self.value, str)) + def __str__(self): + return "String node: '%s' (%d, %d)." % (self.value, self.lineno, self.colno) + class ArrayNode: def __init__(self, args): self.lineno = args.lineno @@ -255,16 +261,18 @@ class ArgumentNode(): self.order_error = False def prepend(self, statement): + if self.num_kwargs() > 0: + self.order_error = True if not isinstance(statement, EmptyNode): self.arguments = [statement] + self.arguments def append(self, statement): + if self.num_kwargs() > 0: + self.order_error = True if not isinstance(statement, EmptyNode): self.arguments = self.arguments + [statement] def set_kwarg(self, name, value): - if self.num_args() > 0: - self.order_error = True self.kwargs[name] = value def num_args(self): @@ -427,26 +435,22 @@ class Parser: def args(self): s = self.statement() - if isinstance(s, EmptyNode): - ArgumentNode(s) - - if self.accept('comma'): - rest = self.args() - rest.prepend(s) - return rest - if self.accept('colon'): - if not isinstance(s, IdNode): - raise ParseException('Keyword argument must be a plain identifier.', - s.lineno, s.colno) - value = self.statement() + a = ArgumentNode(s) + + while not isinstance(s, EmptyNode): if self.accept('comma'): - a = self.args() + a.append(s) + elif self.accept('colon'): + if not isinstance(s, IdNode): + raise ParseException('Keyword argument must be a plain identifier.', + s.lineno, s.colno) + a.set_kwarg(s.value, self.statement()) + if not self.accept('comma'): + return a else: - a = ArgumentNode(self.current) - a.set_kwarg(s.value, value) - return a - a = ArgumentNode(self.current) - a.append(s) + a.append(s) + return a + s = self.statement() return a def method_call(self, source_object): |