#include "files.h"
#include "getargs.h"
#include "gram.h"
-#include "muscle-tab.h"
#include "named-ref.h"
#include "quotearg.h"
#include "reader.h"
boundary_set (&@$.end, current_file, 1, 1);
}
-%union
-{
- assoc assoc;
- char *code;
- char const *chars;
- int integer;
- named_ref *named_ref;
- symbol *symbol;
- symbol_list *list;
- uniqstr uniqstr;
- unsigned char character;
-};
-
/* Define the tokens together with their human representation. */
%token GRAM_EOF 0 "end of file"
%token STRING "string"
-%token INT "integer"
%token PERCENT_TOKEN "%token"
%token PERCENT_NTERM "%nterm"
%token TAG_ANY "<*>"
%token TAG_NONE "<>"
+%union {unsigned char character;}
%type <character> CHAR
%printer { fputs (char_name ($$), yyo); } CHAR
/* braceless is not to be used for rule or symbol actions, as it
calls code_props_plain_init. */
-%type <chars> STRING "%{...%}" EPILOGUE braceless content.opt
+%union
+{
+ char *code;
+ char const *chars;
+};
+%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
%printer { fputs ($$, yyo); } <uniqstr>
%printer { fprintf (yyo, "[%s]", $$); } BRACKETED_ID
%printer { fprintf (yyo, "%%%s", $$); } PERCENT_FLAG
%printer { fprintf (yyo, "<%s>", $$); } TAG tag
-%type <integer> INT
+%union {int integer;};
+%token <integer> INT "integer"
%printer { fprintf (yyo, "%d", $$); } <integer>
+%union {symbol *symbol;}
%type <symbol> id id_colon string_as_id symbol symbol.prec
%printer { fprintf (yyo, "%s", $$->tag); } <symbol>
%printer { fprintf (yyo, "%s:", $$->tag); } id_colon
+%union {assoc assoc;};
%type <assoc> precedence_declarator
+
+%union {symbol_list *list;}
%type <list> symbols.1 symbols.prec generic_symlist generic_symlist_item
+
+%union {named_ref *named_ref;}
%type <named_ref> named_ref.opt
/*---------.
`---------*/
%code requires
{
-# ifndef PARAM_TYPE
-# define PARAM_TYPE
typedef enum
{
param_none = 0,
param_parse = 1 << 1,
param_both = param_lex | param_parse
} param_type;
-# endif
};
%code
{
static void add_param (param_type type, char *decl, location loc);
static param_type current_param = param_none;
};
-%union
-{
- param_type param;
-}
+%union {param_type param;}
%token <param> PERCENT_PARAM "%param";
%printer
{
switch ($$)
{
#define CASE(In, Out) \
- case param_ ## In: fputs ("%" #Out, stderr); break
+ case param_ ## In: fputs ("%" #Out, yyo); break
CASE (lex, lex-param);
CASE (parse, parse-param);
CASE (both, param);
{
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; }
}
| "%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; }
| 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"'. */
;
/* 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; }
;
"{...}"
{
code_props plain_code;
- $1[strlen ($1) - 1] = '\n';
+ $1[strlen ($1) - 1] = '\0';
code_props_plain_init (&plain_code, $1+1, @1);
code_props_translate_code (&plain_code);
gram_scanner_last_string_free ();