[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 6/7] tests: glr: prepare for more languages
From: |
Akim Demaille |
Subject: |
[PATCH 6/7] tests: glr: prepare for more languages |
Date: |
Sat, 5 Dec 2020 11:30:56 +0100 |
* tests/glr-regression.at: Wrap each test in an AT_TEST.
Call it with glr.c.
---
tests/glr-regression.at | 492 ++++++++++++++++++++++++++--------------
1 file changed, 317 insertions(+), 175 deletions(-)
diff --git a/tests/glr-regression.at b/tests/glr-regression.at
index 8b58795a..64bb396a 100644
--- a/tests/glr-regression.at
+++ b/tests/glr-regression.at
@@ -22,28 +22,26 @@ AT_BANNER([[GLR Regression Tests]])
## Badly Collapsed GLR States. ##
## ---------------------------- ##
-AT_SETUP([Badly Collapsed GLR States])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Badly Collapsed GLR States: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr1.y],
[[/* Regression Test: Improper state compression */
/* Reported by Scott McPeak */
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
+%define api.value.type {int}
-#define YYSTYPE int
+%code {
static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1);
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
-%}
-
+}
%define parse.assert
%glr-parser
%expect 1
+]$1[
/* -------- productions ------ */
%%
@@ -80,9 +78,9 @@ main (int argc, const char* argv[])
]AT_YYERROR_DEFINE[
-int
-yylex (void)
+]AT_YYLEX_PROTOTYPE[
{
+ ]AT_USE_LEX_ARGS[
return *input++;
}
]])
@@ -98,25 +96,32 @@ E -> 'B'
E -> E 'P' E
E -> E 'P' E
<OR>
-]], [])
+]])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
+
## -------------------------------------------------------------- ##
## Improper handling of embedded actions and $-N in GLR parsers. ##
## -------------------------------------------------------------- ##
-AT_SETUP([Improper handling of embedded actions and dollar(-N) in GLR parsers])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Improper handling of embedded actions and dollar(-N) in GLR
parsers: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr2a.y],
[[/* Regression Test: Improper handling of embedded actions and $-N */
/* Reported by S. Eken */
-%{
- #define YYSTYPE char *
-
+%define api.value.type {char *}
+%code {
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
@@ -124,39 +129,40 @@ AT_DATA_GRAMMAR([glr-regr2a.y],
#include <assert.h>
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
-%}
+}
%define parse.assert
%glr-parser
%expect 2
+]$1[
%%
command:
's' var 't'
- { printf ("Variable: '%s'\n", $2); }
+ { printf ("Variable: '%s'\n", $][2); }
'v' 'x' 'q'
- { free ($2); }
+ { free ($][2); }
| 's' var_list 't' 'e'
- { printf ("Varlist: '%s'\n", $2); free ($2); }
+ { printf ("Varlist: '%s'\n", $][2); free ($][2); }
| 's' var 't' var_printer 'x'
- { free ($2); }
+ { free ($][2); }
;
var:
'V'
- { $$ = $1; }
+ { $$ = $][1; }
;
var_list:
var
- { $$ = $1; }
+ { $$ = $][1; }
| var ',' var_list
{
- char *s = YY_CAST (char *, realloc ($1, strlen ($1) + 1 + strlen ($3) +
1));
+ char *s = YY_CAST (char *, realloc ($][1, strlen ($][1) + 1 + strlen
($][3) + 1));
strcat (s, ",");
- strcat (s, $3);
- free ($3);
+ strcat (s, $][3);
+ free ($][3);
$$ = s;
}
;
@@ -168,10 +174,10 @@ var_printer: 'v'
]AT_YYERROR_DEFINE[
FILE *input;
-int
-yylex (void)
+]AT_YYLEX_PROTOTYPE[
{
char buf[50];
+ ]AT_USE_LEX_ARGS[
assert (!feof (stdin));
switch (fscanf (input, " %1[a-z,]", buf))
{
@@ -233,24 +239,28 @@ AT_PARSER_CHECK([[glr-regr2a input3.txt]], 0,
[[Variable: 'VARIABLE_3'
]])
-
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## --------------------------------------------- ##
## Improper merging of GLR delayed action sets. ##
## --------------------------------------------- ##
-AT_SETUP([Improper merging of GLR delayed action sets])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Improper merging of GLR delayed action sets: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr3.y],
[[/* Regression Test: Improper merging of GLR delayed action sets. */
/* Reported by M. Rosien */
-%{
-#include <stdio.h>
-#include <stdlib.h>
+%code {
#include <stdarg.h>
#include <assert.h>
@@ -260,19 +270,20 @@ static int MergeRule (int x0, int x1);
#define RULE(x) (1 << (x))
-%}
+}
%define parse.assert
%glr-parser
%expect 1
%expect-rr 2
+]$1[
%token BAD_CHAR
%token P1 P2 T1 T2 T3 T4 O1 O2
%%
-S : P1 T4 O2 NT6 P2 { printf ("Result: %x\n", $4); }
+S : P1 T4 O2 NT6 P2 { printf ("Result: %x\n", $][4); }
;
NT1 : P1 T1 O1 T2 P2 { $$ = RULE(2); } %merge<MergeRule>
@@ -294,8 +305,8 @@ NT4 : NT3 { $$ = RULE(7); } %merge<MergeRule>
NT5 : NT4 { $$ = RULE(10); } %merge<MergeRule>
;
-NT6 : P1 NT1 O1 T3 P2 { $$ = RULE(11) | $2; } %merge<MergeRule>
- | NT5 { $$ = RULE(12) | $1; } %merge<MergeRule>
+NT6 : P1 NT1 O1 T3 P2 { $$ = RULE(11) | $][2; } %merge<MergeRule>
+ | NT5 { $$ = RULE(12) | $][1; } %merge<MergeRule>
;
%%
@@ -354,6 +365,11 @@ AT_PARSER_CHECK([[glr-regr3 input.txt]],
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
## ---------------------------------------------------------------------- ##
@@ -361,9 +377,10 @@ AT_CLEANUP
## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>. ##
## ---------------------------------------------------------------------- ##
-AT_SETUP([Duplicate representation of merged trees])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Duplicate representation of merged trees: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr4.y],
[[
%define parse.assert
@@ -371,9 +388,9 @@ AT_DATA_GRAMMAR([glr-regr4.y],
%type <ptr> S A A1 A2 B
%glr-parser
%expect-rr 2
-%{
- #include <stdio.h>
- #include <stdlib.h>
+]$1[
+
+%code {
#include <string.h>
static char *merge (YYSTYPE, YYSTYPE);
static char *make_value (char const *, char const *);
@@ -381,20 +398,20 @@ AT_DATA_GRAMMAR([glr-regr4.y],
]AT_YYLEX_DECLARE[
static char *ptrs[100];
static char **ptrs_next = ptrs;
-%}
+}
%%
-tree: S { printf ("%s\n", $1); } ;
+tree: S { printf ("%s\n", $][1); } ;
S:
- A %merge<merge> { $$ = make_value ("S", $1); }
- | B %merge<merge> { $$ = make_value ("S", $1); }
+ A %merge<merge> { $$ = make_value ("S", $][1); }
+ | B %merge<merge> { $$ = make_value ("S", $][1); }
;
A:
- A1 %merge<merge> { $$ = make_value ("A", $1); }
- | A2 %merge<merge> { $$ = make_value ("A", $1); }
+ A1 %merge<merge> { $$ = make_value ("A", $][1); }
+ | A2 %merge<merge> { $$ = make_value ("A", $][1); }
;
A1: 'a' { $$ = make_value ("A1", "'a'"); } ;
@@ -443,6 +460,11 @@ AT_PARSER_CHECK([[glr-regr4]], 0,
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
## ------------------------------------------------------------------------- ##
@@ -450,23 +472,24 @@ AT_CLEANUP
## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>. ##
## ------------------------------------------------------------------------- ##
-AT_SETUP([User destructor for unresolved GLR semantic value])
+m4_pushdef([AT_TEST],
+[AT_SETUP([User destructor for unresolved GLR semantic value: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr5.y],
[[
-%{
- #include <stdio.h>
- #include <stdlib.h>
+%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
enum { MAGIC_VALUE = -1057808125 }; /* originally chosen at random */
-%}
+}
%define parse.assert
%glr-parser
%expect 0
%expect-rr 1
+]$1[
+
%union { int value; }
%type <value> start
@@ -499,6 +522,12 @@ AT_PARSER_CHECK([[glr-regr5]], 1, [],
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------------------------------- ##
@@ -506,21 +535,22 @@ AT_CLEANUP
## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>. ##
## ------------------------------------------------------------------------- ##
-AT_SETUP([User destructor after an error during a split parse])
+m4_pushdef([AT_TEST],
+[AT_SETUP([User destructor after an error during a split parse: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr6.y],
[[
-%{
- #include <stdio.h>
- #include <stdlib.h>
+%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
-%}
+}
%define parse.assert
%glr-parser
%expect-rr 1
+]$1[
+
%union { int value; }
%type <value> 'a'
@@ -548,6 +578,12 @@ AT_PARSER_CHECK([[glr-regr6]], 1,
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------------------------------- ##
@@ -555,27 +591,31 @@ AT_CLEANUP
## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>. ##
## ------------------------------------------------------------------------- ##
-AT_SETUP([Duplicated user destructor for lookahead])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Duplicated user destructor for lookahead: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr7.y],
[[
-%{
- #include <stdio.h>
- #include <stdlib.h>
- ]AT_YYERROR_DECLARE[
- ]AT_YYLEX_DECLARE[
- #define YYSTACKEXPANDABLE 0
+%code requires {
typedef struct count_node {
int count;
struct count_node *prev;
} count_node;
+}
+
+%code {
+ ]AT_YYERROR_DECLARE[
+ ]AT_YYLEX_DECLARE[
+ #define YYSTACKEXPANDABLE 0
static count_node *tail;
-%}
+}
%define parse.assert
%glr-parser
%expect-rr 2
+]$1[
+
%union { count_node *node; }
%type <node> 'a'
@@ -634,6 +674,12 @@ AT_PARSER_CHECK([[glr-regr7]], 2, [],
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------------------------------- ##
@@ -643,25 +689,25 @@ AT_CLEANUP
## http://lists.gnu.org/archive/html/bug-bison/2005-10/msg00072.html ##
## ------------------------------------------------------------------------- ##
-AT_SETUP([Incorrectly initialized location for empty right-hand side in GLR])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Incorrectly initialized location for empty right-hand side in GLR:
$1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr8.y],
[[
-%{
- #include <stdio.h>
- #include <stdlib.h>
+%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
-%}
-
-%token T_CONSTANT
-%token T_PORT
-%token T_SIGNAL
+}
%define parse.assert
%glr-parser
%expect-rr 1
+]$1[
+
+%token T_CONSTANT
+%token T_PORT
+%token T_SIGNAL
%%
@@ -724,6 +770,12 @@ AT_PARSER_CHECK([[glr-regr8]], 0,
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------------------------------- ##
@@ -731,25 +783,26 @@ AT_CLEANUP
## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>. ##
## ------------------------------------------------------------------------- ##
-AT_SETUP([No users destructors if stack 0 deleted])
+m4_pushdef([AT_TEST],
+[AT_SETUP([No users destructors if stack 0 deleted: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr9.y],
[[
-%{
-# include <stdio.h>
-# include <stdlib.h>
+%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
# define YYSTACKEXPANDABLE 0
static int tokens = 0;
static int destructors = 0;
# define USE(Var)
-%}
+}
%define parse.assert
%glr-parser
%expect-rr 2
+]$1[
+
%union { int dummy; }
%type <dummy> 'a'
@@ -760,7 +813,7 @@ AT_DATA_GRAMMAR([glr-regr9.y],
%%
start:
- ambig0 'a' { destructors += 2; USE ($2); }
+ ambig0 'a' { destructors += 2; USE ($][2); }
| ambig1 start { destructors += 1; }
| ambig2 start { destructors += 1; }
;
@@ -801,29 +854,36 @@ AT_PARSER_CHECK([[glr-regr9]], 0, [],
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------------ ##
## Corrupted semantic options if user action cuts parse. ##
## ------------------------------------------------------ ##
-AT_SETUP([Corrupted semantic options if user action cuts parse])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Corrupted semantic options if user action cuts parse: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr10.y],
[[
-%{
-# include <stdlib.h>
-# include <stdio.h>
+%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
#define GARBAGE_SIZE 50
static char garbage[GARBAGE_SIZE];
-%}
+}
%define parse.assert
%glr-parser
%expect-rr 1
+]$1[
+
%union { char *ptr; }
%type <ptr> start
@@ -854,28 +914,36 @@ AT_PARSER_CHECK([[glr-regr10]], 0, [], [])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## --------------------------------------------------- ##
## Undesirable destructors if user action cuts parse. ##
## --------------------------------------------------- ##
-AT_SETUP([Undesirable destructors if user action cuts parse])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Undesirable destructors if user action cuts parse: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr11.y],
[[
-%{
-# include <stdlib.h>
+%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
static int destructors = 0;
# define USE(val)
-%}
+}
%define parse.assert
%glr-parser
%expect-rr 1
+]$1[
+
%union { int dummy; }
%type <int> 'a'
%destructor { destructors += 1; } 'a'
@@ -883,8 +951,8 @@ AT_DATA_GRAMMAR([glr-regr11.y],
%%
start:
- 'a' %dprec 2 { USE ($1); destructors += 1; YYACCEPT; }
- | 'a' %dprec 1 { USE ($1); destructors += 1; YYACCEPT; }
+ 'a' %dprec 2 { USE ($][1); destructors += 1; YYACCEPT; }
+ | 'a' %dprec 1 { USE ($][1); destructors += 1; YYACCEPT; }
;
%%
@@ -911,21 +979,30 @@ AT_PARSER_CHECK([[glr-regr11]], 0, [], [])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## -------------------------------------------------- ##
## Leaked semantic values if user action cuts parse. ##
## -------------------------------------------------- ##
-AT_SETUP([Leaked semantic values if user action cuts parse])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Leaked semantic values if user action cuts parse: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr12.y],
[[
%define parse.assert
%glr-parser
%expect 1
%expect-rr 1
+]$1[
+
%union { int dummy; }
%token PARENT_RHS_AFTER
%type <dummy> parent_rhs_before merged PARENT_RHS_AFTER
@@ -933,8 +1010,7 @@ AT_DATA_GRAMMAR([glr-regr12.y],
%destructor { merged_value = 0; } merged
%destructor { parent_rhs_after_value = 0; } PARENT_RHS_AFTER
-%{
-# include <stdlib.h>
+%code {
# include <assert.h>
static int merge (YYSTYPE, YYSTYPE);
]AT_YYERROR_DECLARE[
@@ -943,7 +1019,7 @@ AT_DATA_GRAMMAR([glr-regr12.y],
static int merged_value = 0;
static int parent_rhs_after_value = 0;
# define USE(val)
-%}
+}
%%
@@ -954,14 +1030,14 @@ start:
alt1:
PARENT_RHS_AFTER {
- USE ($1);
+ USE ($][1);
parent_rhs_after_value = 0;
}
;
alt2:
parent_rhs_before merged PARENT_RHS_AFTER {
- USE (($1, $2, $3));
+ USE (($][1, $][2, $][3));
parent_rhs_before_value = 0;
merged_value = 0;
parent_rhs_after_value = 0;
@@ -1031,6 +1107,12 @@ AT_PARSER_CHECK([[glr-regr12]], 0, [], [])
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------------------------------- ##
@@ -1039,9 +1121,10 @@ AT_CLEANUP
## <http://lists.gnu.org/archive/html/bison-patches/2006-01/msg00060.html>. ##
## ------------------------------------------------------------------------- ##
-AT_SETUP([Incorrect lookahead during deterministic GLR])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Incorrect lookahead during deterministic GLR: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr13.y],
[[
/* Tests:
@@ -1051,26 +1134,27 @@ AT_DATA_GRAMMAR([glr-regr13.y],
- Defaulted state after shift: yychar == YYEMPTY.
- User action changing the lookahead. */
-%{
- #include <stdio.h>
+%code {
#include <assert.h>
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
static void print_lookahead (char const *);
#define USE(value)
-%}
+}
%define parse.assert
+%locations
+%glr-parser
+]$1[
+
%union { char value; }
%type <value> 'a' 'b'
-%glr-parser
-%locations
%%
start:
defstate_init defstate_shift 'b' change_lookahead 'a' {
- USE ($3);
+ USE ($][3);
print_lookahead ("start <- defstate_init defstate_shift 'b'");
}
;
@@ -1081,7 +1165,7 @@ defstate_init:
;
defstate_shift:
nondefstate defstate_look 'a' {
- USE ($3);
+ USE ($][3);
print_lookahead ("defstate_shift <- nondefstate defstate_look 'a'");
}
;
@@ -1095,7 +1179,7 @@ nondefstate:
print_lookahead ("nondefstate <- empty string");
}
| 'b' {
- USE ($1);
+ USE ($][1);
print_lookahead ("nondefstate <- 'b'");
}
;
@@ -1157,15 +1241,22 @@ start <- defstate_init defstate_shift 'b':
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------- ##
## Incorrect lookahead during nondeterministic GLR. ##
## ------------------------------------------------- ##
-AT_SETUP([Incorrect lookahead during nondeterministic GLR])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Incorrect lookahead during nondeterministic GLR: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr14.y],
[[
/* Tests:
@@ -1187,31 +1278,30 @@ AT_DATA_GRAMMAR([glr-regr14.y],
- If only defaulted states are entered, there are no conflicts, so
nondeterministic operation does not start. */
+%define parse.assert
+%type <value> 'a' 'b' 'c' 'd' stack_explosion
+%glr-parser
+%expect 0
+%expect-rr 5
+]$1[
+%locations
+
%union { char value; }
-%{
- #include <stdlib.h>
- #include <stdio.h>
+%code {
#include <assert.h>
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
static void print_lookahead (char const *);
static char merge (union YYSTYPE, union YYSTYPE);
#define USE(value)
-%}
-
-%define parse.assert
-%type <value> 'a' 'b' 'c' 'd' stack_explosion
-%glr-parser
-%expect 0
-%expect-rr 5
-%locations
+}
%%
start:
merge 'c' stack_explosion {
- USE ($2); USE ($3);
+ USE ($][2); USE ($][3);
print_lookahead ("start <- merge 'c' stack_explosion");
}
;
@@ -1219,11 +1309,11 @@ start:
/* When merging the 2 deferred actions, the lookahead needs are different. */
merge:
nonconflict1 'a' 'b' nonconflict2 %dprec 1 {
- USE ($2); USE ($3);
+ USE ($][2); USE ($][3);
print_lookahead ("merge <- nonconflict1 'a' 'b' nonconflict2");
}
| conflict defstate_look 'a' nonconflict2 'b' defstate_shift %dprec 2 {
- USE ($3); USE ($5);
+ USE ($][3); USE ($][5);
print_lookahead ("merge <- conflict defstate_look 'a' nonconflict2 'b'"
" defstate_shift");
}
@@ -1239,7 +1329,7 @@ nonconflict2:
print_lookahead ("nonconflict2 <- empty string");
}
| 'a' {
- USE ($1);
+ USE ($][1);
print_lookahead ("nonconflict2 <- 'a'");
}
;
@@ -1263,13 +1353,13 @@ defstate_shift:
stack_explosion:
{ $$ = '\0'; }
- | alt1 stack_explosion %merge<merge> { $$ = $2; }
- | alt2 stack_explosion %merge<merge> { $$ = $2; }
- | alt3 stack_explosion %merge<merge> { $$ = $2; }
+ | alt1 stack_explosion %merge<merge> { $$ = $][2; }
+ | alt2 stack_explosion %merge<merge> { $$ = $][2; }
+ | alt3 stack_explosion %merge<merge> { $$ = $][2; }
;
alt1:
'd' no_look {
- USE ($1);
+ USE ($][1);
if (yychar != 'd' && yychar != YYEOF)
{
fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
@@ -1278,7 +1368,7 @@ alt1:
;
alt2:
'd' no_look {
- USE ($1);
+ USE ($][1);
if (yychar != 'd' && yychar != YYEOF)
{
fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
@@ -1287,7 +1377,7 @@ alt2:
;
alt3:
'd' no_look {
- USE ($1);
+ USE ($][1);
if (yychar != 'd' && yychar != YYEOF)
{
fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
@@ -1373,30 +1463,38 @@ start <- merge 'c' stack_explosion:
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------- ##
## Leaked semantic values when reporting ambiguity. ##
## ------------------------------------------------- ##
-AT_SETUP([Leaked semantic values when reporting ambiguity])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Leaked semantic values when reporting ambiguity: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr15.y],
[[
%define parse.assert
%glr-parser
%expect 0
%expect-rr 2
+]$1[
+
%destructor { parent_rhs_before_value = 0; } parent_rhs_before
-%{
-# include <stdlib.h>
+%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
static int parent_rhs_before_value = 0;
# define USE(val)
-%}
+}
%%
@@ -1414,7 +1512,7 @@ alt1: ;
alt2:
parent_rhs_before ambiguity {
- USE ($1);
+ USE ($][1);
parent_rhs_before_value = 0;
}
;
@@ -1455,31 +1553,39 @@ AT_PARSER_CHECK([[glr-regr15]], 0, [],
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------------------ ##
## Leaked lookahead after nondeterministic parse syntax error. ##
## ------------------------------------------------------------ ##
-AT_SETUP([Leaked lookahead after nondeterministic parse syntax error])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Leaked lookahead after nondeterministic parse syntax error: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr16.y],
[[
%define parse.assert
%glr-parser
%expect 0
%expect-rr 1
+]$1[
+
%destructor { lookahead_value = 0; } 'b'
-%{
-# include <stdlib.h>
+%code {
# include <assert.h>
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
static int lookahead_value = 0;
# define USE(val)
-%}
+}
%%
@@ -1515,15 +1621,22 @@ AT_PARSER_CHECK([[glr-regr16]], 0, [],
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------- ##
## Uninitialized location when reporting ambiguity. ##
## ------------------------------------------------- ##
-AT_SETUP([Uninitialized location when reporting ambiguity])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Uninitialized location when reporting ambiguity: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser %locations %define api.pure])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser %locations %define api.pure $1])
AT_DATA_GRAMMAR([glr-regr17.y],
[[
@@ -1531,16 +1644,17 @@ AT_DATA_GRAMMAR([glr-regr17.y],
%glr-parser
%expect 0
%expect-rr 3
+]$1[
%locations
%define api.pure
%define parse.error verbose
%union { int dummy; }
-%{
+%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
-%}
+}
%%
@@ -1589,24 +1703,31 @@ AT_PARSER_CHECK([[glr-regr17]], 1, [],
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------------------------------------------------- ##
## Missed %merge type warnings when LHS type is declared later. ##
## ------------------------------------------------------------- ##
-AT_SETUP([Missed %merge type warnings when LHS type is declared later])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Missed %merge type warnings when LHS type is declared later: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([glr-regr18.y],
[[%define parse.assert
%glr-parser
+]$1[
-%{
- #include <stdlib.h>
+%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
-%}
+}
%union {
int type1;
@@ -1615,8 +1736,8 @@ AT_DATA_GRAMMAR([glr-regr18.y],
}
%%
-sym1: sym2 %merge<merge> { $$ = $1; } ;
-sym2: sym3 %merge<merge> { $$ = $1; } ;
+sym1: sym2 %merge<merge> { $$ = $][1; } ;
+sym2: sym3 %merge<merge> { $$ = $][1; } ;
sym3: %merge<merge> { $$ = 0; } ;
%type <type1> sym1;
@@ -1638,36 +1759,43 @@ glr-regr18.y:28.18-24: note: previous declaration
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ------------------- ##
## Ambiguity reports. ##
## ------------------- ##
-AT_SETUP([Ambiguity reports])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Ambiguity reports: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser %debug])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser %debug $1])
AT_DATA_GRAMMAR([input.y],
-[[%{
- #include <stdio.h>
- #include <stdlib.h>
+[[%code {
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
-%}
+}
%define parse.assert
%debug
%glr-parser
%expect 0
%expect-rr 1
+]$1[
%%
+
start:
'a' b 'c' d
| 'a' b 'c' d
;
b: 'b';
-d: /* nada. */;
+d: %empty;
%%
]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(["abc"])[
@@ -1688,15 +1816,15 @@ Next token is token 'b' ()
Shifting token 'b' ()
Entering state 3
Reducing stack 0 by rule 3 (line 29):
- $1 = token 'b' ()
--> $$ = nterm b ()
+ $][1 = token 'b' ()
+-> $][$ = nterm b ()
Entering state 4
Reading a token
Next token is token 'c' ()
Shifting token 'c' ()
Entering state 6
Reducing stack 0 by rule 4 (line 30):
--> $$ = nterm d ()
+-> $][$ = nterm d ()
Entering state 7
Reading a token
Now at end of input.
@@ -1740,6 +1868,12 @@ Cleanup: popping token 'a' ()
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
+
## ----------------------------------------------------------------- ##
@@ -1749,14 +1883,17 @@ AT_CLEANUP
## http://lists.gnu.org/archive/html/bug-bison/2018-05/msg00033.html ##
## ----------------------------------------------------------------- ##
-AT_SETUP([Predicates])
+m4_pushdef([AT_TEST],
+[AT_SETUP([Predicates: $1])
-AT_BISON_OPTION_PUSHDEFS([%glr-parser])
+AT_BISON_OPTION_PUSHDEFS([%glr-parser $1])
AT_DATA_GRAMMAR([input.y],
[[%define parse.assert
%glr-parser
%define parse.error verbose
%expect-rr 1
+]$1[
+
%code requires
{
#include <assert.h>
@@ -1805,3 +1942,8 @@ AT_PARSER_CHECK([[input Nwio]], [1], [], [[syntax error,
unexpected 'o', expecti
AT_BISON_OPTION_POPDEFS
AT_CLEANUP
+])
+
+AT_TEST([%skeleton "glr.c"])
+
+m4_popdef([AT_TEST])
--
2.29.2
- [PATCH 0/7] tests: glr: run the glr regression tests with glr.cc, Akim Demaille, 2020/12/05
- [PATCH 1/7] glr.cc: don't "leak" yyparse, Akim Demaille, 2020/12/05
- [PATCH 2/7] tests: formatting changes, Akim Demaille, 2020/12/05
- [PATCH 3/7] tests: factor the access to token kinds, Akim Demaille, 2020/12/05
- [PATCH 4/7] tests: glr: prefer directives to warnings, Akim Demaille, 2020/12/05
- [PATCH 5/7] tests: glr: use AT_FULL_COMPILE, Akim Demaille, 2020/12/05
- [PATCH 6/7] tests: glr: prepare for more languages,
Akim Demaille <=
- [PATCH 7/7] tests: glr: run the glr regression tests with glr.cc, Akim Demaille, 2020/12/05