Browse Source

Don't construct a list of tokens, to reduce memory footprint

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.5.1
Erez Shinan 7 years ago
parent
commit
00811a7c16
2 changed files with 8 additions and 6 deletions
  1. +2
    -2
      lark/parser_frontends.py
  2. +6
    -4
      lark/parsers/earley.py

+ 2
- 2
lark/parser_frontends.py View File

@@ -27,7 +27,7 @@ class LALR(WithLexer):
self.parser = lalr_parser.Parser(parser_conf) self.parser = lalr_parser.Parser(parser_conf)


def parse(self, text): def parse(self, text):
tokens = list(self.lex(text))
tokens = self.lex(text)
return self.parser.parse(tokens) return self.parser.parse(tokens)


class LALR_ContextualLexer: class LALR_ContextualLexer:
@@ -160,7 +160,7 @@ class Earley(WithLexer):
return [Terminal_Token(sym) if is_terminal(sym) else sym for sym in expansion] return [Terminal_Token(sym) if is_terminal(sym) else sym for sym in expansion]


def parse(self, text): def parse(self, text):
tokens = list(self.lex(text))
tokens = self.lex(text)
return self.parser.parse(tokens) return self.parser.parse(tokens)


def get_frontend(parser, lexer): def get_frontend(parser, lexer):


+ 6
- 4
lark/parsers/earley.py View File

@@ -168,7 +168,7 @@ class Parser:
to_scan = cur_set.to_scan.get_news() to_scan = cur_set.to_scan.get_news()
for item in to_scan: for item in to_scan:
if item.expect.match(token): if item.expect.match(token):
next_set.add([item.advance(stream[i])])
next_set.add([item.advance(token)])


if not next_set and token is not END_TOKEN: if not next_set and token is not END_TOKEN:
expect = {i.expect for i in cur_set.to_scan} expect = {i.expect for i in cur_set.to_scan}
@@ -181,10 +181,12 @@ class Parser:
column0.add(predict(start, column0)) column0.add(predict(start, column0))


cur_set = column0 cur_set = column0
for i, char in enumerate(stream):
_, cur_set = process_column(i, char, cur_set)
i = 0
for token in stream:
_, cur_set = process_column(i, token, cur_set)
i += 1


last_set, _ = process_column(len(stream), END_TOKEN, cur_set)
last_set, _ = process_column(i, END_TOKEN, cur_set)


# Parse ended. Now build a parse tree # Parse ended. Now build a parse tree
solutions = [n.tree for n in last_set.to_reduce solutions = [n.tree for n in last_set.to_reduce


Loading…
Cancel
Save