mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-13 22:33:03 +00:00
grammar: record the kind of %define variable values
Provide a means to tell the difference between "keyword" values (e.g.,
%define api.pull both), "string" values (e.g., %define file.name
"foo"), and "code" values (e.g., %define api.namespace {calc}).
Suggested by Joel E. Denny.
http://lists.gnu.org/archive/html/bison-patches/2013-03/msg00016.html
* src/muscle-tab.h, src/muscle-tab.c (muscle_kind, muscle_kind_new)
(muscle_kind_string): New.
(muscle_percent_define_insert): Take the kind as new argument.
Insert it in the muscle table.
Adjust callers.
* src/getargs.c: Adjust callers.
* src/parse-gram.y: Ditto.
(content.opt): Remove, replaced by...
(value): this new non-terminal, whose semantics value is stored
in the new "value" union member.
Provide a printer.
Support values in braces in additions to keyword and string values.
fuse me
This commit is contained in:
@@ -26,7 +26,6 @@
|
||||
#include "files.h"
|
||||
#include "getargs.h"
|
||||
#include "gram.h"
|
||||
#include "muscle-tab.h"
|
||||
#include "named-ref.h"
|
||||
#include "quotearg.h"
|
||||
#include "reader.h"
|
||||
@@ -179,12 +178,12 @@ static char const *char_name (char);
|
||||
char *code;
|
||||
char const *chars;
|
||||
};
|
||||
%type <chars> STRING "%{...%}" EPILOGUE braceless content.opt
|
||||
%type <chars> STRING "%{...%}" EPILOGUE braceless
|
||||
%type <code> "{...}" "%?{...}"
|
||||
%printer { fputs (quotearg_style (c_quoting_style, $$), yyo); }
|
||||
STRING
|
||||
%printer { fprintf (yyo, "{\n%s\n}", $$); }
|
||||
braceless content.opt "{...}" "%{...%}" EPILOGUE
|
||||
braceless "{...}" "%{...%}" EPILOGUE
|
||||
|
||||
%union {uniqstr uniqstr;}
|
||||
%type <uniqstr> BRACKETED_ID ID ID_COLON PERCENT_FLAG TAG tag variable
|
||||
@@ -288,9 +287,9 @@ prologue_declaration:
|
||||
{
|
||||
muscle_percent_define_ensure ($1, @1, true);
|
||||
}
|
||||
| "%define" variable content.opt
|
||||
| "%define" variable value
|
||||
{
|
||||
muscle_percent_define_insert ($2, @2, $3,
|
||||
muscle_percent_define_insert ($2, @2, $3.kind, $3.chars,
|
||||
MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
|
||||
}
|
||||
| "%defines" { defines_flag = true; }
|
||||
@@ -301,7 +300,8 @@ prologue_declaration:
|
||||
}
|
||||
| "%error-verbose"
|
||||
{
|
||||
muscle_percent_define_insert ("parse.error", @1, "verbose",
|
||||
muscle_percent_define_insert ("parse.error", @1, muscle_keyword,
|
||||
"verbose",
|
||||
MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
|
||||
}
|
||||
| "%expect" INT { expected_sr_conflicts = $2; }
|
||||
@@ -634,9 +634,9 @@ named_ref.opt:
|
||||
| BRACKETED_ID { $$ = named_ref_new($1, @1); }
|
||||
;
|
||||
|
||||
/*---------------------------.
|
||||
| variable and content.opt. |
|
||||
`---------------------------*/
|
||||
/*---------------------.
|
||||
| variable and value. |
|
||||
`---------------------*/
|
||||
|
||||
/* The STRING form of variable is deprecated and is not M4-friendly.
|
||||
For example, M4 fails for '%define "[" "value"'. */
|
||||
@@ -646,10 +646,31 @@ variable:
|
||||
;
|
||||
|
||||
/* Some content or empty by default. */
|
||||
content.opt:
|
||||
%empty { $$ = ""; }
|
||||
| ID { $$ = $1; }
|
||||
| STRING { $$ = $1; }
|
||||
%code requires {#include "muscle-tab.h"};
|
||||
%union
|
||||
{
|
||||
struct
|
||||
{
|
||||
char const *chars;
|
||||
muscle_kind kind;
|
||||
} value;
|
||||
};
|
||||
%type <value> value;
|
||||
%printer
|
||||
{
|
||||
switch ($$.kind)
|
||||
{
|
||||
case muscle_code: fprintf (yyo, "{%s}", $$.chars); break;
|
||||
case muscle_keyword: fprintf (yyo, "%s", $$.chars); break;
|
||||
case muscle_string: fprintf (yyo, "\"%s\"", $$.chars); break;
|
||||
}
|
||||
} <value>;
|
||||
|
||||
value:
|
||||
%empty { $$.kind = muscle_keyword; $$.chars = ""; }
|
||||
| ID { $$.kind = muscle_keyword; $$.chars = $1; }
|
||||
| STRING { $$.kind = muscle_string; $$.chars = $1; }
|
||||
| braceless { $$.kind = muscle_code; $$.chars = $1; }
|
||||
;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user