Browse Source

Small refactor in grammar analysis

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.7.2
Erez Shinan 6 years ago
parent
commit
71fe87964a
2 changed files with 6 additions and 7 deletions
  1. +6
    -2
      lark/parsers/grammar_analysis.py
  2. +0
    -5
      lark/parsers/lalr_analysis.py

+ 6
- 2
lark/parsers/grammar_analysis.py View File

@@ -109,7 +109,8 @@ class GrammarAnalyzer(object):
def __init__(self, parser_conf, debug=False):
self.debug = debug

rules = parser_conf.rules + [Rule(NonTerminal('$root'), [NonTerminal(parser_conf.start), Terminal('$END')])]
root_rule = Rule(NonTerminal('$root'), [NonTerminal(parser_conf.start), Terminal('$END')])
rules = parser_conf.rules + [root_rule]
self.rules_by_origin = classify(rules, lambda r: r.origin)

if len(rules) != len(set(rules)):
@@ -121,7 +122,10 @@ class GrammarAnalyzer(object):
if not (sym.is_term or sym in self.rules_by_origin):
raise GrammarError("Using an undefined rule: %s" % sym) # TODO test validation

self.start_state = self.expand_rule(NonTerminal('$root'))
self.start_state = self.expand_rule(root_rule.origin)

end_rule = RulePtr(root_rule, len(root_rule.expansion))
self.end_state = fzset({end_rule})

self.FIRST, self.FOLLOW, self.NULLABLE = calculate_sets(rules)



+ 0
- 5
lark/parsers/lalr_analysis.py View File

@@ -85,7 +85,6 @@ class IntParseTable(ParseTable):
class LALR_Analyzer(GrammarAnalyzer):

def compute_lookahead(self):
self.end_states = []

self.states = {}
def step(state):
@@ -105,8 +104,6 @@ class LALR_Analyzer(GrammarAnalyzer):

new_state = fzset(rps)
lookahead[sym].append((Shift, new_state))
if sym == Terminal('$END'):
self.end_states.append( new_state )
yield new_state

for k, v in lookahead.items():
@@ -130,8 +127,6 @@ class LALR_Analyzer(GrammarAnalyzer):
for _ in bfs([self.start_state], step):
pass

self.end_state ,= self.end_states

self._parse_table = ParseTable(self.states, self.start_state, self.end_state)

if self.debug:


Loading…
Cancel
Save