]> git.saurik.com Git - bison.git/blobdiff - src/parse-gram.y
* src/parse-gram.y (YYPRINT, yyprint): Don't mess with the parser
[bison.git] / src / parse-gram.y
index 4eaecb382570a9026360e1394d4725bd48c06844..66b8c68ed755849b8031704d87e2e30bd099d2de 100644 (file)
@@ -69,12 +69,9 @@ do {                                                 \
 #define yyerror(Msg) \
         gram_error (yycontrol, &yylloc, Msg)
 
-/* When debugging our pure parser, we want to see values and locations
-   of the tokens.  */
 #define YYPRINT(File, Type, Value) \
-        yyprint (File, &yylloc, Type, &Value)
-static void yyprint (FILE *file, const location_t *loc,
-                     int type, const yystype *value);
+        yyprint (File, Type, &Value)
+static void yyprint (FILE *file, int type, const yystype *value);
 
 symbol_class current_class = unknown_sym;
 char *current_type = 0;
@@ -82,6 +79,7 @@ symbol_t *current_lhs;
 location_t current_lhs_location;
 associativity current_assoc;
 int current_prec = 0;
+braced_code_t current_braced_code = action_braced_code;
 %}
 
 
@@ -100,13 +98,18 @@ int current_prec = 0;
 %token STRING CHARACTER
 %token INT
 
-%token PERCENT_TOKEN "%token"
-%token PERCENT_NTERM "%nterm"
-%token PERCENT_TYPE  "%type"
-%token PERCENT_UNION "%union"
-%token PERCENT_LEFT     "%left"
-%token PERCENT_RIGHT    "%right"
-%token PERCENT_NONASSOC "%nonassoc"
+%token PERCENT_TOKEN       "%token"
+%token PERCENT_NTERM       "%nterm"
+
+%token PERCENT_TYPE        "%type"
+%token PERCENT_DESTRUCTOR  "%destructor"
+%token PERCENT_PRINTER     "%printer"
+
+%token PERCENT_UNION       "%union"
+
+%token PERCENT_LEFT        "%left"
+%token PERCENT_RIGHT       "%right"
+%token PERCENT_NONASSOC    "%nonassoc"
 
 %token PERCENT_EXPECT "%expect"
 %token PERCENT_START "%start"
@@ -200,6 +203,26 @@ grammar_declaration:
       MUSCLE_INSERT_INT ("stype_line", @2.first_line);
       muscle_insert ("stype", $2);
     }
+| "%destructor"
+    { current_braced_code = destructor_braced_code; }
+  BRACED_CODE symbols.1
+    {
+      symbol_list_t *list;
+      for (list = $4; list; list = list->next)
+       symbol_destructor_set (list->sym, list->location, $3);
+      symbol_list_free ($4);
+      current_braced_code = action_braced_code;
+    }
+| "%printer"
+    { current_braced_code = printer_braced_code; }
+  BRACED_CODE symbols.1
+    {
+      symbol_list_t *list;
+      for (list = $4; list; list = list->next)
+       symbol_printer_set (list->sym, $3, list->location);
+      symbol_list_free ($4);
+      current_braced_code = action_braced_code;
+    }
 ;
 
 symbol_declaration:
@@ -263,26 +286,26 @@ symbol_def:
      }
 | ID
      {
-       symbol_class_set ($1, current_class);
+       symbol_class_set ($1, current_class, @1);
        symbol_type_set ($1, @1, current_type);
      }
 | ID INT
     {
-      symbol_class_set ($1, current_class);
+      symbol_class_set ($1, current_class, @1);
       symbol_type_set ($1, @1, current_type);
-      symbol_user_token_number_set ($1, $2);
+      symbol_user_token_number_set ($1, $2, @2);
     }
 | ID string_as_id
     {
-      symbol_class_set ($1, current_class);
+      symbol_class_set ($1, current_class, @1);
       symbol_type_set ($1, @1, current_type);
       symbol_make_alias ($1, $2);
     }
 | ID INT string_as_id
     {
-      symbol_class_set ($1, current_class);
+      symbol_class_set ($1, current_class, @1);
       symbol_type_set ($1, @1, current_type);
-      symbol_user_token_number_set ($1, $2);
+      symbol_user_token_number_set ($1, $2, @2);
       symbol_make_alias ($1, $3);
     }
 ;
@@ -331,7 +354,7 @@ rhs:
 | rhs action
     { grammar_current_rule_action_append ($2, @2); }
 | rhs "%prec" symbol
-    { grammar_current_rule_prec_set ($3); }
+    { grammar_current_rule_prec_set ($3, @3); }
 ;
 
 symbol:
@@ -350,7 +373,7 @@ string_as_id:
   STRING
     {
       $$ = getsym ($1, @1);
-      symbol_class_set ($$, token_sym);
+      symbol_class_set ($$, token_sym, @1);
     }
 ;
 
@@ -385,11 +408,9 @@ semi_colon.opt:
 
 static void
 yyprint (FILE *file,
-         const location_t *loc, int type, const yystype *value)
+         int type, const yystype *value)
 {
-  fputs (" (", file);
-  LOCATION_PRINT (file, *loc);
-  fputs (")", file);
+  fputc (' ', file);
   switch (type)
     {
     case CHARACTER: