X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/88c7874756082c43188e696020fab47bac7c53e9..5860cc8c1c8b67d7af455f7f0fe9e9e1464366b3:/tests/regression.at?ds=sidebyside diff --git a/tests/regression.at b/tests/regression.at index 3b3272f3..a4b20de5 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -1,6 +1,6 @@ # Bison Regressions. -*- Autotest -*- -# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software +# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software # Foundation, Inc. # This program is free software: you can redistribute it and/or modify @@ -39,7 +39,7 @@ int yylex (void); program: 'x'; ]]) -AT_CHECK([bison -o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) AT_COMPILE([input.o], [-DYYDEBUG -c input.c]) @@ -67,7 +67,7 @@ typedef union { char const *val; } YYSTYPE; program: { $$ = ""; }; ]]) -AT_CHECK([bison -o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) AT_CLEANUP @@ -105,7 +105,7 @@ exp: MY_TOKEN; %% ]]) -AT_CHECK([bison -y -o input.c input.y]) +AT_BISON_CHECK([-y -o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) AT_CLEANUP @@ -148,7 +148,7 @@ exp: MY_TOKEN; %% ]]) -AT_CHECK([bison -o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) AT_CLEANUP @@ -170,7 +170,7 @@ exp: { tests = {{{{{{{{{{}}}}}}}}}}; }; %% ]]) -AT_CHECK([bison -v -o input.c input.y]) +AT_BISON_CHECK([-v -o input.c input.y]) AT_CHECK([grep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c], 0, [ignore]) @@ -197,7 +197,7 @@ exp: '(' exp ')' | NUM ; %% ]]) -AT_CHECK([bison -v -o input.c input.y], 0, [], +AT_BISON_CHECK([-v -o input.c input.y], 0, [], [[input.y:6.8-14: warning: symbol `"<="' used more than once as a literal string ]]) @@ -242,7 +242,7 @@ expr: }; ]]) -AT_CHECK([bison -o input.c -v input.y]) +AT_BISON_CHECK([-o input.c -v input.y]) # Check the contents of the report. AT_CHECK([cat input.output], [], @@ -364,7 +364,7 @@ exp: ; %% ]]) -AT_CHECK([bison -v -o input.c input.y]) +AT_BISON_CHECK([-v -o input.c input.y]) AT_CLEANUP @@ -387,7 +387,7 @@ default: 'a' } %{ ]]) -AT_CHECK([bison input.y], [1], [], +AT_BISON_CHECK([input.y], [1], [], [[input.y:2.1: invalid character: `?' input.y:3.14: invalid character: `}' input.y:4.1: invalid character: `%' @@ -414,7 +414,7 @@ AT_DATA([input.y], %union ]]) -AT_CHECK([bison input.y], [1], [], +AT_BISON_CHECK([input.y], [1], [], [[input.y:3.1-15: syntax error, unexpected %initial-action, expecting {...} ]]) @@ -444,6 +444,7 @@ int yylex (void); %token C_TOKEN 'c' %token 'd' D_TOKEN %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!" +%token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!" %% exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"; %% @@ -469,10 +470,22 @@ main (void) } ]]) -AT_CHECK([bison -o input.c input.y]) +# Checking the warning message guarantees that the trigraph "??!" isn't +# unnecessarily escaped here even though it would need to be if encoded in a +# C-string literal. Also notice that unnecessary escaping, such as "\?", from +# the user specification is eliminated. +AT_BISON_CHECK([-o input.c input.y], [[0]], [[]], +[[input.y:22.8-14: warning: symbol SPECIAL redeclared +input.y:22.8-63: warning: symbol `"\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!"' used more than once as a literal string +]]) AT_COMPILE([input]) + +# Checking the error message here guarantees that yytname, which does contain +# C-string literals, does have the trigraph escaped correctly. Thus, the +# symbol name reported by the parser is exactly the same as that reported by +# Bison itself. AT_DATA([experr], -[[syntax error, unexpected "\\'?\"\a\b\f\n\r\t\v\001\201\001\201?\?!", expecting a +[[syntax error, unexpected "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!", expecting a ]]) AT_PARSER_CHECK([./input], 1, [], [experr]) AT_CLEANUP @@ -500,7 +513,7 @@ exp: ]]) # Pacify font-lock-mode: " -AT_CHECK([bison -o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) AT_CLEANUP @@ -540,7 +553,7 @@ CONST_DEC: %% ]]) -AT_CHECK([bison -v input.y]) +AT_BISON_CHECK([-v input.y]) AT_CHECK([cat input.output], 0, [[Grammar @@ -705,7 +718,7 @@ else: "else" statement; %% ]]) -AT_CHECK([bison -v -o input.c input.y]) +AT_BISON_CHECK([-v -o input.c input.y]) # Check only the tables. [sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c] @@ -741,15 +754,6 @@ AT_CHECK([[cat tables.c]], 0, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6 }; -static const yytype_uint8 yyprhs[] = -{ - 0, 0, 3, 5, 6, 9, 14 -}; -static const yytype_int8 yyrhs[] = -{ - 8, 0, -1, 9, -1, -1, 10, 11, -1, 3, - 4, 5, 8, -1, 6, 8, -1 -}; static const yytype_uint8 yyrline[] = { 0, 2, 2, 3, 3, 4, 5 @@ -763,32 +767,24 @@ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261 }; -static const yytype_uint8 yyr1[] = -{ - 0, 7, 8, 9, 9, 10, 11 -}; -static const yytype_uint8 yyr2[] = +static const yytype_int8 yypact[] = { - 0, 2, 1, 0, 2, 4, 2 + -2, -1, 4, -8, 0, 2, -8, -2, -8, -2, + -8, -8 }; static const yytype_uint8 yydefact[] = { 3, 0, 0, 2, 0, 0, 1, 3, 4, 3, 6, 5 }; -static const yytype_int8 yydefgoto[] = -{ - -1, 2, 3, 4, 8 -}; -static const yytype_int8 yypact[] = -{ - -2, -1, 4, -8, 0, 2, -8, -2, -8, -2, - -8, -8 -}; static const yytype_int8 yypgoto[] = { -8, -7, -8, -8, -8 }; +static const yytype_int8 yydefgoto[] = +{ + -1, 2, 3, 4, 8 +}; static const yytype_uint8 yytable[] = { 10, 1, 11, 5, 6, 0, 7, 9 @@ -802,6 +798,14 @@ static const yytype_uint8 yystos[] = 0, 3, 8, 9, 10, 4, 0, 6, 11, 5, 8, 8 }; +static const yytype_uint8 yyr1[] = +{ + 0, 7, 8, 9, 9, 10, 11 +}; +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 0, 2, 4, 2 +}; ]]) AT_CLEANUP @@ -874,7 +878,7 @@ member: STRING AT_LALR1_CC_IF( [/* A C++ error reporting function. */ void -yy::parser::error (const location&, const std::string& m) +yy::parser::error (const std::string& m) { std::cerr << m << std::endl; } @@ -925,12 +929,8 @@ m4_define([AT_CHECK_DANCER], [AT_SETUP([Dancer $1]) AT_BISON_OPTION_PUSHDEFS([$1]) _AT_DATA_DANCER_Y([$1]) -AT_CHECK([bison -o dancer.c dancer.y]) -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_BISON_CHECK([-o dancer.c dancer.y]) +AT_FULL_COMPILE([dancer]) AT_PARSER_CHECK([./dancer], 1, [], [syntax error, unexpected ':' ]) @@ -977,7 +977,7 @@ t: A | B; AT_LALR1_CC_IF( [/* A C++ error reporting function. */ void -yy::parser::error (const location&, const std::string& m) +yy::parser::error (const std::string& m) { std::cerr << m << std::endl; } @@ -1025,12 +1025,8 @@ m4_define([AT_CHECK_EXPECT2], [AT_SETUP([Expecting two tokens $1]) AT_BISON_OPTION_PUSHDEFS([$1]) _AT_DATA_EXPECT2_Y([$1]) -AT_CHECK([bison -o expect2.c expect2.y]) -AT_LALR1_CC_IF( - [AT_CHECK([bison -o expect2.cc expect2.y]) - AT_COMPILE_CXX([expect2])], - [AT_CHECK([bison -o expect2.c expect2.y]) - AT_COMPILE([expect2])]) +AT_BISON_CHECK([-o expect2.c expect2.y]) +AT_FULL_COMPILE([expect2]) AT_PARSER_CHECK([./expect2], 1, [], [syntax error, unexpected '+', expecting A or B ]) @@ -1096,7 +1092,7 @@ main (void) } ]]) -AT_CHECK([bison -t -o input.c input.y]) +AT_BISON_CHECK([-t -o input.c input.y]) AT_COMPILE([input]) AT_PARSER_CHECK([./input], 0, [[Bison would once convert this action to a midrule because of the subsequent braced code. @@ -1137,7 +1133,7 @@ start: 'a' "A" 'b'; %token 'a' "A"; ]]) -AT_CHECK([bison -t -o input.c input.y]) +AT_BISON_CHECK([-t -o input.c input.y]) AT_CLEANUP @@ -1162,7 +1158,7 @@ start: a | 'a' a 'a' ; a: 'a' ; ]]) -AT_CHECK([[bison --report=all input.y]]) +AT_BISON_CHECK([[--report=all input.y]]) AT_CHECK([[sed -n '/^state 1$/,/^state 2$/p' input.output]], [[0]], [[state 1 @@ -1181,3 +1177,64 @@ state 2 ]]) AT_CLEANUP + + + +## ---------------------------------------- ## +## Token number in precedence declaration. ## +## ---------------------------------------- ## + +AT_SETUP([[Token number in precedence declaration]]) + +# POSIX says token numbers can be declared in %left, %right, and %nonassoc, but +# we lost this in Bison 1.50. + +AT_DATA_GRAMMAR([input.y], +[[%{ + #include + void yyerror (char const *); + int yylex (void); +%} + +%error-verbose +%left TK1 1 TK2 2 "tok alias" 3 + +%% + +start: TK1 sr_conflict "tok alias" ; + +sr_conflict: + TK2 + | TK2 "tok alias" + ; + +%% + +void +yyerror (char const *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +yylex (void) +{ + static int const input[] = { 1, 2, 3, 0 }; + static int const *inputp = input; + return *inputp++; +} + +int +main (void) +{ + return yyparse (); +} +]]) + +AT_BISON_CHECK([[-o input.c input.y]], [[0]],, +[[input.y:24.5-19: warning: rule useless in parser due to conflicts: sr_conflict: TK2 "tok alias" +]]) +AT_COMPILE([[input]]) +AT_PARSER_CHECK([[./input]]) + +AT_CLEANUP