# Bison Regressions. -*- Autotest -*- # Copyright 2001 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 # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # 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. AT_BANNER([[Regression tests.]]) ## ------------------ ## ## Duplicate string. ## ## ------------------ ## AT_SETUP([Duplicate string]) AT_DATA([duplicate.y], [[/* `Bison -v' used to dump core when two tokens are defined with the same string, as LE and GE below. */ %token NUM %token LE "<=" %token GE "<=" %% exp: '(' exp ')' | NUM ; %% ]]) AT_CHECK([bison -v duplicate.y -o duplicate.c], 0, ignore, ignore) AT_CLEANUP([duplicate.*]) ## ------------------------- ## ## Unresolved SR Conflicts. ## ## ------------------------- ## AT_SETUP([Unresolved SR Conflicts]) AT_DATA([input.y], [[%token NUM OP %% exp: exp OP exp | NUM; ]]) AT_CHECK([bison input.y -o input.c -v], 0, [], [input.y contains 1 shift/reduce conflict. ]) # Check the contents of the report. AT_CHECK([cat input.output], [], [[State 4 contains 1 shift/reduce conflict. Grammar rule 1 exp -> exp OP exp rule 2 exp -> NUM Terminals, with rules where they appear $ (-1) error (256) NUM (257) 2 OP (258) 1 Nonterminals, with rules where they appear exp (5) on left: 1 2, on right: 1 state 0 NUM shift, and go to state 1 exp go to state 2 state 1 exp -> NUM . (rule 2) $default reduce using rule 2 (exp) state 2 exp -> exp . OP exp (rule 1) $ go to state 5 OP shift, and go to state 3 state 3 exp -> exp OP . exp (rule 1) NUM shift, and go to state 1 exp go to state 4 state 4 exp -> exp . OP exp (rule 1) exp -> exp OP exp . (rule 1) OP shift, and go to state 3 OP [reduce using rule 1 (exp)] $default reduce using rule 1 (exp) state 5 $ go to state 6 state 6 $default accept ]]) AT_CLEANUP(input.c input.output) ## --------------------- ## ## Solved SR Conflicts. ## ## --------------------- ## AT_SETUP([Solved SR Conflicts]) AT_DATA([input.y], [[%token NUM OP %right OP %% exp: exp OP exp | NUM; ]]) AT_CHECK([bison input.y -o input.c -v], 0, [], []) # Check the contents of the report. AT_CHECK([cat input.output], [], [[Conflict in state 4 between rule 1 and token OP resolved as shift. Grammar rule 1 exp -> exp OP exp rule 2 exp -> NUM Terminals, with rules where they appear $ (-1) error (256) NUM (257) 2 OP (258) 1 Nonterminals, with rules where they appear exp (5) on left: 1 2, on right: 1 state 0 NUM shift, and go to state 1 exp go to state 2 state 1 exp -> NUM . (rule 2) $default reduce using rule 2 (exp) state 2 exp -> exp . OP exp (rule 1) $ go to state 5 OP shift, and go to state 3 state 3 exp -> exp OP . exp (rule 1) NUM shift, and go to state 1 exp go to state 4 state 4 exp -> exp . OP exp (rule 1) exp -> exp OP exp . (rule 1) OP shift, and go to state 3 $default reduce using rule 1 (exp) state 5 $ go to state 6 state 6 $default accept ]]) AT_CLEANUP(input.c input.output) ## -------------------- ## ## %expect not enough. ## ## -------------------- ## AT_SETUP([%expect not enough]) AT_DATA([input.y], [[%token NUM OP %expect 0 %% exp: exp OP exp | NUM; ]]) AT_CHECK([bison input.y -o input.c], 1, [], [input.y contains 1 shift/reduce conflict. expected 0 shift/reduce conflicts ]) AT_CLEANUP(input.c) ## --------------- ## ## %expect right. ## ## --------------- ## AT_SETUP([%expect right]) AT_DATA([input.y], [[%token NUM OP %expect 1 %% exp: exp OP exp | NUM; ]]) AT_CHECK([bison input.y -o input.c], 0, [], [input.y contains 1 shift/reduce conflict. ]) AT_CLEANUP(input.c) ## ------------------ ## ## %expect too much. ## ## ------------------ ## AT_SETUP([%expect too much]) AT_DATA([input.y], [[%token NUM OP %expect 2 %% exp: exp OP exp | NUM; ]]) AT_CHECK([bison input.y -o input.c], 1, [], [input.y contains 1 shift/reduce conflict. expected 2 shift/reduce conflicts ]) AT_CLEANUP(input.c) ## ---------------------- ## ## Mixing %token styles. ## ## ---------------------- ## AT_SETUP([Mixing %token styles]) # Taken from the documentation. AT_DATA([input.y], [[%token OR "||" %token LE 134 "<=" %left OR "<=" %% exp: ; %% ]]) AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore) AT_CLEANUP([input.*]) ## ---------------------- ## ## %union and --defines. ## ## ---------------------- ## AT_SETUP([%union and --defines]) AT_DATA([union.y], [%union { int integer; char *string ; } %% exp: {}; ]) AT_CHECK([bison --defines union.y]) AT_CLEANUP([union.*]) ## --------------------------------------- ## ## Duplicate '/' in C comments in %union ## ## --------------------------------------- ## AT_SETUP([%union and C comments]) AT_DATA([union-comment.y], [%union { /* The int. */ int integer; /* The string. */ char *string ; } %% exp: {}; ]) AT_CHECK([bison union-comment.y]) AT_CHECK([fgrep '//*' union-comment.tab.c], [1], []) AT_CLEANUP([union-comment.*]) ## ----------------- ## ## Invalid input 1. ## ## ----------------- ## AT_SETUP([Invalid input: 1]) AT_DATA([input.y], [[%% ? ]]) AT_CHECK([bison input.y], [1], [], [input.y:2: invalid input: `?' input.y:3: fatal error: no rules in the input grammar ]) AT_CLEANUP ## ----------------- ## ## Invalid input 2. ## ## ----------------- ## AT_SETUP([Invalid input: 2]) AT_DATA([input.y], [[%% default: 'a' } ]]) AT_CHECK([bison input.y], [1], [], [input.y:2: invalid input: `}' ]) AT_CLEANUP ## --------------------- ## ## Invalid CPP headers. ## ## --------------------- ## # AT_TEST_CPP_GUARD_H([INPUT-FILE-BASE) # ------------------------------------- m4_define([AT_TEST_CPP_GUARD_H], [AT_SETUP([Invalid CPP guards: $1]) # possibly create and nuke inner directories. m4_bmatch([$1], [[/]], [dirname=`AS_DIRNAME([$1])` AS_MKDIR_P([$dirname]) AT_CLEANUP_FILES([$dirname])]) AT_DATA([$1.y], [%% dummy: ]) AT_CHECK([bison --defines=$1.h $1.y]) # CPP should be happy with it. AT_CHECK([$CC -E $1.h], 0, [ignore]) AT_CLEANUP($1.*) ]) AT_TEST_CPP_GUARD_H([input/input]) AT_TEST_CPP_GUARD_H([9foo])