# Exercising Bison Grammar Sets. -*- Autotest -*-
-# Copyright 2001 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002 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
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
+
+# 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.).]])
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_CHECK([[bison --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 1)
- 3: (rule 2)
-
-
-Entering set_nullable
+ 1 'e'
+ 2 /* empty */
NULLABLE
- $axiom: no
+ $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:
-
-Lookaheads: BEGIN
-State 0: 0 lookaheads
-State 1: 0 lookaheads
-State 2: 0 lookaheads
-State 3: 0 lookaheads
-Lookaheads: END
+ 1 'e'
+ 2 /* empty */
]])
AT_CLEANUP
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_CHECK([[bison --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_CHECK([[bison --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