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:
Akim Demaille
2012-06-26 10:09:10 +02:00
parent 087dcd7868
commit 4b3847c3c0
10 changed files with 320 additions and 96 deletions

View File

@@ -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