Browse Source

Small refactoring step

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.6.0
Erez Shinan 7 years ago
parent
commit
1839c324d3
2 changed files with 23 additions and 10 deletions
  1. +19
    -7
      lark/load_grammar.py
  2. +4
    -3
      lark/utils.py

+ 19
- 7
lark/load_grammar.py View File

@@ -13,6 +13,7 @@ from .parser_frontends import LALR
from .parsers.lalr_parser import UnexpectedToken from .parsers.lalr_parser import UnexpectedToken
from .common import is_terminal, GrammarError, LexerConf, ParserConf, PatternStr, PatternRE, TokenDef from .common import is_terminal, GrammarError, LexerConf, ParserConf, PatternStr, PatternRE, TokenDef
from .grammar import RuleOptions, Rule, Terminal, NonTerminal from .grammar import RuleOptions, Rule, Terminal, NonTerminal
from .utils import classify


from .tree import Tree, Transformer, InlineTransformer, Visitor, SlottedTree as ST from .tree import Tree, Transformer, InlineTransformer, Visitor, SlottedTree as ST


@@ -108,10 +109,14 @@ RULES = {


'?atom': ['_LPAR expansions _RPAR', '?atom': ['_LPAR expansions _RPAR',
'maybe', 'maybe',
'name',
'terminal',
'nonterminal',
'literal', 'literal',
'range'], 'range'],


'terminal': ['TOKEN'],
'nonterminal': ['RULE'],

'?name': ['RULE', 'TOKEN'], '?name': ['RULE', 'TOKEN'],


'maybe': ['_LBRA expansions _RBRA'], 'maybe': ['_LBRA expansions _RBRA'],
@@ -514,6 +519,12 @@ def options_from_rule(name, *x):
def symbols_from_strcase(expansion): def symbols_from_strcase(expansion):
return [Terminal(x) if is_terminal(x) else NonTerminal(x) for x in expansion] return [Terminal(x) if is_terminal(x) else NonTerminal(x) for x in expansion]


class PrepareGrammar(InlineTransformer):
def terminal(self, name):
return name
def nonterminal(self, name):
return name

class GrammarLoader: class GrammarLoader:
def __init__(self): def __init__(self):
tokens = [TokenDef(name, PatternRE(value)) for name, value in TOKENS.items()] tokens = [TokenDef(name, PatternRE(value)) for name, value in TOKENS.items()]
@@ -554,15 +565,16 @@ class GrammarLoader:
raise GrammarError("Expecting a value at line %s column %s\n\n%s" % (e.line, e.column, context)) raise GrammarError("Expecting a value at line %s column %s\n\n%s" % (e.line, e.column, context))
raise raise


# Extract grammar items
tree = PrepareGrammar().transform(tree)


token_defs = [c.children for c in tree.children if c.data=='token']
rule_defs = [c.children for c in tree.children if c.data=='rule']
statements = [c.children for c in tree.children if c.data=='statement']
assert len(token_defs) + len(rule_defs) + len(statements) == len(tree.children)
# Extract grammar items
defs = classify(tree.children, lambda c: c.data, lambda c: c.children)
token_defs = defs.pop('token', [])
rule_defs = defs.pop('rule', [])
statements = defs.pop('statement', [])
assert not defs


token_defs = [td if len(td)==3 else (td[0], 1, td[1]) for td in token_defs] token_defs = [td if len(td)==3 else (td[0], 1, td[1]) for td in token_defs]

token_defs = [(name.value, (t, int(p))) for name, p, t in token_defs] token_defs = [(name.value, (t, int(p))) for name, p, t in token_defs]


# Execute statements # Execute statements


+ 4
- 3
lark/utils.py View File

@@ -17,14 +17,15 @@ def classify_bool(seq, pred):


return true_elems, false_elems return true_elems, false_elems


def classify(seq, key=None):
def classify(seq, key=None, value=None):
d = {} d = {}
for item in seq: for item in seq:
k = key(item) if (key is not None) else item k = key(item) if (key is not None) else item
v = value(item) if (value is not None) else item
if k in d: if k in d:
d[k].append(item)
d[k].append(v)
else: else:
d[k] = [item]
d[k] = [v]
return d return d


def bfs(initial, expand): def bfs(initial, expand):


Loading…
Cancel
Save