diff --git a/lark/parsers/grammar_analysis.py b/lark/parsers/grammar_analysis.py index 732496c..ab84efb 100644 --- a/lark/parsers/grammar_analysis.py +++ b/lark/parsers/grammar_analysis.py @@ -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) diff --git a/lark/parsers/lalr_analysis.py b/lark/parsers/lalr_analysis.py index 54a4041..ee2f75c 100644 --- a/lark/parsers/lalr_analysis.py +++ b/lark/parsers/lalr_analysis.py @@ -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: