X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/7da99edea76d6148c776214a71bc09dacfc0cb7b..2e729273d633f1ddaf1b6affdca53f3e63f3715c:/tests/regression.at?ds=sidebyside diff --git a/tests/regression.at b/tests/regression.at index da2ab065..f6d53250 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -40,7 +40,7 @@ exp: '(' exp ')' | NUM ; AT_CHECK([bison -v duplicate.y -o duplicate.c], 0, ignore, ignore) -AT_CLEANUP([duplicate.*]) +AT_CLEANUP ## ------------------------- ## @@ -63,10 +63,13 @@ AT_CHECK([bison input.y -o input.c -v], 0, [], AT_CHECK([cat input.output], [], [[State 4 contains 1 shift/reduce conflict. + Grammar -rule 1 exp -> exp OP exp -rule 2 exp -> NUM + Number, Line, Rule + 1 3 exp -> exp OP exp + 2 3 exp -> NUM + Terminals, with rules where they appear @@ -75,6 +78,7 @@ error (256) NUM (257) 2 OP (258) 1 + Nonterminals, with rules where they appear exp (5) @@ -101,7 +105,7 @@ state 2 exp -> exp . OP exp (rule 1) - $ go to state 5 + $ shift, and go to state 5 OP shift, and go to state 3 @@ -130,16 +134,18 @@ state 4 state 5 - $ go to state 6 + $ shift, and go to state 6 state 6 $default accept + + ]]) -AT_CLEANUP(input.c input.output) +AT_CLEANUP ## --------------------- ## @@ -161,10 +167,13 @@ AT_CHECK([bison input.y -o input.c -v], 0, [], []) 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 + Number, Line, Rule + 1 4 exp -> exp OP exp + 2 4 exp -> NUM + Terminals, with rules where they appear @@ -173,6 +182,7 @@ error (256) NUM (257) 2 OP (258) 1 + Nonterminals, with rules where they appear exp (5) @@ -199,7 +209,7 @@ state 2 exp -> exp . OP exp (rule 1) - $ go to state 5 + $ shift, and go to state 5 OP shift, and go to state 3 @@ -227,16 +237,157 @@ state 4 state 5 - $ go to state 6 + $ shift, and go to state 6 state 6 $default accept + + ]]) -AT_CLEANUP(input.c input.output) +AT_CLEANUP + + + + +## ------------------- ## +## Rule Line Numbers. ## +## ------------------- ## + +AT_SETUP([Rule Line Numbers]) + +AT_DATA([input.y], +[[%% +expr: +'a' + +{ + +} + +'b' + +{ + +} + +| + + +{ + + +} + +'c' + +{ + +} +]]) + +AT_CHECK([bison input.y -o input.c -v], 0, [], []) + +# Check the contents of the report. +AT_CHECK([cat input.output], [], +[[Grammar + + Number, Line, Rule + 1 2 @1 -> /* empty */ + 2 2 expr -> 'a' @1 'b' + 3 15 @2 -> /* empty */ + 4 15 expr -> @2 'c' + + +Terminals, with rules where they appear + +$ (-1) +'a' (97) 2 +'b' (98) 2 +'c' (99) 4 +error (256) + + +Nonterminals, with rules where they appear + +expr (6) + on left: 2 4 +@1 (7) + on left: 1, on right: 2 +@2 (8) + on left: 3, on right: 4 + + +state 0 + + 'a' shift, and go to state 1 + + $default reduce using rule 3 (@2) + + expr go to state 6 + @2 go to state 2 + + + +state 1 + + expr -> 'a' . @1 'b' (rule 2) + + $default reduce using rule 1 (@1) + + @1 go to state 3 + + + +state 2 + + expr -> @2 . 'c' (rule 4) + + 'c' shift, and go to state 4 + + + +state 3 + + expr -> 'a' @1 . 'b' (rule 2) + + 'b' shift, and go to state 5 + + + +state 4 + + expr -> @2 'c' . (rule 4) + + $default reduce using rule 4 (expr) + + + +state 5 + + expr -> 'a' @1 'b' . (rule 2) + + $default reduce using rule 2 (expr) + + + +state 6 + + $ shift, and go to state 7 + + + +state 7 + + $default accept + + +]]) + +AT_CLEANUP @@ -257,7 +408,7 @@ 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) +AT_CLEANUP ## --------------- ## @@ -273,10 +424,8 @@ AT_DATA([input.y], 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) +AT_CHECK([bison input.y -o input.c], 0) +AT_CLEANUP ## ------------------ ## @@ -296,7 +445,7 @@ 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) +AT_CLEANUP ## ---------------------- ## @@ -318,7 +467,7 @@ exp: ; AT_CHECK([bison -v input.y -o input.c], 0, ignore, ignore) -AT_CLEANUP([input.*]) +AT_CLEANUP @@ -341,7 +490,7 @@ exp: {}; AT_CHECK([bison --defines union.y]) -AT_CLEANUP([union.*]) +AT_CLEANUP ## --------------------------------------- ## @@ -364,7 +513,7 @@ exp: {}; AT_CHECK([bison union-comment.y]) AT_CHECK([fgrep '//*' union-comment.tab.c], [1], []) -AT_CLEANUP([union-comment.*]) +AT_CLEANUP ## ----------------- ## @@ -380,9 +529,9 @@ AT_DATA([input.y], ]]) AT_CHECK([bison input.y], [1], [], -[input.y:2: invalid input: `?' +[[input.y:2: invalid input: `?' input.y:3: fatal error: no rules in the input grammar -]) +]]) AT_CLEANUP @@ -400,8 +549,29 @@ default: 'a' } ]]) AT_CHECK([bison input.y], [1], [], -[input.y:2: invalid input: `}' -]) +[[input.y:2: invalid input: `}' +]]) + +AT_CLEANUP + + + +## -------------------- ## +## Invalid %directive. ## +## -------------------- ## + + +AT_SETUP([Invalid %directive]) + +AT_DATA([input.y], +[[%invalid +]]) + +AT_CHECK([bison input.y], [1], [], +[[input.y:1: unrecognized: %invalid +input.y:1: Skipping to next % +input.y:2: fatal error: no input grammar +]]) AT_CLEANUP @@ -416,11 +586,9 @@ AT_CLEANUP 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])` +# Possibly create inner directories. +dirname=`AS_DIRNAME([$1])` AS_MKDIR_P([$dirname]) -AT_CLEANUP_FILES([$dirname])]) AT_DATA([$1.y], [%% @@ -432,8 +600,83 @@ 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_CLEANUP ]) AT_TEST_CPP_GUARD_H([input/input]) AT_TEST_CPP_GUARD_H([9foo]) + + +## ---------------- ## +## Broken Closure. ## +## ---------------- ## + +# TC was once broken during a massive `simplification' of the code. +# It resulted in bison dumping core on the following grammar (the +# computation of FIRSTS uses TC). It managed to produce a pretty +# exotic closure: +# +# TC: Input +# +# 01234567 +# +--------+ +# 0| 1 | +# 1| 1 | +# 2| 1 | +# 3| 1 | +# 4| 1 | +# 5| 1 | +# 6| 1| +# 7| | +# +--------+ +# +# TC: Output +# +# 01234567 +# +--------+ +# 0| 1 | +# 1| 111 | +# 2| 111 | +# 3| 1111 | +# 4| 111 1 | +# 5| 111 1 | +# 6| 111 1| +# 7| 111 | +# +--------+ +# +# instead of that below. + +AT_SETUP([Broken Closure]) + +AT_DATA([input.y], +[[%% +a: b +b: c +c: d +d: e +e: f +f: g +g: h +h: 'h' +]]) + +AT_CHECK([bison --trace input.y 2>&1 | + sed -n '/^TC: Output BEGIN/,/^TC: Output END/p'], + [0], +[[TC: Output BEGIN + @&t@ + 01234567 + +--------+ + 0| 1111111| + 1| 111111| + 2| 11111| + 3| 1111| + 4| 111| + 5| 11| + 6| 1| + 7| | + +--------+ +TC: Output END +]]) + +AT_CLEANUP