X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/30171f79ab0aaad06b88a66653789691c4ed4f2c..9553083c729070877095948ba2d48553690ac9e9:/tests/sets.at?ds=inline diff --git a/tests/sets.at b/tests/sets.at index a0740790..26664edf 100644 --- a/tests/sets.at +++ b/tests/sets.at @@ -1,20 +1,60 @@ # Exercising Bison Grammar Sets. -*- 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. +# Copyright (C) 2001-2002, 2005, 2007, 2009-2012 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 3 of the License, 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. +# along with this program. If not, see . + + +# AT_EXTRACT_SETS(INPUT, OUTPUT) +# ------------------------------ +# Extract the information about the grammar sets from a bison +# trace output (INPUT), and save it in OUTPUT. +# And remember, there is no alternation in portable sed. +m4_define([AT_EXTRACT_SETS], +[AT_DATA([extract.sed], +[[#n +/^NULLABLE$/ { + :null + p + n + /^[ ]*$/ !b null +} +/^FIRSTS$/ { + :firsts + p + n + /^[ ]*$/ !b firsts +} +/^FDERIVES$/ { + :fderiv + p + n + /^[ ]*$/ !b fderiv +} +/^DERIVES$/ { + :deriv + p + n + /^[ ]*$/ !b deriv +} +]]) +AT_CHECK([sed -f extract.sed $1], 0, [stdout]) +AT_CHECK([mv stdout $2]) +]) + + AT_BANNER([[Grammar Sets (Firsts etc.).]]) @@ -38,125 +78,32 @@ AT_DATA([[input.y]], e: 'e' | /* Nothing */; ]]) -AT_CHECK([[bison --trace input.y]], [], [], [stderr]) - -AT_CHECK([[sed 's/[ ]*$//' stderr]], [], -[[RITEM - e $ (rule 1) - 'e' (rule 2) - (rule 3) - - -DERIVES - $axiom derives - 1: e (rule 0) +AT_BISON_CHECK([[--trace=sets input.y]], [], [], [stderr]) +AT_EXTRACT_SETS([stderr], [sets]) +AT_CHECK([[cat sets]], [], +[[DERIVES + $accept derives + 0 e $end e derives - 2: 'e' (rule 2) - 3: (rule 3) - - -Entering set_nullable + 1 'e' + 2 /* empty */ NULLABLE - $axiom: yes + $accept: no e: yes - - -TC: Input BEGIN - - 01 - .--. - 0| 1| - 1| | - `--' -TC: Input END - -TC: Output BEGIN - - 01 - .--. - 0| 1| - 1| | - `--' -TC: Output END - FIRSTS - $axiom firsts - 4 ($axiom) - 5 (e) + $accept firsts + $accept + e e firsts - 5 (e) - - + e FDERIVES - $axiom derives - 1: e $ - 2: 'e' - 3: + $accept derives + 0 e $end + 1 'e' + 2 /* empty */ e derives - 2: 'e' - 3: - - -Processing state 0 (reached by $) -Closure: input - - -Closure: output - 0: . e $ (rule 1) - 3: . 'e' (rule 2) - 5: . (rule 3) - - -Entering new_itemsets, state = 0 -Entering append_states, state = 0 -Entering get_state, state = 0, symbol = 3 ('e') -Entering new_state, state = 0, symbol = 3 ('e') -Exiting get_state => 1 -Entering get_state, state = 0, symbol = 5 (e) -Entering new_state, state = 0, symbol = 5 (e) -Exiting get_state => 2 -Processing state 1 (reached by 'e') -Closure: input - 4: . (rule 2) - - -Closure: output - 4: . (rule 2) - - -Entering new_itemsets, state = 1 -Entering append_states, state = 1 -Processing state 2 (reached by e) -Closure: input - 1: . $ (rule 1) - - -Closure: output - 1: . $ (rule 1) - - -Entering new_itemsets, state = 2 -Entering append_states, state = 2 -Entering get_state, state = 2, symbol = 0 ($) -Entering new_state, state = 2, symbol = 0 ($) -Exiting get_state => 3 -Processing state 3 (reached by $) -Closure: input - 2: . (rule 1) - - -Closure: output - 2: . (rule 1) - - -Entering new_itemsets, state = 3 -Entering append_states, state = 3 -transpose: input - 0: - -transpose: output - 0: - + 1 'e' + 2 /* empty */ ]]) AT_CLEANUP @@ -205,34 +152,151 @@ AT_SETUP([Broken Closure]) AT_DATA([input.y], [[%% -a: b -b: c -c: d -d: e -e: f -f: g -g: h -h: 'h' +a: b; +b: c; +c: d; +d: e; +e: f; +f: g; +g: h; +h: 'h'; ]]) -AT_CHECK([[bison --trace input.y]], [], [], [stderr]) +AT_BISON_CHECK([[--trace=sets input.y]], [], [], [stderr]) -AT_CHECK([[sed -n 's/[ ]*$//;/^TC: Output BEGIN/,/^TC: Output END/p' stderr]], [], -[[TC: Output BEGIN +AT_CHECK([[sed -n 's/[ ]*$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr]], [], +[[RTC: Firsts Output BEGIN 012345678 .---------. - 0| 11111111| - 1| 1111111| - 2| 111111| - 3| 11111| - 4| 1111| - 5| 111| - 6| 11| - 7| 1| - 8| | + 0|111111111| + 1| 11111111| + 2| 1111111| + 3| 111111| + 4| 11111| + 5| 1111| + 6| 111| + 7| 11| + 8| 1| `---------' -TC: Output END +RTC: Firsts Output END ]]) AT_CLEANUP + + + +## -------- ## +## Firsts. ## +## -------- ## + +AT_SETUP([Firsts]) + +AT_DATA([input.y], +[[%nonassoc '<' '>' +%left '+' '-' +%right '^' '=' +%% +exp: + exp '<' exp + | exp '>' exp + | exp '+' exp + | exp '-' exp + | exp '^' exp + | exp '=' exp + | "exp" + ; +]]) + +AT_BISON_CHECK([[--trace=sets input.y]], [], [], [stderr]) +AT_EXTRACT_SETS([stderr], [sets]) +AT_CHECK([[cat sets]], [], +[[DERIVES + $accept derives + 0 exp $end + exp derives + 1 exp '<' exp + 2 exp '>' exp + 3 exp '+' exp + 4 exp '-' exp + 5 exp '^' exp + 6 exp '=' exp + 7 "exp" +NULLABLE + $accept: no + exp: no +FIRSTS + $accept firsts + $accept + exp + exp firsts + exp +FDERIVES + $accept derives + 0 exp $end + 1 exp '<' exp + 2 exp '>' exp + 3 exp '+' exp + 4 exp '-' exp + 5 exp '^' exp + 6 exp '=' exp + 7 "exp" + exp derives + 1 exp '<' exp + 2 exp '>' exp + 3 exp '+' exp + 4 exp '-' exp + 5 exp '^' exp + 6 exp '=' exp + 7 "exp" +]]) + +AT_CLEANUP + + + + +## -------- ## +## Accept. ## +## -------- ## + +# In some weird cases Bison could compute an incorrect final state +# number. This happens only if the $end token is used in the user +# grammar, which is a very suspicious accidental feature introduced as +# a side effect of allowing the user to name $end using `%token END 0 +# "end of file"'. + +AT_SETUP([Accept]) + +AT_DATA([input.y], +[[%token END 0 +%% +input: + 'a' +| '(' input ')' +| '(' error END +; +]]) + +AT_BISON_CHECK([[-v -o input.c input.y]]) + +# Get the final state in the parser. +AT_CHECK([[sed -n 's/.*define YYFINAL *\([0-9][0-9]*\)/final state \1/p' input.c]], + 0, [stdout]) +mv stdout expout + +# Get the final state in the report, from the "accept" action.. +AT_CHECK([sed -n ' + /^state \(.*\)/{ + s//final state \1/ + x + } + / accept/{ + x + p + q + } + ' input.output], + 0, [expout]) + +AT_CLEANUP