]> git.saurik.com Git - bison.git/blobdiff - src/parse-gram.y
api.namespace: demonstrate and use {...} values instead of "..." values
[bison.git] / src / parse-gram.y
index 7ab214ad29bf275883afef11164ab047e7bf5de0..ebcd31b3a87f001b047a45e6410e5625a2f0f042 100644 (file)
@@ -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"
@@ -101,23 +100,9 @@ static char const *char_name (char);
   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"
@@ -182,18 +167,25 @@ static char const *char_name (char);
 %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
@@ -201,15 +193,22 @@ static char const *char_name (char);
 %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
 
 /*---------.
@@ -217,8 +216,6 @@ static char const *char_name (char);
 `---------*/
 %code requires
 {
-# ifndef PARAM_TYPE
-#  define PARAM_TYPE
   typedef enum
   {
     param_none   = 0,
@@ -226,7 +223,6 @@ static char const *char_name (char);
     param_parse  = 1 << 1,
     param_both   = param_lex | param_parse
   } param_type;
-# endif
 };
 %code
 {
@@ -239,17 +235,14 @@ static char const *char_name (char);
   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);
@@ -274,7 +267,7 @@ input:
         `------------------------------------*/
 
 prologue_declarations:
-  /* Nothing */
+  %empty
 | prologue_declarations prologue_declaration
 ;
 
@@ -294,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; }
@@ -307,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; }
@@ -430,8 +424,8 @@ code_props_type:
 %token PERCENT_UNION "%union";
 
 union_name:
-  /* Nothing. */ {}
-| ID             { muscle_code_grow ("union_name", $1, @1); }
+  %empty {}
+| ID     { muscle_code_grow ("union_name", $1, @1); }
 ;
 
 grammar_declaration:
@@ -490,8 +484,8 @@ precedence_declarator:
 ;
 
 tag.opt:
-  /* Nothing. */ { current_type = NULL; }
-| TAG            { current_type = $1; tag_seen = true; }
+  %empty { current_type = NULL; }
+| TAG    { current_type = $1; tag_seen = true; }
 ;
 
 /* Just like symbols.1 but accept INT for the sake of POSIX.  */
@@ -503,8 +497,17 @@ symbols.prec:
 ;
 
 symbol.prec:
-  symbol     { $$ = $1; }
-| symbol INT { $$ = $1; symbol_user_token_number_set ($1, $2, @2); }
+  symbol
+    {
+      $$ = $1;
+      symbol_class_set ($1, token_sym, @1, false);
+    }
+| symbol INT
+    {
+      $$ = $1;
+      symbol_user_token_number_set ($1, $2, @2);
+      symbol_class_set ($1, token_sym, @1, false);
+    }
 ;
 
 /* One or more symbols to be %typed. */
@@ -607,7 +610,7 @@ rhses.1:
 
 %token PERCENT_EMPTY "%empty";
 rhs:
-  /* Nothing.  */
+  %empty
     { grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
                                   current_lhs_named_ref); }
 | rhs symbol named_ref.opt
@@ -627,27 +630,47 @@ rhs:
 ;
 
 named_ref.opt:
-  /* Nothing. */ { $$ = 0; }
-|
-  BRACKETED_ID   { $$ = named_ref_new ($1, @1); }
+  %empty         { $$ = 0; }
+| 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"'.  */
+   For example, M4 fails for '%define "[" "value"'.  */
 variable:
   ID
 | STRING { $$ = uniqstr_new ($1); }
 ;
 
 /* Some content or empty by default. */
-content.opt:
-  /* Nothing. */   { $$ = ""; }
-| ID { $$ = $1; }
-| STRING
+%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; }
 ;
 
 
@@ -659,7 +682,7 @@ braceless:
   "{...}"
     {
       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 ();
@@ -706,7 +729,7 @@ string_as_id:
 ;
 
 epilogue.opt:
-  /* Nothing.  */
+  %empty
 | "%%" EPILOGUE
     {
       code_props plain_code;