In pgen now everything is named grammar and not c

This commit is contained in:
Dave Halter
2018-06-12 18:17:02 +02:00
parent 1e18163402
commit 0f32673092
+32 -32
View File
@@ -5,7 +5,7 @@
# Copyright 2014 David Halter. Integration into Jedi. # Copyright 2014 David Halter. Integration into Jedi.
# Modifications are dual-licensed: MIT and PSF. # Modifications are dual-licensed: MIT and PSF.
from parso.pgen2 import grammar from parso.pgen2.grammar import Grammar
from parso.python import token from parso.python import token
from parso.python import tokenize from parso.python import tokenize
from parso.utils import parse_version_string from parso.utils import parse_version_string
@@ -25,63 +25,63 @@ class ParserGenerator(object):
self._token_namespace = token_namespace self._token_namespace = token_namespace
def make_grammar(self): def make_grammar(self):
c = grammar.Grammar(self._bnf_text) grammar = Grammar(self._bnf_text)
names = list(self.dfas.keys()) names = list(self.dfas.keys())
names.sort() names.sort()
# TODO do we still need this? # TODO do we still need this?
names.remove(self.startsymbol) names.remove(self.startsymbol)
names.insert(0, self.startsymbol) names.insert(0, self.startsymbol)
for name in names: for name in names:
i = 256 + len(c.symbol2number) i = 256 + len(grammar.symbol2number)
c.symbol2number[name] = i grammar.symbol2number[name] = i
c.number2symbol[i] = name grammar.number2symbol[i] = name
for name in names: for name in names:
dfa = self.dfas[name] dfa = self.dfas[name]
states = [] states = []
for state in dfa: for state in dfa:
arcs = [] arcs = []
for label, next in state.arcs.items(): for label, next in state.arcs.items():
arcs.append((self._make_label(c, label), dfa.index(next))) arcs.append((self._make_label(grammar, label), dfa.index(next)))
if state.isfinal: if state.isfinal:
arcs.append((0, dfa.index(state))) arcs.append((0, dfa.index(state)))
states.append(arcs) states.append(arcs)
c.states.append(states) grammar.states.append(states)
c.dfas[c.symbol2number[name]] = (states, self._make_first(c, name)) grammar.dfas[grammar.symbol2number[name]] = (states, self._make_first(grammar, name))
c.start = c.symbol2number[self.startsymbol] grammar.start = grammar.symbol2number[self.startsymbol]
return c return grammar
def _make_first(self, c, name): def _make_first(self, grammar, name):
rawfirst = self.first[name] rawfirst = self.first[name]
first = {} first = {}
for label in rawfirst: for label in rawfirst:
ilabel = self._make_label(c, label) ilabel = self._make_label(grammar, label)
##assert ilabel not in first # XXX failed on <> ... != ##assert ilabel not in first # XXX failed on <> ... !=
first[ilabel] = 1 first[ilabel] = 1
return first return first
def _make_label(self, c, label): def _make_label(self, grammar, label):
# XXX Maybe this should be a method on a subclass of converter? # XXX Maybe this should be a method on a subclass of converter?
ilabel = len(c.labels) ilabel = len(grammar.labels)
if label[0].isalpha(): if label[0].isalpha():
# Either a symbol name or a named token # Either a symbol name or a named token
if label in c.symbol2number: if label in grammar.symbol2number:
# A symbol name (a non-terminal) # A symbol name (a non-terminal)
if label in c.symbol2label: if label in grammar.symbol2label:
return c.symbol2label[label] return grammar.symbol2label[label]
else: else:
c.labels.append((c.symbol2number[label], None)) grammar.labels.append((grammar.symbol2number[label], None))
c.symbol2label[label] = ilabel grammar.symbol2label[label] = ilabel
c.label2symbol[ilabel] = label grammar.label2symbol[ilabel] = label
return ilabel return ilabel
else: else:
# A named token (NAME, NUMBER, STRING) # A named token (NAME, NUMBER, STRING)
itoken = getattr(self._token_namespace, label, None) itoken = getattr(self._token_namespace, label, None)
assert isinstance(itoken, int), label assert isinstance(itoken, int), label
if itoken in c.tokens: if itoken in grammar.tokens:
return c.tokens[itoken] return grammar.tokens[itoken]
else: else:
c.labels.append((itoken, None)) grammar.labels.append((itoken, None))
c.tokens[itoken] = ilabel grammar.tokens[itoken] = ilabel
return ilabel return ilabel
else: else:
# Either a keyword or an operator # Either a keyword or an operator
@@ -89,21 +89,21 @@ class ParserGenerator(object):
value = eval(label) value = eval(label)
if value[0].isalpha(): if value[0].isalpha():
# A keyword # A keyword
if value in c.keywords: if value in grammar.keywords:
return c.keywords[value] return grammar.keywords[value]
else: else:
# TODO this might be an issue?! Using token.NAME here? # TODO this might be an issue?! Using token.NAME here?
c.labels.append((token.NAME, value)) grammar.labels.append((token.NAME, value))
c.keywords[value] = ilabel grammar.keywords[value] = ilabel
return ilabel return ilabel
else: else:
# An operator (any non-numeric token) # An operator (any non-numeric token)
itoken = self._token_namespace.generate_token_id(value) itoken = self._token_namespace.generate_token_id(value)
if itoken in c.tokens: if itoken in grammar.tokens:
return c.tokens[itoken] return grammar.tokens[itoken]
else: else:
c.labels.append((itoken, None)) grammar.labels.append((itoken, None))
c.tokens[itoken] = ilabel grammar.tokens[itoken] = ilabel
return ilabel return ilabel
def _addfirstsets(self): def _addfirstsets(self):