diff --git a/lark/earley.py b/lark/earley.py index e2d4814..beafe8a 100644 --- a/lark/earley.py +++ b/lark/earley.py @@ -105,41 +105,37 @@ class State(object): class Parser(object): def __init__(self, rules, start=None): - self.table = [[]] self.rules = [Rule(r['name'], r['symbols'], r.get('postprocess', None)) for r in rules] self.rules_by_name = classify(self.rules, lambda r: r.name) self.start = start or self.rules[0].name - initial_rules = set(self.rules_by_name[self.start]) - self.table[0] += [State(r, 0, 0) for r in initial_rules] - self.advance_to(0, initial_rules) - self.current = 0 - def advance_to(self, n, added_rules): - for w, s in enumerate(self.table[n]): - s.process(n, w, self.table, self.rules_by_name, added_rules) + def advance_to(self, table, n, added_rules): + for w, s in enumerate(table[n]): + s.process(n, w, table, self.rules_by_name, added_rules) + + def parse(self, stream): + initial_rules = set(self.rules_by_name[self.start]) + table = [[State(r, 0, 0) for r in initial_rules]] + self.advance_to(table, 0, initial_rules) - def parse(self, chunk): - chunk_pos = 0 - for chunk_pos, chunk_item in enumerate(chunk): - self.table.append([]) + for pos, token in enumerate(stream): + table.append([]) - for s in self.table[self.current + chunk_pos]: - x = s.consume_terminal(chunk_item) + for s in table[pos]: + x = s.consume_terminal(token) if x: - self.table[self.current + chunk_pos + 1].append(x) + table[pos + 1].append(x) - added_rules = set() - self.advance_to(self.current + chunk_pos + 1, added_rules) + self.advance_to(table, pos + 1, set()) - if not self.table[-1]: - raise Exception('Error at line {t.line}:{t.column}'.format(t=chunk[chunk_pos])) + if not table[-1]: + raise Exception('Error at line {t.line}:{t.column}'.format(t=stream[pos])) - self.current += chunk_pos - return list(self.finish()) + return list(self.finish(table)) - def finish(self): - for t in self.table[-1]: + def finish(self, table): + for t in table[-1]: if (t.rule.name == self.start and t.expect == len(t.rule.symbols) and t.reference == 0 diff --git a/lark/examples/__init__.py b/lark/examples/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/lark/examples/calc.py b/lark/examples/calc.py deleted file mode 100644 index 2c2e1b3..0000000 --- a/lark/examples/calc.py +++ /dev/null @@ -1,59 +0,0 @@ -from lark.tree import Transformer -from lark.lark import Lark - -calc_grammar = """ - ?start: sum - | NAME "=" sum -> *assign_var - - ?sum: product - | sum "+" product -> *add - | sum "-" product -> *sub - - ?product: atom - | product "*" atom -> *mul - | product "/" atom -> *div - - ?atom: /[\d.]+/ -> *number - | "-" atom -> *neg - | NAME -> *var - | "(" sum ")" - - NAME: /\w+/ - WS.ignore: /\s+/ -""" - -class CalculateTree(Transformer): - from operator import add, sub, mul, div, neg - number = float - - def __init__(self): - self.vars = {} - - def assign_var(self, name, value): - self.vars[name] = value - return value - - def var(self, name): - return self.vars[name] - - - -calc_parser = Lark(calc_grammar, parser='lalr', transformer=CalculateTree()) -calc = calc_parser.parse - -def main(): - while True: - try: - s = raw_input('> ') - except EOFError: - break - print(calc(s)) - -def test(): - print calc("a = 1+2") - print calc("1+a*-3") - -if __name__ == '__main__': - test() - # main() - diff --git a/lark/examples/json_example.py b/lark/examples/json_example.py deleted file mode 100644 index 4e7d09d..0000000 --- a/lark/examples/json_example.py +++ /dev/null @@ -1,62 +0,0 @@ -import sys -from lark.lark import Lark -from lark.tree import Transformer - -json_grammar = r""" - ?start: value - - ?value: object - | array - | string - | number - | "true" -> *true - | "false" -> *false - | "null" -> *null - - array : "[" [value ("," value)*] "]" - object : "{" [pair ("," pair)*] "}" - pair : string ":" value - - *number : /-?\d+(\.\d+)?([eE][+-]?\d+)?/ - *string : /".*?(?