X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/f508a6a0d6ec0ea5563cf11e44a89f28a012bc10..828c373b6d032450b89f6ace178f7e114e666fd8:/tests/glr-regression.at diff --git a/tests/glr-regression.at b/tests/glr-regression.at index 32a39f25..fd822a18 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -13,8 +13,8 @@ # 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([[GLR Regression Tests]]) @@ -221,4 +221,106 @@ AT_CHECK([[echo s VARIABLE_3 t v x | ./glr-regr2a]], 0, ]], []) +AT_CLEANUP + +## ------------------------------------------------------------ ## +## Improper merging of GLR delayed action sets ## +## ------------------------------------------------------------ ## + +AT_SETUP([Improper merging of GLR delayed action sets]) + +AT_DATA_GRAMMAR([glr-regr3.y], +[[/* Regression Test: Improper merging of GLR delayed action sets. */ +/* Reported by M. Rosien */ + +%{ +#include +#include + +static int MergeRule (int x0, int x1); +static void yyerror(char const * s); + +#define RULE(x) (1 << (x)) + +%} + +%glr-parser + +%token BAD_CHAR +%token P1 P2 T1 T2 T3 T4 O1 O2 + +%% + +S : P1 T4 O2 NT6 P2 { printf ("Result: %x\n", $4); } +; + +NT1 : P1 T1 O1 T2 P2 { $$ = RULE(2); } %merge +; + +NT2 : NT1 { $$ = RULE(3); } %merge + | P1 NT1 O1 T3 P2 { $$ = RULE(4); } %merge +; + +NT3 : T3 { $$ = RULE(5); } %merge + | P1 NT1 O1 T3 P2 { $$ = RULE(6); } %merge +; + +NT4 : NT3 { $$ = RULE(7); } %merge + | NT2 { $$ = RULE(8); } %merge + | P1 NT2 O1 NT3 P2 { $$ = RULE(9); } %merge +; + +NT5 : NT4 { $$ = RULE(10); } %merge +; + +NT6 : P1 NT1 O1 T3 P2 { $$ = RULE(11) | $2; } %merge + | NT5 { $$ = RULE(12) | $1; } %merge +; + +%% + +static int MergeRule (int x0, int x1) { + return x0 | x1; +} + +static void yyerror(char const * s) { + fprintf(stderr,"error: %s\n",s); +} + +FILE *yyin = NULL; + +int P[] = { P1, P2 }; +int O[] = { O1, O2 }; +int T[] = { T1, T2, T3, T4 }; + +int yylex (void) +{ + char inp[3]; + if (fscanf (yyin, "%2s", inp) == EOF) + return 0; + switch (inp[0]) + { + case 'p': return P[inp[1] - '1']; + case 't': return T[inp[1] - '1']; + case 'o': return O[inp[1] - '1']; + } + return BAD_CHAR; +} + +int main(int argc, char* argv[]) { + yyin = stdin; + if (argc == 2 && !(yyin = fopen (argv[1], "r"))) return 1; + return yyparse (); +} +]]) + +AT_CHECK([[bison -o glr-regr3.c glr-regr3.y]], 0, [], +[glr-regr3.y: conflicts: 1 shift/reduce, 1 reduce/reduce +]) +AT_COMPILE([glr-regr3]) + +AT_CHECK([[echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3]], 0, +[[Result: 1c04 +]], []) + AT_CLEANUP