mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-18 18:36:02 +08:00
Factor out start_symbol into a better position
This commit is contained in:
@@ -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."""
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user