mirror of
https://github.com/davidhalter/parso.git
synced 2026-08-12 19:11:34 +08:00
In pgen now everything is named grammar and not c
This commit is contained in:
+32
-32
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user