Factor out start_symbol into a better position

This commit is contained in:
Dave Halter
2018-06-13 00:54:18 +02:00
parent f638abb08e
commit 95ddeb4012
2 changed files with 9 additions and 10 deletions

View File

@@ -70,7 +70,7 @@ class Grammar(object):
""" """
def __init__(self, bnf_text): def __init__(self, bnf_text, start_symbol):
self.symbol2number = {} self.symbol2number = {}
self.number2symbol = {} self.number2symbol = {}
self.states = [] self.states = []
@@ -80,7 +80,11 @@ class Grammar(object):
self.tokens = {} self.tokens = {}
self.symbol2label = {} self.symbol2label = {}
self.label2symbol = {} self.label2symbol = {}
self.start = 256 self.start_symbol = start_symbol
@property
def start_symbol(self):
return self.symbol2number[self.start_symbol]
def report(self): def report(self):
"""Dump the grammar tables to standard output, for debugging.""" """Dump the grammar tables to standard output, for debugging."""

View File

@@ -25,10 +25,9 @@ from parso.utils import parse_version_string
class ParserGenerator(object): class ParserGenerator(object):
def __init__(self, dfas, start_symbol, token_namespace): def __init__(self, dfas, token_namespace):
self._token_namespace = token_namespace self._token_namespace = token_namespace
self.dfas = dfas self.dfas = dfas
self.start_symbol = start_symbol
def make_grammar(self, grammar): def make_grammar(self, grammar):
self._first = {} # map from symbol name to set of tokens self._first = {} # map from symbol name to set of tokens
@@ -36,9 +35,6 @@ class ParserGenerator(object):
names = list(self.dfas.keys()) names = list(self.dfas.keys())
names.sort() names.sort()
# TODO do we still need this?
names.remove(self.start_symbol)
names.insert(0, self.start_symbol)
for name in names: for name in names:
i = 256 + len(grammar.symbol2number) i = 256 + len(grammar.symbol2number)
grammar.symbol2number[name] = i grammar.symbol2number[name] = i
@@ -55,7 +51,6 @@ class ParserGenerator(object):
states.append(arcs) states.append(arcs)
grammar.states.append(states) grammar.states.append(states)
grammar.dfas[grammar.symbol2number[name]] = (states, self._make_first(grammar, name)) grammar.dfas[grammar.symbol2number[name]] = (states, self._make_first(grammar, name))
grammar.start = grammar.symbol2number[self.start_symbol]
return grammar return grammar
def _make_first(self, grammar, name): def _make_first(self, grammar, name):
@@ -419,5 +414,5 @@ def generate_grammar(bnf_grammar, token_namespace):
own parser. own parser.
""" """
dfas, start_symbol = _GrammarParser(bnf_grammar)._parse() dfas, start_symbol = _GrammarParser(bnf_grammar)._parse()
p = ParserGenerator(dfas, start_symbol, token_namespace) p = ParserGenerator(dfas, token_namespace)
return p.make_grammar(Grammar(bnf_grammar)) return p.make_grammar(Grammar(bnf_grammar, start_symbol))