diff --git a/src/ply/yacc.py b/src/ply/yacc.py index 6528796..f1d584b 100644 --- a/src/ply/yacc.py +++ b/src/ply/yacc.py @@ -255,9 +255,17 @@ def restart(self): def set_defaulted_states(self): self.defaulted_states = {} for state, actions in self.action.items(): + if not actions: + continue rules = list(actions.values()) - if len(rules) == 1 and rules[0] < 0: - self.defaulted_states[state] = rules[0] + first_rule = rules[0] + if first_rule < 0: + if len(rules) == 1: + self.defaulted_states[state] = first_rule + else: + all_rules = set(rules) + if len(all_rules) == 1: + self.defaulted_states[state] = first_rule def disable_defaulted_states(self): self.defaulted_states = {} @@ -324,7 +332,7 @@ def parse(self, input=None, lexer=None, debug=False, tracking=False): if debug: debug.debug('State : %s', state) - if state not in defaulted_states: + if state not in defaulted_states or errorcount>0: if not lookahead: if not lookaheadstack: lookahead = get_token() # Get the next token diff --git a/tests/yacc_error5.py b/tests/yacc_error5.py index 5d4b683..c59da56 100644 --- a/tests/yacc_error5.py +++ b/tests/yacc_error5.py @@ -21,12 +21,6 @@ def p_statement_assign(t): 'statement : NAME EQUALS expression' names[t[1]] = t[3] -def p_statement_assign_error(t): - 'statement : NAME EQUALS error' - line_start, line_end = t.linespan(3) - pos_start, pos_end = t.lexspan(3) - print("Assignment Error at %d:%d to %d:%d" % (line_start,pos_start,line_end,pos_end)) - def p_statement_expr(t): 'statement : expression' print(t[1])