]> git.saurik.com Git - bison.git/commitdiff
lalr1.cc: don't discard non-existent lookahead on syntax error.
authorJoel E. Denny <jdenny@clemson.edu>
Sat, 19 Dec 2009 04:57:18 +0000 (23:57 -0500)
committerJoel E. Denny <jdenny@clemson.edu>
Sat, 19 Dec 2009 04:58:14 +0000 (23:58 -0500)
* data/lalr1.cc (parser::parse): Check yyempty first.
* tests/c++.at (Syntax error discarding no lookahead): New test
group.

ChangeLog
data/lalr1.cc
tests/c++.at

index 2926da7940d66cea784a3a2889115c7baef8f81a..1c15cc5e3e7fe9bbffc2a1764b996a7a08a2c6ab 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-12-18  Joel E. Denny  <jdenny@clemson.edu>
+
+       lalr1.cc: don't discard non-existent lookahead on syntax error.
+       * data/lalr1.cc (parser::parse): Check yyempty first.
+       * tests/c++.at (Syntax error discarding no lookahead): New test
+       group.
+
 2009-12-17  Joel E. Denny  <jdenny@clemson.edu>
 
        Code cleanup.
index 9e0d522bd44557a9f63da6eff2ca076326e2be48..6174e824edeb507beb4d33f60ae74cbfbd6d7367 100644 (file)
@@ -876,7 +876,7 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[
         /* Return failure if at end of input.  */
         if (yyla.type == yyeof_)
           YYABORT;
-        else
+        else if (!yyempty)
           {
             yy_destroy_ ("Error: discarding", yyla);
             yyempty = true;
index beffb1c66d81e3f03a967f27b34989f90c1f890a..ce64d6d6bd158529f97e16b0aea1c60cd998aa9d 100644 (file)
@@ -286,8 +286,6 @@ AT_CHECK_DOXYGEN([Public])
 AT_CHECK_DOXYGEN([Private])
 
 
-
-
 ## ------------ ##
 ## Namespaces.  ##
 ## ------------ ##
@@ -369,3 +367,80 @@ AT_CHECK_NAMESPACE([[foo[3]::bar::baz]], [[-]])
 AT_CHECK_NAMESPACE([[foo::bar,baz]], [[-]])
 AT_CHECK_NAMESPACE([[foo::bar::(baz /* Pacify Emacs ) */]], [[-]])
 AT_CLEANUP
+
+
+## -------------------------------------- ##
+## Syntax error discarding no lookahead.  ##
+## -------------------------------------- ##
+
+# After a syntax error, lalr1.cc used to not check whether there
+# actually is a lookahead before discarding the lookahead.  As a result,
+# it mistakenly invoked the destructor for the previous lookahead.
+
+AT_SETUP([[Syntax error discarding no lookahead]])
+
+AT_DATA_GRAMMAR([[input.yy]],
+[[%skeleton "lalr1.cc"
+
+%code {
+  #include <string>
+  int yylex (yy::parser::semantic_type *, yy::location *);
+  #define USE(Args)
+}
+
+%defines
+%locations
+%define parse.error verbose
+
+%nonassoc 'a' ;
+
+%destructor {
+  std::cerr << "Discarding 'a'." << std::endl;
+} 'a'
+
+%%
+
+start: error-reduce consistent-error 'a' { USE ($3); };
+
+error-reduce:
+  'a' 'a' consistent-error 'a' { USE (($1, $2, $4)); }
+| 'a' error { std::cerr << "Reducing 'a'." << std::endl; USE ($1); }
+;
+
+consistent-error:
+  'a'
+| /*empty*/ %prec 'a'
+;
+
+%%
+
+int
+yylex (yy::parser::semantic_type *, yy::location *)
+{
+  static char const *input = "aa";
+  return *input++;
+}
+
+void
+yy::parser::error (const location_type &, const std::string &m)
+{
+  std::cerr << m << std::endl;
+}
+
+int
+main (void)
+{
+  yy::parser parser;
+  return parser.parse ();
+}
+]])
+AT_BISON_CHECK([[-o input.cc input.yy]], [[0]], [[]], [[ignore-nolog]])
+AT_COMPILE_CXX([[input]])
+# This used to print "Discarding 'a'." again at the end.
+AT_PARSER_CHECK([[./input]], [[1]], [[]],
+[[syntax error
+Discarding 'a'.
+Reducing 'a'.
+]])
+
+AT_CLEANUP