mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-10 12:53:03 +00:00
c: no longer require stdio.h when locations are enabled
Recent changes (in 2.7) introduced a dependency on both FILE and fprintf, which are "available" only in %debug mode. This was to define yy_location_print_, which is used only in %debug mode by the parser, but massively used by the test suite to output the locations in yyerror. Break this dependency: the test suite should define its own routines to display the locations. Eventually Bison will provide the user with a means to display locations, but not yet. * data/c.m4 (b4_yy_location_print_define): Use YYFPRINTF instead of fprintf directly. * data/yacc.c (b4_yy_location_print_define): Invoke it only in %debug mode, so that stdio.h is included (needed for FILE*), and YYFPRINTF is defined. * tests/local.at (AT_YYERROR_DECLARE, AT_YYERROR_DEFINE): Declare and define location_print and LOCATION_PRINT. * tests/actions.at, tests/existing.at, tests/glr-regression.at, * tests/input.at, tests/named-refs.at, tests/regression.at: Adjust to use them. Fix the expected line numbers (as the prologue's length has changed).
This commit is contained in:
5
NEWS
5
NEWS
@@ -41,6 +41,11 @@ GNU Bison NEWS
|
|||||||
This is has been fixed: yylval, yynerrs, yychar, and yylloc are now valid
|
This is has been fixed: yylval, yynerrs, yychar, and yylloc are now valid
|
||||||
identifiers for user-provided variables.
|
identifiers for user-provided variables.
|
||||||
|
|
||||||
|
*** stdio.h is no longer needed when locations are enabled (yacc.c)
|
||||||
|
|
||||||
|
Changes in Bison 2.7 introduced a dependency on FILE and fprintf when
|
||||||
|
locations are enabled. This is fixed.
|
||||||
|
|
||||||
** Diagnostics reported by Bison
|
** Diagnostics reported by Bison
|
||||||
|
|
||||||
Most of these features were contributed by Théophile Ranquet and Victor
|
Most of these features were contributed by Théophile Ranquet and Victor
|
||||||
|
|||||||
12
data/c.m4
12
data/c.m4
@@ -631,25 +631,25 @@ __attribute__((__unused__))
|
|||||||
int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
|
int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
|
||||||
if (0 <= yylocp->first_line)
|
if (0 <= yylocp->first_line)
|
||||||
{
|
{
|
||||||
res += fprintf (yyo, "%d", yylocp->first_line);
|
res += YYFPRINTF (yyo, "%d", yylocp->first_line);
|
||||||
if (0 <= yylocp->first_column)
|
if (0 <= yylocp->first_column)
|
||||||
res += fprintf (yyo, ".%d", yylocp->first_column);
|
res += YYFPRINTF (yyo, ".%d", yylocp->first_column);
|
||||||
}
|
}
|
||||||
if (0 <= yylocp->last_line)
|
if (0 <= yylocp->last_line)
|
||||||
{
|
{
|
||||||
if (yylocp->first_line < yylocp->last_line)
|
if (yylocp->first_line < yylocp->last_line)
|
||||||
{
|
{
|
||||||
res += fprintf (yyo, "-%d", yylocp->last_line);
|
res += YYFPRINTF (yyo, "-%d", yylocp->last_line);
|
||||||
if (0 <= end_col)
|
if (0 <= end_col)
|
||||||
res += fprintf (yyo, ".%d", end_col);
|
res += YYFPRINTF (yyo, ".%d", end_col);
|
||||||
}
|
}
|
||||||
else if (0 <= end_col && yylocp->first_column < end_col)
|
else if (0 <= end_col && yylocp->first_column < end_col)
|
||||||
res += fprintf (yyo, "-%d", end_col);
|
res += YYFPRINTF (yyo, "-%d", end_col);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
# define YY_LOCATION_PRINT(File, Loc) \
|
# define YY_LOCATION_PRINT(File, Loc) \
|
||||||
yy_location_print_ (File, &(Loc))
|
yy_location_print_ (File, &(Loc))
|
||||||
|
|
||||||
# else
|
# else
|
||||||
|
|||||||
@@ -396,7 +396,6 @@ dnl We probably ought to introduce a type for confl.
|
|||||||
]b4_yylloc_default_define[
|
]b4_yylloc_default_define[
|
||||||
# define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
|
# define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
|
||||||
]])[
|
]])[
|
||||||
]b4_yy_location_print_define[
|
|
||||||
|
|
||||||
]b4_pure_if(
|
]b4_pure_if(
|
||||||
[
|
[
|
||||||
@@ -437,6 +436,8 @@ typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG;
|
|||||||
# define YYFPRINTF fprintf
|
# define YYFPRINTF fprintf
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
]b4_yy_location_print_define[
|
||||||
|
|
||||||
# define YYDPRINTF(Args) \
|
# define YYDPRINTF(Args) \
|
||||||
do { \
|
do { \
|
||||||
if (yydebug) \
|
if (yydebug) \
|
||||||
|
|||||||
@@ -676,7 +676,6 @@ while (0)
|
|||||||
]b4_yylloc_default_define[
|
]b4_yylloc_default_define[
|
||||||
#define YYRHSLOC(Rhs, K) ((Rhs)[K])
|
#define YYRHSLOC(Rhs, K) ((Rhs)[K])
|
||||||
]])[
|
]])[
|
||||||
]b4_yy_location_print_define[
|
|
||||||
|
|
||||||
/* Enable debugging if requested. */
|
/* Enable debugging if requested. */
|
||||||
#if ]b4_api_PREFIX[DEBUG
|
#if ]b4_api_PREFIX[DEBUG
|
||||||
@@ -692,6 +691,8 @@ do { \
|
|||||||
YYFPRINTF Args; \
|
YYFPRINTF Args; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
]b4_yy_location_print_define[
|
||||||
|
|
||||||
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
|
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
|
||||||
do { \
|
do { \
|
||||||
if (yydebug) \
|
if (yydebug) \
|
||||||
|
|||||||
@@ -32,10 +32,10 @@ AT_BISON_OPTION_PUSHDEFS
|
|||||||
AT_DATA_GRAMMAR([[input.y]],
|
AT_DATA_GRAMMAR([[input.y]],
|
||||||
[[%define parse.error verbose
|
[[%define parse.error verbose
|
||||||
%debug
|
%debug
|
||||||
%{
|
%code {
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
%}
|
}
|
||||||
%%
|
%%
|
||||||
exp: { putchar ('0'); }
|
exp: { putchar ('0'); }
|
||||||
'1' { putchar ('1'); }
|
'1' { putchar ('1'); }
|
||||||
@@ -92,7 +92,7 @@ AT_DATA_GRAMMAR([[input.y]],
|
|||||||
}
|
}
|
||||||
%%
|
%%
|
||||||
exp: { ]AT_SKEL_CC_IF([[std::cerr << @$ << std::endl]],
|
exp: { ]AT_SKEL_CC_IF([[std::cerr << @$ << std::endl]],
|
||||||
[[YY_LOCATION_PRINT(stderr, @$); fputc ('\n', stderr)]])[; }
|
[[LOCATION_PRINT(stderr, @$); fputc ('\n', stderr)]])[; }
|
||||||
%%
|
%%
|
||||||
]AT_YYERROR_DEFINE[
|
]AT_YYERROR_DEFINE[
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ AT_TEST([glr.cc])
|
|||||||
AT_TEST([yacc.c], [%define api.pure full],
|
AT_TEST([yacc.c], [%define api.pure full],
|
||||||
[[%{
|
[[%{
|
||||||
# define YYLTYPE int
|
# define YYLTYPE int
|
||||||
# define YY_LOCATION_PRINT(Stream, Loc) \
|
# define LOCATION_PRINT(Stream, Loc) \
|
||||||
(void) (Loc)
|
(void) (Loc)
|
||||||
# define YYLLOC_DEFAULT(Current, Rhs, N) \
|
# define YYLLOC_DEFAULT(Current, Rhs, N) \
|
||||||
(Current) = ((Rhs)[N ? 1 : 0])
|
(Current) = ((Rhs)[N ? 1 : 0])
|
||||||
@@ -157,7 +157,7 @@ AT_TEST([yacc.c], [%define api.pure full],
|
|||||||
AT_TEST([yacc.c], [%define api.pure full],
|
AT_TEST([yacc.c], [%define api.pure full],
|
||||||
[[%{
|
[[%{
|
||||||
# define YYLTYPE int
|
# define YYLTYPE int
|
||||||
# define YY_LOCATION_PRINT(Stream, Loc) \
|
# define LOCATION_PRINT(Stream, Loc) \
|
||||||
fprintf ((Stream), "%d", (Loc))
|
fprintf ((Stream), "%d", (Loc))
|
||||||
# define YYLLOC_DEFAULT(Current, Rhs, N) \
|
# define YYLLOC_DEFAULT(Current, Rhs, N) \
|
||||||
(Current) = ((Rhs)[N ? 1 : 0])
|
(Current) = ((Rhs)[N ? 1 : 0])
|
||||||
@@ -190,8 +190,6 @@ AT_DATA_GRAMMAR([[input.y]],
|
|||||||
]$3[
|
]$3[
|
||||||
%code
|
%code
|
||||||
{
|
{
|
||||||
# include <stdio.h>
|
|
||||||
# include <stdlib.h> /* getenv */
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
}
|
}
|
||||||
@@ -212,7 +210,7 @@ main (void)
|
|||||||
loc.]AT_LAST_LINE[ = L2; \
|
loc.]AT_LAST_LINE[ = L2; \
|
||||||
loc.]AT_LAST_COLUMN[ = C2; \
|
loc.]AT_LAST_COLUMN[ = C2; \
|
||||||
]AT_SKEL_CC_IF([std::cout << loc],
|
]AT_SKEL_CC_IF([std::cout << loc],
|
||||||
[YY_LOCATION_PRINT(stdout, loc)])[;\
|
[LOCATION_PRINT(stdout, loc)])[;\
|
||||||
putchar ('\n');
|
putchar ('\n');
|
||||||
|
|
||||||
TEST(1, 1, 1, 1);
|
TEST(1, 1, 1, 1);
|
||||||
@@ -259,11 +257,11 @@ AT_BISON_OPTION_PUSHDEFS
|
|||||||
AT_DATA_GRAMMAR([[input.y]],
|
AT_DATA_GRAMMAR([[input.y]],
|
||||||
[[%define parse.error verbose
|
[[%define parse.error verbose
|
||||||
%debug
|
%debug
|
||||||
%{
|
%code {
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
# define USE(Var)
|
# define USE(Var)
|
||||||
%}
|
}
|
||||||
|
|
||||||
%union
|
%union
|
||||||
{
|
{
|
||||||
@@ -309,7 +307,6 @@ AT_PARSER_CHECK([./input], 0,
|
|||||||
AT_DATA_GRAMMAR([[input.y]],
|
AT_DATA_GRAMMAR([[input.y]],
|
||||||
[[
|
[[
|
||||||
%{
|
%{
|
||||||
# include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
typedef struct { int val; } stype;
|
typedef struct { int val; } stype;
|
||||||
@@ -764,13 +761,11 @@ AT_DATA_GRAMMAR([[input.y]],
|
|||||||
%debug
|
%debug
|
||||||
%locations
|
%locations
|
||||||
|
|
||||||
%{
|
%code {
|
||||||
# include <stdio.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
# define USE(SYM)
|
# define USE(SYM)
|
||||||
%}
|
}
|
||||||
|
|
||||||
%printer {
|
%printer {
|
||||||
fprintf (yyoutput, "<*> printer should not be called.\n");
|
fprintf (yyoutput, "<*> printer should not be called.\n");
|
||||||
@@ -805,8 +800,8 @@ start: 'a' 'b' 'c' 'd' 'e' { $$ = 'S'; USE(($1, $2, $3, $4, $5)); } ;
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
AT_BISON_CHECK([-o input.c input.y], [], [],
|
AT_BISON_CHECK([-o input.c input.y], [], [],
|
||||||
[[input.y:23.3-5: warning: useless %destructor for type <*> [-Wother]
|
[[input.y:30.3-5: warning: useless %destructor for type <*> [-Wother]
|
||||||
input.y:23.3-5: warning: useless %printer for type <*> [-Wother]
|
input.y:30.3-5: warning: useless %printer for type <*> [-Wother]
|
||||||
]])
|
]])
|
||||||
AT_COMPILE([input])
|
AT_COMPILE([input])
|
||||||
AT_PARSER_CHECK([./input --debug], 1,
|
AT_PARSER_CHECK([./input --debug], 1,
|
||||||
@@ -859,8 +854,6 @@ AT_DATA_GRAMMAR([[input.y]],
|
|||||||
%debug
|
%debug
|
||||||
|
|
||||||
%{
|
%{
|
||||||
# include <stdio.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
# define USE(SYM)
|
# define USE(SYM)
|
||||||
@@ -988,13 +981,11 @@ AT_DATA_GRAMMAR([[input]]$1[[.y]],
|
|||||||
%debug
|
%debug
|
||||||
%locations
|
%locations
|
||||||
|
|
||||||
%{
|
%code {
|
||||||
# include <stdio.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
# define USE(SYM)
|
# define USE(SYM)
|
||||||
%}
|
}
|
||||||
|
|
||||||
%destructor {
|
%destructor {
|
||||||
fprintf (yyoutput, "<]]not_kind[[> destructor should not be called.\n");
|
fprintf (yyoutput, "<]]not_kind[[> destructor should not be called.\n");
|
||||||
@@ -1022,7 +1013,7 @@ AT_DATA_GRAMMAR([[input]]$1[[.y]],
|
|||||||
start: { $$ = 'S'; } ;
|
start: { $$ = 'S'; } ;
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
#include <stdlib.h> // abort
|
||||||
static int
|
static int
|
||||||
yylex (void)
|
yylex (void)
|
||||||
{
|
{
|
||||||
@@ -1041,11 +1032,11 @@ AT_BISON_OPTION_POPDEFS
|
|||||||
|
|
||||||
AT_BISON_CHECK([-o input$1.c input$1.y], [], [],
|
AT_BISON_CHECK([-o input$1.c input$1.y], [], [],
|
||||||
[m4_if([$1], [0],
|
[m4_if([$1], [0],
|
||||||
[[input0.y:23.3-5: warning: useless %destructor for type <*> [-Wother]
|
[[input0.y:30.3-5: warning: useless %destructor for type <*> [-Wother]
|
||||||
input0.y:23.3-5: warning: useless %printer for type <*> [-Wother]
|
input0.y:30.3-5: warning: useless %printer for type <*> [-Wother]
|
||||||
]],
|
]],
|
||||||
[[input1.y:23.3-4: warning: useless %destructor for type <> [-Wother]
|
[[input1.y:30.3-4: warning: useless %destructor for type <> [-Wother]
|
||||||
input1.y:23.3-4: warning: useless %printer for type <> [-Wother]
|
input1.y:30.3-4: warning: useless %printer for type <> [-Wother]
|
||||||
]])])
|
]])])
|
||||||
|
|
||||||
AT_COMPILE([input$1])
|
AT_COMPILE([input$1])
|
||||||
@@ -1056,7 +1047,7 @@ AT_PARSER_CHECK([./input$1 --debug], 0,
|
|||||||
]],
|
]],
|
||||||
[[Starting parse
|
[[Starting parse
|
||||||
Entering state 0
|
Entering state 0
|
||||||
Reducing stack by rule 1 (line 42):
|
Reducing stack by rule 1 (line 49):
|
||||||
-> $$ = nterm start (1.1: <]]kind[[> for 'S' @ 1)
|
-> $$ = nterm start (1.1: <]]kind[[> for 'S' @ 1)
|
||||||
Stack now 0
|
Stack now 0
|
||||||
Entering state 1
|
Entering state 1
|
||||||
@@ -1131,8 +1122,8 @@ start:
|
|||||||
AT_BISON_OPTION_POPDEFS
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
|
||||||
AT_BISON_CHECK([-o input.c input.y], [], [],
|
AT_BISON_CHECK([-o input.c input.y], [], [],
|
||||||
[[input.y:21.6-8: warning: useless %destructor for type <*> [-Wother]
|
[[input.y:23.6-8: warning: useless %destructor for type <*> [-Wother]
|
||||||
input.y:21.6-8: warning: useless %printer for type <*> [-Wother]
|
input.y:23.6-8: warning: useless %printer for type <*> [-Wother]
|
||||||
]])
|
]])
|
||||||
AT_COMPILE([input])
|
AT_COMPILE([input])
|
||||||
AT_PARSER_CHECK([./input --debug], [1], [],
|
AT_PARSER_CHECK([./input --debug], [1], [],
|
||||||
@@ -1229,8 +1220,8 @@ start: { USE($$); } ;
|
|||||||
AT_BISON_OPTION_POPDEFS
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
|
||||||
AT_BISON_CHECK([-o input.c input.y], [], [],
|
AT_BISON_CHECK([-o input.c input.y], [], [],
|
||||||
[[input.y:22.3-4: warning: useless %destructor for type <> [-Wother]
|
[[input.y:24.3-4: warning: useless %destructor for type <> [-Wother]
|
||||||
input.y:22.3-4: warning: useless %printer for type <> [-Wother]
|
input.y:24.3-4: warning: useless %printer for type <> [-Wother]
|
||||||
]])
|
]])
|
||||||
AT_COMPILE([input])
|
AT_COMPILE([input])
|
||||||
|
|
||||||
@@ -1249,14 +1240,12 @@ AT_DATA_GRAMMAR([[input.y]],
|
|||||||
[[%debug /* So that %printer is actually compiled. */
|
[[%debug /* So that %printer is actually compiled. */
|
||||||
|
|
||||||
%{
|
%{
|
||||||
# include <stdio.h>
|
|
||||||
# include <stdlib.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
# define USE(SYM)
|
# define USE(SYM)
|
||||||
# define YYLTYPE int
|
# define YYLTYPE int
|
||||||
# define YYLLOC_DEFAULT(Current, Rhs, N) (void)(Rhs)
|
# define YYLLOC_DEFAULT(Current, Rhs, N) (void)(Rhs)
|
||||||
# define YY_LOCATION_PRINT(File, Loc)
|
# define LOCATION_PRINT(File, Loc)
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%printer { fprintf (yyoutput, "%d", @$); } <>
|
%printer { fprintf (yyoutput, "%d", @$); } <>
|
||||||
|
|||||||
@@ -1953,7 +1953,7 @@ dnl without being followed by "of".)
|
|||||||
[[VARIABLE, '=', LABEL, LEFT, DOT_X]],
|
[[VARIABLE, '=', LABEL, LEFT, DOT_X]],
|
||||||
|
|
||||||
dnl BISON-STDERR
|
dnl BISON-STDERR
|
||||||
[[input.y:470.11-48: warning: rule useless in parser due to conflicts: path: ORDINAL LAST object_type relative_path [-Wother]
|
[[input.y:471.11-48: warning: rule useless in parser due to conflicts: path: ORDINAL LAST object_type relative_path [-Wother]
|
||||||
]],
|
]],
|
||||||
|
|
||||||
dnl LAST-STATE
|
dnl LAST-STATE
|
||||||
|
|||||||
@@ -1643,10 +1643,10 @@ sym3: %merge<merge> { $$ = 0; } ;
|
|||||||
AT_BISON_OPTION_POPDEFS
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
|
||||||
AT_BISON_CHECK([[-o glr-regr18.c glr-regr18.y]], 1, [],
|
AT_BISON_CHECK([[-o glr-regr18.c glr-regr18.y]], 1, [],
|
||||||
[[glr-regr18.y:26.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
|
[[glr-regr18.y:28.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
|
||||||
glr-regr18.y:25.18-24: previous declaration
|
glr-regr18.y:27.18-24: previous declaration
|
||||||
glr-regr18.y:27.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
|
glr-regr18.y:29.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
|
||||||
glr-regr18.y:26.18-24: previous declaration
|
glr-regr18.y:28.18-24: previous declaration
|
||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
@@ -1699,14 +1699,14 @@ Entering state 1
|
|||||||
Reading a token: Next token is token 'b' ()
|
Reading a token: Next token is token 'b' ()
|
||||||
Shifting token 'b' ()
|
Shifting token 'b' ()
|
||||||
Entering state 3
|
Entering state 3
|
||||||
Reducing stack 0 by rule 3 (line 25):
|
Reducing stack 0 by rule 3 (line 27):
|
||||||
$1 = token 'b' ()
|
$1 = token 'b' ()
|
||||||
-> $$ = nterm b ()
|
-> $$ = nterm b ()
|
||||||
Entering state 4
|
Entering state 4
|
||||||
Reading a token: Next token is token 'c' ()
|
Reading a token: Next token is token 'c' ()
|
||||||
Shifting token 'c' ()
|
Shifting token 'c' ()
|
||||||
Entering state 6
|
Entering state 6
|
||||||
Reducing stack 0 by rule 4 (line 26):
|
Reducing stack 0 by rule 4 (line 28):
|
||||||
-> $$ = nterm d ()
|
-> $$ = nterm d ()
|
||||||
Entering state 7
|
Entering state 7
|
||||||
Reading a token: Now at end of input.
|
Reading a token: Now at end of input.
|
||||||
|
|||||||
@@ -972,13 +972,13 @@ AT_BISON_OPTION_POPDEFS
|
|||||||
# POSIX Yacc accept periods, but not dashes.
|
# POSIX Yacc accept periods, but not dashes.
|
||||||
AT_BISON_CHECK([--yacc -Wno-error input.y], [], [],
|
AT_BISON_CHECK([--yacc -Wno-error input.y], [], [],
|
||||||
[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc]
|
[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc]
|
||||||
input.y:18.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc]
|
input.y:20.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc]
|
||||||
]])
|
]])
|
||||||
|
|
||||||
# So warn about them.
|
# So warn about them.
|
||||||
AT_BISON_CHECK([-Wyacc input.y], [], [],
|
AT_BISON_CHECK([-Wyacc input.y], [], [],
|
||||||
[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc]
|
[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc]
|
||||||
input.y:18.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc]
|
input.y:20.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc]
|
||||||
]])
|
]])
|
||||||
|
|
||||||
# Dashes are fine for GNU Bison.
|
# Dashes are fine for GNU Bison.
|
||||||
|
|||||||
@@ -417,12 +417,51 @@ m4_define([AT_YYERROR_DECLARE_EXTERN],
|
|||||||
|
|
||||||
m4_define([AT_YYERROR_DECLARE],
|
m4_define([AT_YYERROR_DECLARE],
|
||||||
[m4_case(AT_LANG,
|
[m4_case(AT_LANG,
|
||||||
[c], [static AT_YYERROR_DECLARE_EXTERN])[]dnl
|
[c], [#include <stdio.h>
|
||||||
|
]AT_LOCATION_IF([[
|
||||||
|
#if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL
|
||||||
|
static unsigned location_print (FILE *yyo, ]AT_YYLTYPE[ const * const yylocp);
|
||||||
|
# ifndef LOCATION_PRINT
|
||||||
|
# define LOCATION_PRINT(File, Loc) location_print (File, &(Loc))
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
]])[
|
||||||
|
static AT_YYERROR_DECLARE_EXTERN])[]dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
m4_define([AT_YYERROR_DEFINE],
|
m4_define([AT_YYERROR_DEFINE],
|
||||||
[m4_case(AT_LANG,
|
[m4_case(AT_LANG,
|
||||||
[c], [[#include <stdio.h>
|
[c], [[
|
||||||
|
]AT_LOCATION_IF([[
|
||||||
|
# if defined ]AT_YYLTYPE[_IS_TRIVIAL && ]AT_YYLTYPE[_IS_TRIVIAL
|
||||||
|
/* Print *YYLOCP on YYO. */
|
||||||
|
__attribute__((__unused__))
|
||||||
|
static unsigned
|
||||||
|
location_print (FILE *yyo, ]AT_YYLTYPE[ const * const yylocp)
|
||||||
|
{
|
||||||
|
unsigned res = 0;
|
||||||
|
int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
|
||||||
|
if (0 <= yylocp->first_line)
|
||||||
|
{
|
||||||
|
res += fprintf (yyo, "%d", yylocp->first_line);
|
||||||
|
if (0 <= yylocp->first_column)
|
||||||
|
res += fprintf (yyo, ".%d", yylocp->first_column);
|
||||||
|
}
|
||||||
|
if (0 <= yylocp->last_line)
|
||||||
|
{
|
||||||
|
if (yylocp->first_line < yylocp->last_line)
|
||||||
|
{
|
||||||
|
res += fprintf (yyo, "-%d", yylocp->last_line);
|
||||||
|
if (0 <= end_col)
|
||||||
|
res += fprintf (yyo, ".%d", end_col);
|
||||||
|
}
|
||||||
|
else if (0 <= end_col && yylocp->first_column < end_col)
|
||||||
|
res += fprintf (yyo, "-%d", end_col);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
]])[
|
||||||
/* A C error reporting function. */
|
/* A C error reporting function. */
|
||||||
static
|
static
|
||||||
]AT_YYERROR_PROTOTYPE[
|
]AT_YYERROR_PROTOTYPE[
|
||||||
@@ -430,7 +469,7 @@ static
|
|||||||
[[^,]+[^A-Za-z_0-9]\([A-Za-z_][A-Za-z_0-9]*\), *], [
|
[[^,]+[^A-Za-z_0-9]\([A-Za-z_][A-Za-z_0-9]*\), *], [
|
||||||
YYUSE(\1);])dnl
|
YYUSE(\1);])dnl
|
||||||
AT_YYERROR_SEES_LOC_IF([[
|
AT_YYERROR_SEES_LOC_IF([[
|
||||||
YY_LOCATION_PRINT (stderr, ]AT_LOC[);
|
LOCATION_PRINT (stderr, ]AT_LOC[);
|
||||||
fprintf (stderr, ": ");]])[
|
fprintf (stderr, ": ");]])[
|
||||||
fprintf (stderr, "%s\n", msg);
|
fprintf (stderr, "%s\n", msg);
|
||||||
}]],
|
}]],
|
||||||
@@ -884,7 +923,6 @@ AT_SETUP([$1])
|
|||||||
AT_BISON_OPTION_PUSHDEFS([$4])
|
AT_BISON_OPTION_PUSHDEFS([$4])
|
||||||
AT_DATA_GRAMMAR([[input.y]],
|
AT_DATA_GRAMMAR([[input.y]],
|
||||||
[[%code {
|
[[%code {
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
}
|
}
|
||||||
@@ -907,11 +945,7 @@ yylex (void)
|
|||||||
return *inputp++;
|
return *inputp++;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
]AT_MAIN_DEFINE[
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
return yyparse ();
|
|
||||||
}
|
|
||||||
]])
|
]])
|
||||||
|
|
||||||
# In some versions of Autoconf, AT_CHECK invokes AS_ESCAPE before
|
# In some versions of Autoconf, AT_CHECK invokes AS_ESCAPE before
|
||||||
|
|||||||
@@ -188,7 +188,9 @@ AT_CLEANUP
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#######################################################################
|
## ------------------------------------ ##
|
||||||
|
## Undefined and ambiguous references. ##
|
||||||
|
## ------------------------------------ ##
|
||||||
|
|
||||||
|
|
||||||
AT_SETUP([Undefined and ambiguous references])
|
AT_SETUP([Undefined and ambiguous references])
|
||||||
@@ -250,44 +252,47 @@ exp:
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
AT_BISON_CHECK([-fcaret -o test.c test.y], 1, [],
|
AT_BISON_CHECK([-fcaret -o test.c test.y], 1, [],
|
||||||
[[test.y:50.51-60: error: invalid reference: '$<ival>lo9'
|
[[test.y:52.51-60: error: invalid reference: '$<ival>lo9'
|
||||||
| exp[x] '+' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>lo9 + $r; }
|
| exp[x] '+' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>lo9 + $r; }
|
||||||
^^^^^^^^^^
|
^^^^^^^^^^
|
||||||
test.y:50.3-68: symbol not found in production: lo9
|
test.y:52.3-68: symbol not found in production: lo9
|
||||||
| exp[x] '+' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>lo9 + $r; }
|
| exp[x] '+' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>lo9 + $r; }
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
test.y:51.51-60: warning: misleading reference: '$<ival>exp' [-Wother]
|
test.y:53.51-60: warning: misleading reference: '$<ival>exp' [-Wother]
|
||||||
| exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
|
| exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
|
||||||
^^^^^^^^^^
|
^^^^^^^^^^
|
||||||
test.y:42.1-3: refers to: $exp at $$
|
test.y:44.1-3: refers to: $exp at $$
|
||||||
exp:
|
exp:
|
||||||
^^^
|
^^^
|
||||||
test.y:51.7: possibly meant: $x, hiding $exp at $1
|
test.y:53.7: possibly meant: $x, hiding $exp at $1
|
||||||
| exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
|
| exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
|
||||||
^
|
^
|
||||||
test.y:51.41: possibly meant: $r, hiding $exp at $4
|
test.y:53.41: possibly meant: $r, hiding $exp at $4
|
||||||
| exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
|
| exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
|
||||||
^
|
^
|
||||||
test.y:52.51-52: error: $l of 'exp' has no declared type
|
test.y:54.51-52: error: $l of 'exp' has no declared type
|
||||||
| exp[x] '*' { $<ival>$ = $x; } [l] exp[r] { $$ = $l * $r; }
|
| exp[x] '*' { $<ival>$ = $x; } [l] exp[r] { $$ = $l * $r; }
|
||||||
^^
|
^^
|
||||||
test.y:55.40-43: error: invalid reference: '$r12'
|
test.y:57.40-43: error: invalid reference: '$r12'
|
||||||
| exp[l] '^' exp[r] { $$ = power ($l, $r12); }
|
| exp[l] '^' exp[r] { $$ = power ($l, $r12); }
|
||||||
^^^^
|
^^^^
|
||||||
test.y:55.3-47: symbol not found in production: r12
|
test.y:57.3-47: symbol not found in production: r12
|
||||||
| exp[l] '^' exp[r] { $$ = power ($l, $r12); }
|
| exp[l] '^' exp[r] { $$ = power ($l, $r12); }
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
test.y:56.29-33: error: invalid reference: '$expo'
|
test.y:58.29-33: error: invalid reference: '$expo'
|
||||||
| '(' exp ')' { $$ = $expo; }
|
| '(' exp ')' { $$ = $expo; }
|
||||||
^^^^^
|
^^^^^
|
||||||
test.y:56.3-46: symbol not found in production: expo
|
test.y:58.3-46: symbol not found in production: expo
|
||||||
| '(' exp ')' { $$ = $expo; }
|
| '(' exp ')' { $$ = $expo; }
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
]])
|
]])
|
||||||
AT_BISON_OPTION_POPDEFS
|
AT_BISON_OPTION_POPDEFS
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
|
|
||||||
#######################################################################
|
|
||||||
|
## ----------------------- ##
|
||||||
|
## Misleading references. ##
|
||||||
|
## ----------------------- ##
|
||||||
|
|
||||||
AT_SETUP([Misleading references])
|
AT_SETUP([Misleading references])
|
||||||
AT_DATA_GRAMMAR([test.y],
|
AT_DATA_GRAMMAR([test.y],
|
||||||
|
|||||||
@@ -130,7 +130,6 @@ AT_SETUP([Early token definitions without --yacc])
|
|||||||
AT_BISON_OPTION_PUSHDEFS
|
AT_BISON_OPTION_PUSHDEFS
|
||||||
AT_DATA_GRAMMAR([input.y],
|
AT_DATA_GRAMMAR([input.y],
|
||||||
[[%{
|
[[%{
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE_EXTERN[
|
]AT_YYERROR_DECLARE_EXTERN[
|
||||||
]AT_YYLEX_DECLARE_EXTERN[
|
]AT_YYLEX_DECLARE_EXTERN[
|
||||||
void print_my_token (void);
|
void print_my_token (void);
|
||||||
@@ -141,6 +140,7 @@ void print_my_token (void);
|
|||||||
int val;
|
int val;
|
||||||
};
|
};
|
||||||
%{
|
%{
|
||||||
|
#include <stdio.h>
|
||||||
void
|
void
|
||||||
print_my_token (void)
|
print_my_token (void)
|
||||||
{
|
{
|
||||||
@@ -446,8 +446,6 @@ AT_BISON_OPTION_PUSHDEFS
|
|||||||
# Bison managed, when fed with '%token 'f' "f"' to #define 'f'!
|
# Bison managed, when fed with '%token 'f' "f"' to #define 'f'!
|
||||||
AT_DATA_GRAMMAR([input.y],
|
AT_DATA_GRAMMAR([input.y],
|
||||||
[%{
|
[%{
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
%}
|
%}
|
||||||
@@ -920,8 +918,7 @@ m4_define([_AT_DATA_EXPECT2_Y],
|
|||||||
[%{
|
[%{
|
||||||
static int yylex (AT_LALR1_CC_IF([int *], [void]));
|
static int yylex (AT_LALR1_CC_IF([int *], [void]));
|
||||||
AT_LALR1_CC_IF([[#include <cstdlib>]],
|
AT_LALR1_CC_IF([[#include <cstdlib>]],
|
||||||
[[#include <stdlib.h>
|
[[
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE])[
|
]AT_YYERROR_DECLARE])[
|
||||||
%}
|
%}
|
||||||
$1
|
$1
|
||||||
@@ -999,13 +996,11 @@ AT_SETUP([Braced code in declaration in rules section])
|
|||||||
AT_BISON_OPTION_PUSHDEFS([%debug])
|
AT_BISON_OPTION_PUSHDEFS([%debug])
|
||||||
AT_DATA_GRAMMAR([input.y],
|
AT_DATA_GRAMMAR([input.y],
|
||||||
[[%{
|
[[%{
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
%}
|
%}
|
||||||
%debug
|
%debug
|
||||||
%error-verbose
|
%error-verbose
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
start:
|
start:
|
||||||
@@ -1123,11 +1118,10 @@ AT_SETUP([[Token number in precedence declaration]])
|
|||||||
# we lost this in Bison 1.50.
|
# we lost this in Bison 1.50.
|
||||||
AT_BISON_OPTION_PUSHDEFS
|
AT_BISON_OPTION_PUSHDEFS
|
||||||
AT_DATA_GRAMMAR([input.y],
|
AT_DATA_GRAMMAR([input.y],
|
||||||
[[%{
|
[[%code {
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
%}
|
}
|
||||||
|
|
||||||
%error-verbose
|
%error-verbose
|
||||||
%right END 0
|
%right END 0
|
||||||
@@ -1153,8 +1147,8 @@ sr_conflict:
|
|||||||
AT_BISON_OPTION_POPDEFS
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
|
||||||
AT_BISON_CHECK([[-o input.c input.y]], [[0]],,
|
AT_BISON_CHECK([[-o input.c input.y]], [[0]],,
|
||||||
[[input.y:23.5-19: warning: rule useless in parser due to conflicts: start: start [-Wother]
|
[[input.y:24.5-19: warning: rule useless in parser due to conflicts: start: start [-Wother]
|
||||||
input.y:27.5-19: warning: rule useless in parser due to conflicts: sr_conflict: TK2 "tok alias" [-Wother]
|
input.y:28.5-19: warning: rule useless in parser due to conflicts: sr_conflict: TK2 "tok alias" [-Wother]
|
||||||
]])
|
]])
|
||||||
AT_COMPILE([[input]])
|
AT_COMPILE([[input]])
|
||||||
AT_PARSER_CHECK([[./input]])
|
AT_PARSER_CHECK([[./input]])
|
||||||
@@ -1197,7 +1191,6 @@ AT_SETUP([[parse.error=verbose and YYSTACK_USE_ALLOCA]])
|
|||||||
AT_BISON_OPTION_PUSHDEFS
|
AT_BISON_OPTION_PUSHDEFS
|
||||||
AT_DATA_GRAMMAR([input.y],
|
AT_DATA_GRAMMAR([input.y],
|
||||||
[[%code {
|
[[%code {
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
#define YYSTACK_USE_ALLOCA 1
|
#define YYSTACK_USE_ALLOCA 1
|
||||||
@@ -1272,7 +1265,6 @@ AT_SETUP([[parse.error=verbose overflow]])
|
|||||||
AT_BISON_OPTION_PUSHDEFS
|
AT_BISON_OPTION_PUSHDEFS
|
||||||
AT_DATA_GRAMMAR([input.y],
|
AT_DATA_GRAMMAR([input.y],
|
||||||
[[%code {
|
[[%code {
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
|
|
||||||
@@ -1386,7 +1378,6 @@ AT_BISON_OPTION_PUSHDEFS([%debug $1])
|
|||||||
|
|
||||||
AT_DATA_GRAMMAR([input.y],
|
AT_DATA_GRAMMAR([input.y],
|
||||||
[[%code {
|
[[%code {
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
int yylex (]AT_PURE_IF([[YYSTYPE *]], [[void]])[);
|
int yylex (]AT_PURE_IF([[YYSTYPE *]], [[void]])[);
|
||||||
}
|
}
|
||||||
@@ -1473,7 +1464,6 @@ m4_pushdef([AT_LAC_CHECK],
|
|||||||
[AT_BISON_OPTION_PUSHDEFS([%debug])
|
[AT_BISON_OPTION_PUSHDEFS([%debug])
|
||||||
AT_DATA_GRAMMAR([input.y],
|
AT_DATA_GRAMMAR([input.y],
|
||||||
[[%code {
|
[[%code {
|
||||||
#include <stdio.h>
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
#define YYMAXDEPTH 8
|
#define YYMAXDEPTH 8
|
||||||
@@ -1547,10 +1537,9 @@ AT_CLEANUP
|
|||||||
m4_pushdef([AT_TEST],
|
m4_pushdef([AT_TEST],
|
||||||
[AT_SETUP([[Lex and parse params: $1]])
|
[AT_SETUP([[Lex and parse params: $1]])
|
||||||
|
|
||||||
|
## FIXME: Improve parsing of parse-param.
|
||||||
AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1" %parse-param { int x } %parse-param { int y }])
|
AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1" %parse-param { int x } %parse-param { int y }])
|
||||||
|
|
||||||
## FIXME: Improve parsing of parse-param and use the generated
|
|
||||||
## yyerror.
|
|
||||||
AT_DATA_GRAMMAR([input.y],
|
AT_DATA_GRAMMAR([input.y],
|
||||||
[[%defines
|
[[%defines
|
||||||
%locations
|
%locations
|
||||||
@@ -1565,9 +1554,6 @@ AT_DATA_GRAMMAR([input.y],
|
|||||||
}
|
}
|
||||||
|
|
||||||
%{
|
%{
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
]AT_YYERROR_DECLARE[
|
]AT_YYERROR_DECLARE[
|
||||||
]AT_YYLEX_DECLARE[
|
]AT_YYLEX_DECLARE[
|
||||||
%}
|
%}
|
||||||
@@ -1609,3 +1595,33 @@ AT_TEST([lalr1.cc])
|
|||||||
AT_TEST([glr.cc])
|
AT_TEST([glr.cc])
|
||||||
|
|
||||||
m4_popdef([AT_TEST])
|
m4_popdef([AT_TEST])
|
||||||
|
|
||||||
|
|
||||||
|
## ----------------------- ##
|
||||||
|
## stdio.h is not needed. ##
|
||||||
|
## ----------------------- ##
|
||||||
|
|
||||||
|
# At some point, by accident, yy_location_print_ was using fprintf and
|
||||||
|
# FILE which are from stdio.h, which we do not require.
|
||||||
|
AT_SETUP([[stdio.h is not needed]])
|
||||||
|
|
||||||
|
AT_BISON_OPTION_PUSHDEFS
|
||||||
|
|
||||||
|
AT_DATA_GRAMMAR([input.y],
|
||||||
|
[[%locations
|
||||||
|
%code
|
||||||
|
{
|
||||||
|
static int yylex (void) { return 0; }
|
||||||
|
static void yyerror (const char* msg) { (void) msg; }
|
||||||
|
}
|
||||||
|
%%
|
||||||
|
exp: {}
|
||||||
|
%%
|
||||||
|
]AT_MAIN_DEFINE[
|
||||||
|
]])
|
||||||
|
|
||||||
|
AT_FULL_COMPILE([input])
|
||||||
|
|
||||||
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
|
||||||
|
AT_CLEANUP
|
||||||
|
|||||||
Reference in New Issue
Block a user