|
@@ -246,13 +246,14 @@ class LALR_Analyzer(GrammarAnalyzer): |
|
|
|
|
|
|
|
|
def compute_lalr1_states(self): |
|
|
def compute_lalr1_states(self): |
|
|
m = {} |
|
|
m = {} |
|
|
|
|
|
reduce_reduce = [] |
|
|
for state in self.lr0_states: |
|
|
for state in self.lr0_states: |
|
|
actions = {} |
|
|
actions = {} |
|
|
for la, next_state in state.transitions.items(): |
|
|
for la, next_state in state.transitions.items(): |
|
|
actions[la] = (Shift, next_state.closure) |
|
|
actions[la] = (Shift, next_state.closure) |
|
|
for la, rules in state.lookaheads.items(): |
|
|
for la, rules in state.lookaheads.items(): |
|
|
if len(rules) > 1: |
|
|
if len(rules) > 1: |
|
|
raise GrammarError('Reduce/Reduce collision in %s between the following rules: %s' % (la, ''.join([ '\n\t\t- ' + str(r) for r in rules ]))) |
|
|
|
|
|
|
|
|
reduce_reduce.append((la, rules)) |
|
|
if la in actions: |
|
|
if la in actions: |
|
|
if self.debug: |
|
|
if self.debug: |
|
|
logger.warning('Shift/Reduce conflict for terminal %s: (resolving as shift)', la.name) |
|
|
logger.warning('Shift/Reduce conflict for terminal %s: (resolving as shift)', la.name) |
|
@@ -261,6 +262,12 @@ class LALR_Analyzer(GrammarAnalyzer): |
|
|
actions[la] = (Reduce, list(rules)[0]) |
|
|
actions[la] = (Reduce, list(rules)[0]) |
|
|
m[state] = { k.name: v for k, v in actions.items() } |
|
|
m[state] = { k.name: v for k, v in actions.items() } |
|
|
|
|
|
|
|
|
|
|
|
if reduce_reduce: |
|
|
|
|
|
msgs = [ 'Reduce/Reduce collision in %s between the following rules: %s' |
|
|
|
|
|
% (la, ''.join([ '\n\t\t- ' + str(r) for r in rules ])) |
|
|
|
|
|
for la, rules in reduce_reduce] |
|
|
|
|
|
raise GrammarError('\n\n'.join(msgs)) |
|
|
|
|
|
|
|
|
states = { k.closure: v for k, v in m.items() } |
|
|
states = { k.closure: v for k, v in m.items() } |
|
|
|
|
|
|
|
|
# compute end states |
|
|
# compute end states |
|
|