# Create FILE-NAME, containing a self checking parser for a huge
# triangular grammar.
m4_define([AT_DATA_TRIANGULAR_GRAMMAR],
-[AT_DATA([[gengram.pl]],
+[AT_BISON_OPTION_PUSHDEFS
+AT_DATA([[gengram.pl]],
[[#! /usr/bin/perl -w
use strict;
%{
#include <stdio.h>
#include <stdlib.h>
-
-static int yylex (void);
-static void yyerror (const char *msg);
+#include <assert.h>
+#define MAX $max
+]AT_YYLEX_DECLARE[
+]AT_YYERROR_DECLARE[
%}
%union
{
print <<EOF;
%%
input:
- exp { if (\@S|@1 != 0) abort (); \$\$ = \@S|@1; }
-| input exp { if (\@S|@2 != \@S|@1 + 1) abort (); \$\$ = \@S|@2; }
+ exp { assert (\@S|@1 == 0); \$\$ = \@S|@1; }
+| input exp { assert (\@S|@2 == \@S|@1 + 1); \$\$ = \@S|@2; }
;
exp:
{
use Text::Wrap;
print wrap ("| ", " ",
- (map { "\"$_\"" } (1 .. $size)),
- " END \n"),
- " { \$\$ = $size; }\n";
+ (map { "\"$_\"" } (1 .. $size)),
+ " END \n"),
+ " { \$\$ = $size; }\n";
};
print ";\n";
-print <<EOF;
+print <<\EOF;
%%
+]AT_YYERROR_DEFINE[
static int
yylex (void)
{
static int inner = 1;
static int outer = 0;
- if (outer > $max)
+ if (outer > MAX)
return 0;
else if (inner > outer)
{
}
return inner++;
}
-
-static void
-yyerror (const char *msg)
-{
- fprintf (stderr, "%s\\n", msg);
-}
-
int
main (void)
{
}
EOF
]])
+AT_BISON_OPTION_POPDEFS
AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout])
mv stdout $1
# Create FILE-NAME, containing a self checking parser for a huge
# horizontal grammar.
m4_define([AT_DATA_HORIZONTAL_GRAMMAR],
-[AT_DATA([[gengram.pl]],
+[AT_BISON_OPTION_PUSHDEFS
+AT_DATA([[gengram.pl]],
[[#! /usr/bin/perl -w
use strict;
%{
#include <stdio.h>
#include <stdlib.h>
-
-static int yylex (void);
-static void yyerror (const char *msg);
+#define MAX $max
+]AT_YYLEX_DECLARE[
+]AT_YYERROR_DECLARE[
%}
%token
use Text::Wrap;
print
wrap ("exp: ", " ",
- (map { "\"$_\"" } (1 .. $max)), ";"),
+ (map { "\"$_\"" } (1 .. $max)), ";"),
"\n";
-print <<EOF;
+print <<\EOF;
%%
+#include <assert.h>
+]AT_YYERROR_DEFINE[
static int
yylex (void)
{
static int counter = 1;
- if (counter <= $max)
+ if (counter <= MAX)
return counter++;
- if (counter++ != $max + 1)
- abort ();
+ assert (counter++ == MAX + 1);
return 0;
}
-static void
-yyerror (const char *msg)
-{
- fprintf (stderr, "%s\\n", msg);
-}
-
int
main (void)
{
AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout])
mv stdout $1
+AT_BISON_OPTION_POPDEFS
])
# Create FILE-NAME, containing a self checking parser for a grammar
# requiring SIZE lookahead tokens.
m4_define([AT_DATA_LOOKAHEAD_TOKENS_GRAMMAR],
-[AT_DATA([[gengram.pl]],
+[AT_BISON_OPTION_PUSHDEFS
+AT_DATA([[gengram.pl]],
[[#! /usr/bin/perl -w
use strict;
# include <stdio.h>
# include <stdlib.h>
# include <assert.h>
-
-static int yylex (void);
-static void yyerror (const char *msg);
+# define MAX $max
+]AT_YYLEX_DECLARE[
+]AT_YYERROR_DECLARE[
%}
%union
{
print
wrap ("%type <val> ",
- " ",
- map { "n$_" } (1 .. $max)),
+ " ",
+ map { "n$_" } (1 .. $max)),
"\n";
print "%token\n";
print "n$count: token { \$\$ = $count; };\n";
};
-print <<EOF;
+print <<\EOF;
%%
+]AT_YYERROR_DEFINE[
static int
yylex (void)
{
static int return_token = 1;
static int counter = 1;
- if (counter > $max)
+ if (counter > MAX)
{
- if (counter++ != $max + 1)
- abort ();
+ assert (counter++ == MAX + 1);
return 0;
}
if (return_token)
return counter++;
}
-static void
-yyerror (const char *msg)
-{
- fprintf (stderr, "%s\\n", msg);
-}
-
int
main (void)
{
AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout])
mv stdout $1
+AT_BISON_OPTION_POPDEFS
])
# ------------------------------------------------
# A parser specialized in torturing the stack size.
m4_define([AT_DATA_STACK_TORTURE],
-[# A grammar of parens growing the stack thanks to right recursion.
+[AT_BISON_OPTION_PUSHDEFS([$2])
+# A grammar of parens growing the stack thanks to right recursion.
# exp:
AT_DATA([input.y],
[[%{
#include <stdio.h>
#include <stdlib.h>
]$1[
- static int yylex (void);
- static void yyerror (const char *msg);
+ ]AT_YYLEX_DECLARE[
+ ]AT_YYERROR_DECLARE[
%}
]$2[
%error-verbose
%%
exp: WAIT_FOR_EOF exp | ;
%%
-static void
-yyerror (const char *msg)
-{
- fprintf (stderr, "%s\n", msg);
-}
-
+]AT_YYERROR_DEFINE[
+#include <assert.h>
static int
yylex (void)
{
- if (yylval < 0)
- abort ();
+ assert (0 <= yylval);
if (yylval--)
return WAIT_FOR_EOF;
else
{
char *endp;
YYSTYPE yylval_init;
- if (argc != 2)
- abort ();
+ assert (argc == 2);
yylval_init = strtol (argv[1], &endp, 10);
- if (! (argv[1] != endp
- && 0 <= yylval_init && yylval_init <= INT_MAX
- && errno != ERANGE))
- abort ();
+ assert (argv[1] != endp);
+ assert (0 <= yylval_init);
+ assert (yylval_init <= INT_MAX);
+ assert (errno != ERANGE);
yydebug = 1;
{
int count;
[[ new_status = yypull_parse (ps);
]],
[[ new_status = yyparse ();
-]])[ if (count > 0 && new_status != status)
- abort ();
+]])[ assert (0 <= count || new_status == status);
status = new_status;
}
]m4_bmatch([$2], [%push-],
}
}
]])
+AT_BISON_OPTION_POPDEFS([$2])
AT_BISON_CHECK([-o input.c input.y])
AT_COMPILE([input])
])