summaryrefslogtreecommitdiff
path: root/src/parse-gram.y
diff options
context:
space:
mode:
authorAkim Demaille <demaille@gostai.com>2009-09-09 15:35:49 +0200
committerAkim Demaille <demaille@gostai.com>2009-09-09 16:26:13 +0200
commiteaca4c1103000fe906bd1ae031cf91ce37f83ce2 (patch)
tree94a4f6140e8e66520433e1a41fe468f8017fd0b8 /src/parse-gram.y
parentb18cdd91e8797953705e8518e409924c2ebe5e28 (diff)
downloadbison-eaca4c1103000fe906bd1ae031cf91ce37f83ce2.tar.gz
%parse: support several arguments.
* src/parse-gram.y (current_param): New. (param_type): Add param_none. (params): New nonterminal. Use it.
Diffstat (limited to 'src/parse-gram.y')
-rw-r--r--src/parse-gram.y26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/parse-gram.y b/src/parse-gram.y
index 683a05ff..453c35f8 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -54,12 +54,12 @@ static char const *char_name (char);
%code
{
- static symbol_class current_class = unknown_sym;
- static uniqstr current_type = NULL;
- static symbol *current_lhs;
+ static int current_prec = 0;
static location current_lhs_location;
static named_ref *current_lhs_named_ref;
- static int current_prec = 0;
+ static symbol *current_lhs;
+ static symbol_class current_class = unknown_sym;
+ static uniqstr current_type = NULL;
#define YYTYPE_INT16 int_fast16_t
#define YYTYPE_INT8 int_fast8_t
@@ -203,6 +203,7 @@ static char const *char_name (char);
# define PARAM_TYPE
typedef enum
{
+ param_none = 0,
param_lex = 1 << 0,
param_parse = 1 << 1,
param_both = param_lex | param_parse
@@ -218,6 +219,7 @@ static char const *char_name (char);
* \param loc the location in the source.
*/
static void add_param (param_type type, char *decl, location loc);
+ static param_type current_param = param_none;
};
%union
{
@@ -229,15 +231,18 @@ static char const *char_name (char);
switch ($$)
{
#define CASE(In, Out) \
- case param_ ## In: fputs ("%" #Out, stderr); break
-
+ case param_ ## In: fputs ("%" #Out, stderr); break
CASE(lex, lex-param);
CASE(parse, parse-param);
CASE(both, param);
- }
#undef CASE
+ }
} <param>;
+
+ /*==========\
+ | Grammar. |
+ \==========*/
%%
input:
@@ -311,7 +316,7 @@ prologue_declaration:
| "%nondeterministic-parser" { nondeterministic_parser = true; }
| "%output" STRING { spec_outfile = $2; }
| "%output" "=" STRING { spec_outfile = $3; } /* deprecated */
-| "%param" "{...}" { add_param ($1, $2, @2); }
+| "%param" { current_param = $1; } params { current_param = param_none; }
| "%require" STRING { version_check (&@2, $2); }
| "%skeleton" STRING
{
@@ -343,6 +348,11 @@ prologue_declaration:
| /*FIXME: Err? What is this horror doing here? */ ";"
;
+params:
+ params "{...}" { add_param (current_param, $2, @2); }
+| "{...}" { add_param (current_param, $1, @1); }
+;
+
/*----------------------.
| grammar_declaration. |