]> git.saurik.com Git - bison.git/blobdiff - tests/conflicts.at
Provide an additional sub-message for clarity.
[bison.git] / tests / conflicts.at
index 866b94413d9a82475e5a382a21c74c00de614272..26ec08d4688403ef6ee39ef4bdc38321d0d17890 100644 (file)
@@ -1,6 +1,7 @@
 # Exercising Bison on conflicts.                         -*- Autotest -*-
 
-# Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009 Free Software
+# Foundation, Inc.
 
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -98,20 +99,40 @@ AT_BISON_CHECK([-o input.c input.y])
 AT_COMPILE([input])
 
 AT_PARSER_CHECK([./input '0<0'])
-# FIXME: This is an actual bug, but a new one, in the sense that
-# no one has ever spotted it!  The messages are *wrong*: there should
-# be nothing there, it should be expected eof.
 AT_PARSER_CHECK([./input '0<0<0'], [1], [],
-         [syntax error, unexpected '<', expecting '<' or '>'
+         [syntax error, unexpected '<'
 ])
 
 AT_PARSER_CHECK([./input '0>0'])
 AT_PARSER_CHECK([./input '0>0>0'], [1], [],
-         [syntax error, unexpected '>', expecting '<' or '>'
+         [syntax error, unexpected '>'
 ])
 
 AT_PARSER_CHECK([./input '0<0>0'], [1], [],
-         [syntax error, unexpected '>', expecting '<' or '>'
+         [syntax error, unexpected '>'
+])
+
+# We must disable default reductions in inconsistent states in order to
+# have an explicit list of all expected tokens.  (However, unless we use
+# canonical LR, lookahead sets are merged for different left contexts,
+# so it is still possible to have extra incorrect tokens in the expected
+# list.  That just doesn't happen to be a problem for this test case.)
+
+AT_BISON_CHECK([-Dlr.default-reductions=consistent -o input.c input.y])
+AT_COMPILE([input])
+
+AT_PARSER_CHECK([./input '0<0'])
+AT_PARSER_CHECK([./input '0<0<0'], [1], [],
+         [syntax error, unexpected '<', expecting $end
+])
+
+AT_PARSER_CHECK([./input '0>0'])
+AT_PARSER_CHECK([./input '0>0>0'], [1], [],
+         [syntax error, unexpected '>', expecting $end
+])
+
+AT_PARSER_CHECK([./input '0<0>0'], [1], [],
+         [syntax error, unexpected '>', expecting $end
 ])
 
 AT_CLEANUP
@@ -326,6 +347,62 @@ state 5
 AT_CLEANUP
 
 
+## ---------------------- ##
+## %precedence suffices.  ##
+## ---------------------- ##
+
+AT_SETUP([%precedence suffices])
+
+AT_DATA([input.y],
+[[%precedence "then"
+%precedence "else"
+%%
+stmt:
+  "if" cond "then" stmt
+| "if" cond "then" stmt "else" stmt
+| "stmt"
+;
+
+cond:
+  "exp"
+;
+]])
+
+AT_BISON_CHECK([-o input.c input.y])
+
+AT_CLEANUP
+
+
+## ------------------------------ ##
+## %precedence does not suffice.  ##
+## ------------------------------ ##
+
+AT_SETUP([%precedence does not suffice])
+
+AT_DATA([input.y],
+[[%precedence "then"
+%precedence "else"
+%%
+stmt:
+  "if" cond "then" stmt
+| "if" cond "then" stmt "else" stmt
+| "stmt"
+;
+
+cond:
+  "exp"
+| cond "then" cond
+;
+]])
+
+AT_BISON_CHECK([-o input.c input.y], 0, [],
+[[input.y: conflicts: 1 shift/reduce
+input.y:12.3-18: warning: rule useless in parser due to conflicts: cond: cond "then" cond
+]])
+
+AT_CLEANUP
+
+
 ## -------------------------------- ##
 ## Defaulted Conflicted Reduction.  ##
 ## -------------------------------- ##
@@ -523,9 +600,9 @@ input.y: expected 2 shift/reduce conflicts
 AT_CLEANUP
 
 
-## ------------------------------ ##
-## %expect with reduce conflicts  ##
-## ------------------------------ ##
+## ------------------------------- ##
+## %expect with reduce conflicts.  ##
+## ------------------------------- ##
 
 AT_SETUP([%expect with reduce conflicts])
 
@@ -543,9 +620,26 @@ input.y: expected 0 reduce/reduce conflicts
 AT_CLEANUP
 
 
-## ------------------------------- ##
-## %no-default-prec without %prec  ##
-## ------------------------------- ##
+## ------------------------- ##
+## %prec with user strings.  ##
+## ------------------------- ##
+
+AT_SETUP([%prec with user string])
+
+AT_DATA([[input.y]],
+[[%%
+exp:
+  "foo" %prec "foo"
+;
+]])
+
+AT_BISON_CHECK([-o input.c input.y])
+AT_CLEANUP
+
+
+## -------------------------------- ##
+## %no-default-prec without %prec.  ##
+## -------------------------------- ##
 
 AT_SETUP([%no-default-prec without %prec])
 
@@ -569,9 +663,9 @@ AT_BISON_CHECK([-o input.c input.y], 0, [],
 AT_CLEANUP
 
 
-## ---------------------------- ##
-## %no-default-prec with %prec  ##
-## ---------------------------- ##
+## ----------------------------- ##
+## %no-default-prec with %prec.  ##
+## ----------------------------- ##
 
 AT_SETUP([%no-default-prec with %prec])
 
@@ -593,9 +687,9 @@ AT_BISON_CHECK([-o input.c input.y])
 AT_CLEANUP
 
 
-## ---------------- ##
-## %default-prec    ##
-## ---------------- ##
+## --------------- ##
+## %default-prec.  ##
+## --------------- ##
 
 AT_SETUP([%default-prec])
 
@@ -813,7 +907,7 @@ state 7
 ]])
 
 AT_DATA([[input-keep.y]],
-[[%define lr.keep_unreachable_states
+[[%define lr.keep-unreachable-states
 ]])
 AT_CHECK([[cat input.y >> input-keep.y]])
 
@@ -878,7 +972,7 @@ AT_CHECK([[cat input.output | sed -n '/^state 0$/,/^state 1$/p']], 0,
    13 empty_c3: .  ['c']
 
     'b'  shift, and go to state 1
+
     'c'       reduce using rule 13 (empty_c3)
     $default  reduce using rule 9 (empty_a)