#include "files.h"
#include "getargs.h"
#include "output.h"
+#include "symlist.h"
#include "gram.h"
#include "reader.h"
#include "conflicts.h"
location_t current_lhs_location;
associativity current_assoc;
int current_prec = 0;
+braced_code_t current_braced_code = action_braced_code;
%}
%union
{
symbol_t *symbol;
- symbol_list *list;
+ symbol_list_t *list;
int integer;
char *string;
associativity assoc;
%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"
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:
}
| "%type" TYPE symbols.1
{
- symbol_list *list;
+ symbol_list_t *list;
for (list = $3; list; list = list->next)
symbol_type_set (list->sym, list->location, $2);
- LIST_FREE (symbol_list, $3);
+ symbol_list_free ($3);
}
;
precedence_declaration:
precedence_declarator type.opt symbols.1
{
- symbol_list *list;
+ symbol_list_t *list;
++current_prec;
for (list = $3; list; list = list->next)
{
symbol_type_set (list->sym, list->location, current_type);
symbol_precedence_set (list->sym, list->location, current_prec, $1);
}
- LIST_FREE (symbol_list, $3);
+ symbol_list_free ($3);
current_type = NULL;
}
;