# Bison Regressions. -*- Autotest -*-
-# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2004, 2005 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
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
AT_BANNER([[Regression tests.]])
AT_CLEANUP
+AT_SETUP([Invalid inputs with {}])
+
+AT_DATA([input.y],
+[[
+%destructor
+%initial-action
+%lex-param
+%parse-param
+%printer
+%union
+]])
+
+AT_CHECK([bison input.y], [1], [],
+[[input.y:3.1: missing `{' in "%destructor {...}"
+input.y:4.1: missing `{' in "%initial-action {...}"
+input.y:4.1: syntax error, unexpected %initial-action {...}, expecting string or identifier
+]])
+
+AT_CLEANUP
+
+
## ------------------- ##
## Token definitions. ##
# Bison managed, when fed with `%token 'f' "f"' to #define 'f'!
AT_DATA_GRAMMAR([input.y],
[%{
+#include <stdio.h>
void yyerror (const char *s);
int yylex (void);
%}
-[%token MYEOF 0 "end of file"
+[%error-verbose
+%token MYEOF 0 "end of file"
%token 'a' "a"
-%token b "b"
-%token c 'c'
-%token 'd' d
+%token B_TOKEN "b"
+%token C_TOKEN 'c'
+%token 'd' D_TOKEN
+%token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
%%
-exp: "a";
+exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!";
+%%
+void
+yyerror (char const *s)
+{
+ fprintf (stderr, "%s\n", s);
+}
+
+int
+yylex (void)
+{
+ return SPECIAL;
+}
+
+int
+main (void)
+{
+ return yyparse ();
+}
]])
AT_CHECK([bison -o input.c input.y])
-AT_COMPILE([input.o], [-c input.c])
+AT_COMPILE([input])
+AT_DATA([experr],
+[[syntax error, unexpected "\\'?\"\a\b\f\n\r\t\v\001\201\001\201?\?!", expecting a
+]])
+AT_PARSER_CHECK([./input], 1, [], [experr])
AT_CLEANUP
#
# It used to be wrong on yydefact only:
#
-# static const short yydefact[] =
+# static const short int yydefact[] =
# {
# - 2, 0, 1, 0, 0, 2, 3, 2, 5, 4,
# + 2, 0, 1, 0, 0, 0, 3, 2, 5, 4,
"$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"",
"\"else\"", "$accept", "statement", "struct_stat", "if", "else", 0
};
-static const unsigned short yytoknum[] =
+static const unsigned short int yytoknum[] =
{
0, 256, 257, 258, 259, 260, 261
};
m4_define([_AT_DATA_DANCER_Y],
[AT_DATA_GRAMMAR([dancer.y],
[%{
-AT_LALR1_CC_IF(
-[static int yylex (int *lval);],
+static int yylex (AT_LALR1_CC_IF([int *], [void]));
+AT_LALR1_CC_IF([],
[#include <stdio.h>
-static void yyerror (const char *s);
-static int yylex ();])
+static void yyerror (const char *);])
%}
$1
%token ARROW INVALID NUMBER STRING DATA
;
%%
AT_LALR1_CC_IF(
-[/* Currently, print_ is required in C++. */
-void
-yy::Parser::print_ ()
-{
-}
-
-/* A C++ error reporting function. */
+[/* A C++ error reporting function. */
void
-yy::Parser::error_ ()
+yy::parser::error (const location&, const std::string& m)
{
- std::cerr << message << std::endl;
+ std::cerr << m << std::endl;
}
int
-yyparse (void)
+yyparse ()
{
- yy::Parser parser (!!YYDEBUG);
+ yy::parser parser;
+ parser.set_debug_level (!!YYDEBUG);
return parser.parse ();
}
],
}])
static int
-yylex (AT_LALR1_CC_IF([int *lval]))
+yylex (AT_LALR1_CC_IF([int *lval], [void]))
[{
static int toknum = 0;
int tokens[] =
{
':', -1
};
+ ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[
return tokens[toknum++];
}]
AT_BISON_OPTION_PUSHDEFS([$1])
_AT_DATA_DANCER_Y([$1])
AT_CHECK([bison -o dancer.c dancer.y])
-AT_LALR1_CC_IF([AT_COMPILE_CXX([dancer])],
- [AT_COMPILE([dancer])])
+AT_LALR1_CC_IF(
+ [AT_CHECK([bison -o dancer.cc dancer.y])
+ AT_COMPILE_CXX([dancer])],
+ [AT_CHECK([bison -o dancer.c dancer.y])
+ AT_COMPILE([dancer])])
AT_PARSER_CHECK([./dancer], 1, [],
[syntax error, unexpected ':'
])