X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/1e0bab92768860bfecd95f01227df9b1c25da2cb..366eea36d3a9aaccf80a78c2fcd8c3cd6b563e25:/src/parse-gram.y diff --git a/src/parse-gram.y b/src/parse-gram.y index aa1d2b51..06a32c31 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -34,6 +34,7 @@ #include "files.h" #include "getargs.h" #include "output.h" +#include "symlist.h" #include "gram.h" #include "reader.h" #include "conflicts.h" @@ -81,6 +82,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; %} @@ -88,7 +90,7 @@ int current_prec = 0; %union { symbol_t *symbol; - symbol_list *list; + symbol_list_t *list; int integer; char *string; associativity assoc; @@ -99,13 +101,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" @@ -199,6 +206,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: @@ -214,24 +241,24 @@ 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; } ;