section,
production,
character_to_symbol,
- name_to_symbol
+ name_to_symbol,
+ last_action
):
raise NotImplementedException
- def add_to_symbols(self, pyacc, last_action, symbols):
+ def add_to_symbols(self, pyacc, production, last_action, symbols):
return last_action
class Action(Item):
section,
production,
character_to_symbol,
- name_to_symbol
+ name_to_symbol,
+ last_action
):
- pass
- def add_to_symbols(self, pyacc, last_action, symbols):
- assert last_action is None
+ production.n_symbols += int(last_action)
+ return True
+ def add_to_symbols(self, pyacc, production, last_action, symbols):
+ assert last_action is None # no mid-rule actions for now
+ for i in self[0]:
+ if isinstance(i, PYACC.Text.StackLocation):
+ i.offset = -production.n_symbols
+ elif isinstance(i, PYACC.Text.StackReference):
+ i.offset = -production.n_symbols
return self[0]
class DPrec(Item):
section,
production,
character_to_symbol,
- name_to_symbol
+ name_to_symbol,
+ last_action
):
self[0].post_process(
pyacc,
)
assert production.precedence_terminal == -1
production.precedence_terminal = self[0].terminal
+ return last_action
class SymbolRef(Item):
# GENERATE ELEMENT(int symbol) BEGIN
section,
production,
character_to_symbol,
- name_to_symbol
+ name_to_symbol,
+ last_action
):
+ production.n_symbols += int(last_action) + 1
if isinstance(self[0], PYACC.Char):
character = ord(self[0][0].get_text())
assert character != 0 # would conflict with YYEOF
assert False
if self.symbol >= 0:
production.last_terminal = self.symbol
- def add_to_symbols(self, pyacc, last_action, symbols):
- assert last_action is None
+ return False
+ def add_to_symbols(self, pyacc, production, last_action, symbols):
+ assert last_action is None # no mid-rule actions for now
symbols.append(
(pyacc.terminals[self.symbol].character_set, [])
if self.symbol >= 0 else
)
return None
- # GENERATE ELEMENT(int lhs_nonterminal, int last_terminal, int precedence_terminal) BEGIN
+ # GENERATE ELEMENT(int lhs_nonterminal, int n_symbols, int last_terminal, int precedence_terminal) BEGIN
def __init__(
self,
tag = 'PYACC_Production',
text = '',
children = [],
lhs_nonterminal = -1,
+ n_symbols = -1,
last_terminal = -1,
precedence_terminal = -1
):
if isinstance(lhs_nonterminal, str) else
lhs_nonterminal
)
+ self.n_symbols = (
+ element.deserialize_int(n_symbols)
+ if isinstance(n_symbols, str) else
+ n_symbols
+ )
self.last_terminal = (
element.deserialize_int(last_terminal)
if isinstance(last_terminal, str) else
def serialize(self, ref_list):
element.Element.serialize(self, ref_list)
self.set('lhs_nonterminal', element.serialize_int(self.lhs_nonterminal))
+ self.set('n_symbols', element.serialize_int(self.n_symbols))
self.set('last_terminal', element.serialize_int(self.last_terminal))
self.set('precedence_terminal', element.serialize_int(self.precedence_terminal))
def deserialize(self, ref_list):
element.Element.deserialize(self, ref_list)
self.lhs_nonterminal = element.deserialize_int(self.get('lhs_nonterminal', '-1'))
+ self.n_symbols = element.deserialize_int(self.get('n_symbols', '-1'))
self.last_terminal = element.deserialize_int(self.get('last_terminal', '-1'))
self.precedence_terminal = element.deserialize_int(self.get('precedence_terminal', '-1'))
def copy(self, factory = None):
Production if factory is None else factory
)
result.lhs_nonterminal = self.lhs_nonterminal
+ result.n_symbols = self.n_symbols
result.last_terminal = self.last_terminal
result.precedence_terminal = self.precedence_terminal
return result
params.append(
'lhs_nonterminal = {0:s}'.format(repr(self.lhs_nonterminal))
)
+ if self.n_symbols != -1:
+ params.append(
+ 'n_symbols = {0:s}'.format(repr(self.n_symbols))
+ )
if self.last_terminal != -1:
params.append(
'last_terminal = {0:s}'.format(repr(self.last_terminal))
):
self.lhs_nonterminal = lhs_nonterminal
+ self.n_symbols = 0
self.last_terminal = -1
self.precedence_terminal = -1
+ last_action = False
for i in self:
- i.post_process(
+ last_action = i.post_process(
pyacc,
section,
self,
character_to_symbol,
- name_to_symbol
+ name_to_symbol,
+ last_action
)
character_set = pyacc.nonterminals[
symbols = []
lookaheads = []
for i in self:
- last_action = i.add_to_symbols(pyacc, last_action, symbols)
+ last_action = i.add_to_symbols(pyacc, self, last_action, symbols)
_lr1.productions.append(
(
# symbols (list of terminal_set, nonterminal_set)
return tag
class Text(element.Element):
- class Escape(element.Element):
+ class Item(element.Element):
+ # GENERATE ELEMENT() BEGIN
+ def __init__(
+ self,
+ tag = 'PYACC_Text_Item',
+ attrib = {},
+ text = '',
+ children = []
+ ):
+ element.Element.__init__(
+ self,
+ tag,
+ attrib,
+ text,
+ children
+ )
+ def copy(self, factory = None):
+ result = element.Element.copy(
+ self,
+ Item if factory is None else factory
+ )
+ return result
+ def __repr__(self):
+ params = []
+ self.repr_serialize(params)
+ return 'ast.PYACC.Text.Item({0:s})'.format(', '.join(params))
+ # GENERATE END
+ def get_text(self):
+ raise NotImplementedException
+
+ class Escape(Item):
# GENERATE ELEMENT(int character) BEGIN
def __init__(
self,
children = [],
character = -1
):
- element.Element.__init__(
+ PYACC.Text.Item.__init__(
self,
tag,
attrib,
character
)
def serialize(self, ref_list):
- element.Element.serialize(self, ref_list)
+ PYACC.Text.Item.serialize(self, ref_list)
self.set('character', element.serialize_int(self.character))
def deserialize(self, ref_list):
- element.Element.deserialize(self, ref_list)
+ PYACC.Text.Item.deserialize(self, ref_list)
self.character = element.deserialize_int(self.get('character', '-1'))
def copy(self, factory = None):
- result = element.Element.copy(
+ result = PYACC.Text.Item.copy(
self,
Escape if factory is None else factory
)
result.character = self.character
return result
def repr_serialize(self, params):
- element.Element.repr_serialize(self, params)
+ PYACC.Text.Item.repr_serialize(self, params)
if self.character != -1:
params.append(
'character = {0:s}'.format(repr(self.character))
self.repr_serialize(params)
return 'ast.PYACC.Text.Escape({0:s})'.format(', '.join(params))
# GENERATE END
+ def get_text(self):
+ return chr(self.character)
- class StackLocation(element.Element):
- # GENERATE ELEMENT(int index) BEGIN
+ class StackLocation(Item):
+ # GENERATE ELEMENT(int offset, int index) BEGIN
def __init__(
self,
tag = 'PYACC_Text_StackLocation',
attrib = {},
text = '',
children = [],
+ offset = -1,
index = -1
):
- element.Element.__init__(
+ PYACC.Text.Item.__init__(
self,
tag,
attrib,
text,
children
)
+ self.offset = (
+ element.deserialize_int(offset)
+ if isinstance(offset, str) else
+ offset
+ )
self.index = (
element.deserialize_int(index)
if isinstance(index, str) else
index
)
def serialize(self, ref_list):
- element.Element.serialize(self, ref_list)
+ PYACC.Text.Item.serialize(self, ref_list)
+ self.set('offset', element.serialize_int(self.offset))
self.set('index', element.serialize_int(self.index))
def deserialize(self, ref_list):
- element.Element.deserialize(self, ref_list)
+ PYACC.Text.Item.deserialize(self, ref_list)
+ self.offset = element.deserialize_int(self.get('offset', '-1'))
self.index = element.deserialize_int(self.get('index', '-1'))
def copy(self, factory = None):
- result = element.Element.copy(
+ result = PYACC.Text.Item.copy(
self,
StackLocation if factory is None else factory
)
+ result.offset = self.offset
result.index = self.index
return result
def repr_serialize(self, params):
- element.Element.repr_serialize(self, params)
+ PYACC.Text.Item.repr_serialize(self, params)
+ if self.offset != -1:
+ params.append(
+ 'offset = {0:s}'.format(repr(self.offset))
+ )
if self.index != -1:
params.append(
'index = {0:s}'.format(repr(self.index))
return 'ast.PYACC.Text.StackLocation({0:s})'.format(', '.join(params))
# GENERATE END
- class StackReference(element.Element):
- # GENERATE ELEMENT(int index) BEGIN
+ class StackReference(Item):
+ # GENERATE ELEMENT(int offset, int index) BEGIN
def __init__(
self,
tag = 'PYACC_Text_StackReference',
attrib = {},
text = '',
children = [],
+ offset = -1,
index = -1
):
- element.Element.__init__(
+ PYACC.Text.Item.__init__(
self,
tag,
attrib,
text,
children
)
+ self.offset = (
+ element.deserialize_int(offset)
+ if isinstance(offset, str) else
+ offset
+ )
self.index = (
element.deserialize_int(index)
if isinstance(index, str) else
index
)
def serialize(self, ref_list):
- element.Element.serialize(self, ref_list)
+ PYACC.Text.Item.serialize(self, ref_list)
+ self.set('offset', element.serialize_int(self.offset))
self.set('index', element.serialize_int(self.index))
def deserialize(self, ref_list):
- element.Element.deserialize(self, ref_list)
+ PYACC.Text.Item.deserialize(self, ref_list)
+ self.offset = element.deserialize_int(self.get('offset', '-1'))
self.index = element.deserialize_int(self.get('index', '-1'))
def copy(self, factory = None):
- result = element.Element.copy(
+ result = PYACC.Text.Item.copy(
self,
StackReference if factory is None else factory
)
+ result.offset = self.offset
result.index = self.index
return result
def repr_serialize(self, params):
- element.Element.repr_serialize(self, params)
+ PYACC.Text.Item.repr_serialize(self, params)
+ if self.offset != -1:
+ params.append(
+ 'offset = {0:s}'.format(repr(self.offset))
+ )
if self.index != -1:
params.append(
'index = {0:s}'.format(repr(self.index))
self.repr_serialize(params)
return 'ast.PYACC.Text.StackReference({0:s})'.format(', '.join(params))
# GENERATE END
+ def get_text(self):
+ return '(yyvsp[{0:d}])'.format(self.offset + self.index)
- class ValueLocation(element.Element):
+ class ValueLocation(Item):
# GENERATE ELEMENT() BEGIN
def __init__(
self,
text = '',
children = []
):
- element.Element.__init__(
+ PYACC.Text.Item.__init__(
self,
tag,
attrib,
children
)
def copy(self, factory = None):
- result = element.Element.copy(
+ result = PYACC.Text.Item.copy(
self,
ValueLocation if factory is None else factory
)
return 'ast.PYACC.Text.ValueLocation({0:s})'.format(', '.join(params))
# GENERATE END
- class ValueReference(element.Element):
+ class ValueReference(Item):
# GENERATE ELEMENT() BEGIN
def __init__(
self,
text = '',
children = []
):
- element.Element.__init__(
+ PYACC.Text.Item.__init__(
self,
tag,
attrib,
children
)
def copy(self, factory = None):
- result = element.Element.copy(
+ result = PYACC.Text.Item.copy(
self,
ValueReference if factory is None else factory
)
self.repr_serialize(params)
return 'ast.PYACC.Text.ValueReference({0:s})'.format(', '.join(params))
# GENERATE END
+ def get_text(self):
+ return '(yyval)'
# GENERATE ELEMENT() BEGIN
def __init__(
self.repr_serialize(params)
return 'ast.PYACC.Text({0:s})'.format(', '.join(params))
# GENERATE END
- def get_text(self, len_production = 0):
+ def get_text(self):
return ''.join(
[
j
for i in range(len(self))
- for j in [
- element.get_text(self, i),
- (
- '(yyvsp[{0:d}])'.format(self[i].index - len_production)
- if isinstance(self[i], PYACC.Text.StackReference) else
- '(yyval)'
- if isinstance(self[i], PYACC.Text.ValueReference) else
- chr(self[i].character)
- )
- ]
+ for j in [element.get_text(self, i), self[i].get_text()]
] +
[element.get_text(self, len(self))]
)
'PYACC_TerminalRef': PYACC.TerminalRef,
'PYACC_NonterminalRef': PYACC.NonterminalRef,
'PYACC_Text': PYACC.Text,
+ 'PYACC_Text_Item': PYACC.Text.Item,
'PYACC_Text_Escape': PYACC.Text.Escape,
'PYACC_Text_StackLocation': PYACC.Text.StackLocation,
'PYACC_Text_StackReference': PYACC.Text.StackReference,