#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_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_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"
%token PERCENT_PREC "%prec"
%type <integer> INT
%type <symbol> ID symbol string_as_id
%type <assoc> precedence_declarator
-
+%type <list> symbols.1
%%
input:
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:
current_class = unknown_sym;
current_type = NULL;
}
-| "%type" TYPE {current_type = $2; } nterms_to_type.1
+| "%type" TYPE symbols.1
{
- current_type = NULL;
+ symbol_list_t *list;
+ for (list = $3; list; list = list->next)
+ symbol_type_set (list->sym, list->location, $2);
+ symbol_list_free ($3);
}
;
precedence_declaration:
- precedence_declarator type.opt
- { current_assoc = $1; ++current_prec; }
- terms_to_prec.1
- { current_assoc = non_assoc; current_type = NULL; }
+ precedence_declarator type.opt symbols.1
+ {
+ 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);
+ }
+ symbol_list_free ($3);
+ current_type = NULL;
+ }
;
-%token PERCENT_LEFT "%left";
-%token PERCENT_RIGHT "%right";
-%token PERCENT_NONASSOC "%nonassoc";
precedence_declarator:
"%left" { $$ = left_assoc; }
| "%right" { $$ = right_assoc; }
;
/* One or more nonterminals to be %typed. */
-nterms_to_type.1:
- ID { symbol_type_set ($1, current_type); }
-| nterms_to_type.1 ID { symbol_type_set ($2, current_type); }
-;
-/* One or more symbols to be given a precedence/associativity. */
-terms_to_prec.1:
- symbol
- {
- symbol_type_set ($1, current_type);
- symbol_precedence_set ($1, current_prec, current_assoc);
- }
-| terms_to_prec.1 symbol
- {
- symbol_type_set ($2, current_type);
- symbol_precedence_set ($2, current_prec, current_assoc);
- }
+symbols.1:
+ symbol { $$ = symbol_list_new ($1, @1); }
+| symbols.1 symbol { $$ = symbol_list_prepend ($1, $2, @2); }
;
/* One token definition. */
| ID
{
symbol_class_set ($1, current_class);
- symbol_type_set ($1, current_type);
+ symbol_type_set ($1, @1, current_type);
}
| ID INT
{
symbol_class_set ($1, current_class);
- symbol_type_set ($1, current_type);
+ symbol_type_set ($1, @1, current_type);
symbol_user_token_number_set ($1, $2);
}
| ID string_as_id
{
symbol_class_set ($1, current_class);
- symbol_type_set ($1, current_type);
+ symbol_type_set ($1, @1, current_type);
symbol_make_alias ($1, $2);
}
| ID INT string_as_id
{
symbol_class_set ($1, current_class);
- symbol_type_set ($1, current_type);
+ symbol_type_set ($1, @1, current_type);
symbol_user_token_number_set ($1, $2);
symbol_make_alias ($1, $3);
}
symbol:
ID { $$ = $1; }
| string_as_id { $$ = $1; }
-| CHARACTER { $$ = getsym ($1); }
+| CHARACTER { $$ = getsym ($1, @1); }
;
action:
string_as_id:
STRING
{
- $$ = getsym ($1);
+ $$ = getsym ($1, @1);
symbol_class_set ($$, token_sym);
}
;