Browse Source

Fixed issue where Lark would throw RecursionError for huge grammars (Issue #181)

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.6.1
Erez Shinan 6 years ago
parent
commit
0240e1c248
1 changed files with 7 additions and 7 deletions
  1. +7
    -7
      lark/load_grammar.py

+ 7
- 7
lark/load_grammar.py View File

@@ -17,7 +17,7 @@ from .utils import classify, suppress
from .exceptions import GrammarError, UnexpectedCharacters, UnexpectedToken from .exceptions import GrammarError, UnexpectedCharacters, UnexpectedToken


from .tree import Tree, SlottedTree as ST from .tree import Tree, SlottedTree as ST
from .visitors import Transformer, Visitor, v_args
from .visitors import Transformer, Visitor, v_args, Transformer_InPlace
inline_args = v_args(inline=True) inline_args = v_args(inline=True)


__path__ = os.path.dirname(__file__) __path__ = os.path.dirname(__file__)
@@ -147,7 +147,7 @@ RULES = {




@inline_args @inline_args
class EBNF_to_BNF(Transformer):
class EBNF_to_BNF(Transformer_InPlace):
def __init__(self): def __init__(self):
self.new_rules = [] self.new_rules = []
self.rules_by_expr = {} self.rules_by_expr = {}
@@ -252,7 +252,7 @@ class RuleTreeToText(Transformer):




@inline_args @inline_args
class CanonizeTree(Transformer):
class CanonizeTree(Transformer_InPlace):
def maybe(self, expr): def maybe(self, expr):
return ST('expr', [expr, Token('OP', '?', -1)]) return ST('expr', [expr, Token('OP', '?', -1)])


@@ -262,7 +262,7 @@ class CanonizeTree(Transformer):
tokenmods, value = args tokenmods, value = args
return tokenmods + [value] return tokenmods + [value]


class PrepareAnonTerminals(Transformer):
class PrepareAnonTerminals(Transformer_InPlace):
"Create a unique list of anonymous tokens. Attempt to give meaningful names to them when we add them" "Create a unique list of anonymous tokens. Attempt to give meaningful names to them when we add them"


def __init__(self, tokens): def __init__(self, tokens):
@@ -363,7 +363,7 @@ def _literal_to_pattern(literal):




@inline_args @inline_args
class PrepareLiterals(Transformer):
class PrepareLiterals(Transformer_InPlace):
def literal(self, literal): def literal(self, literal):
return ST('pattern', [_literal_to_pattern(literal)]) return ST('pattern', [_literal_to_pattern(literal)])


@@ -416,7 +416,7 @@ class TokenTreeToPattern(Transformer):
def value(self, v): def value(self, v):
return v[0] return v[0]


class PrepareSymbols(Transformer):
class PrepareSymbols(Transformer_InPlace):
def value(self, v): def value(self, v):
v ,= v v ,= v
if isinstance(v, Tree): if isinstance(v, Tree):
@@ -551,7 +551,7 @@ def symbols_from_strcase(expansion):
return [Terminal(x, filter_out=x.startswith('_')) if is_terminal(x) else NonTerminal(x) for x in expansion] return [Terminal(x, filter_out=x.startswith('_')) if is_terminal(x) else NonTerminal(x) for x in expansion]


@inline_args @inline_args
class PrepareGrammar(Transformer):
class PrepareGrammar(Transformer_InPlace):
def terminal(self, name): def terminal(self, name):
return name return name
def nonterminal(self, name): def nonterminal(self, name):


Loading…
Cancel
Save