mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
api.prefix.
* data/c.m4 (b4_api_prefix, b4_api_PREFIX): New. (b4_prefix, b4_union_name, b4_token_enums, b4_declare_yylstype): Use them. * data/glr.c, data/yacc.c, data/glr.cc, data/lalr1.cc: Use them to change the prefix of exported preprocessor symbols. * src/getargs.c (usage): Ditto. * tests/headers.at (Several parsers): New. * tests/local.at (AT_API_PREFIX): New. AT_YYSTYPE, AT_YYLTYPE): Adjust. * doc/bison.texi (Multiple Parsers): Move documentation of %name-prefix to... (Table of Symbols): here. (Multiple Parsers): Document api.prefix. (%define Summary): Point to it. Use @code for variable names. (Bison Options): -p/--name-prefix are obsoleted. * NEWS: Announce api.prefix.
This commit is contained in:
@@ -117,3 +117,93 @@ AT_COMPILE([caller], [caller.o input.o])
|
||||
AT_PARSER_CHECK([./caller])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
## ----------------- ##
|
||||
## Several parsers. ##
|
||||
## ----------------- ##
|
||||
|
||||
AT_SETUP([Several parsers])
|
||||
|
||||
# AT_DATA_GRAMMAR_SEVERAL([PREFIX], [DIRECTIVES])
|
||||
# -----------------------------------------------
|
||||
# Generate and compile to *.o. Make sure there is no YY* nor yy* in
|
||||
# the header (but YYDEBUG and YYPARSE_PARAM).
|
||||
m4_define([AT_DATA_GRAMMAR_SEVERAL],
|
||||
[AT_BISON_OPTION_PUSHDEFS([%define api.prefix "$1_" $2])
|
||||
AT_DATA_GRAMMAR([AT_SKEL_CC_IF([$1.yy], [$1.y])],
|
||||
[[%define api.prefix "$1_"
|
||||
$2
|
||||
%union
|
||||
{
|
||||
int integer;
|
||||
}
|
||||
%{
|
||||
#include <stdio.h>
|
||||
]AT_YYERROR_DECLARE[
|
||||
]AT_YYLEX_DECLARE[
|
||||
%}
|
||||
%%
|
||||
exp:
|
||||
'x' '1' { printf ("x1\n"); }
|
||||
| 'x' '2' { printf ("x2\n"); }
|
||||
| 'x' '3' { printf ("x3\n"); }
|
||||
| 'x' '4' { printf ("x4\n"); }
|
||||
| 'x' '5' { printf ("x5\n"); }
|
||||
| 'x' '6' { printf ("x6\n"); }
|
||||
;
|
||||
|
||||
%%
|
||||
]AT_YYERROR_DEFINE[
|
||||
]AT_YYLEX_DEFINE(["$1"])[
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([-d -o AT_SKEL_CC_IF([$1.cc $1.yy], [$1.c $1.y])])
|
||||
# C++ output relies on namespaces and still uses yy a lot.
|
||||
AT_SKEL_CC_IF([],
|
||||
[AT_CHECK([$EGREP -i yy $1.h | $EGREP -v 'YY(DEBUG|PARSE_PARAM)'], [1])])
|
||||
AT_LANG_COMPILE([$1.o])
|
||||
AT_BISON_OPTION_POPDEFS
|
||||
])
|
||||
|
||||
AT_DATA([main.cc],
|
||||
[[extern "C"
|
||||
{
|
||||
#include "x1.h"
|
||||
#include "x2.h"
|
||||
#include "x3.h"
|
||||
#include "x4.h"
|
||||
}
|
||||
#include "x5.hh"
|
||||
//#include "x6.hh"
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
int errs = 0;
|
||||
errs += x1_parse();
|
||||
errs += x2_parse();
|
||||
errs += x3_parse();
|
||||
errs += x4_parse();
|
||||
x5_::parser p5;
|
||||
errs += p5.parse();
|
||||
// errs += x6_parse();
|
||||
return !!errs;
|
||||
}
|
||||
]])
|
||||
|
||||
AT_DATA_GRAMMAR_SEVERAL([x1], [])
|
||||
AT_DATA_GRAMMAR_SEVERAL([x2], [%locations %debug])
|
||||
AT_DATA_GRAMMAR_SEVERAL([x3], [%glr-parser])
|
||||
AT_DATA_GRAMMAR_SEVERAL([x4], [%locations %debug %glr-parser])
|
||||
AT_DATA_GRAMMAR_SEVERAL([x5], [%locations %debug %language "c++"])
|
||||
#AT_DATA_GRAMMAR_SEVERAL([x6], [%locations %language "c++"])
|
||||
|
||||
AT_COMPILE_CXX([parser], [x1.o x2.o x3.o x4.o x5.o main.cc])
|
||||
AT_CHECK([./parser], [0],
|
||||
[[x1
|
||||
x2
|
||||
x3
|
||||
x4
|
||||
x5
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
Reference in New Issue
Block a user