mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-21 18:23:03 +00:00
* src/reader.h, src/reader.c (symbol_list, symbol_list_new)
(symbol_list_prepend, get_type_name): Move to... * src/symlist.h, src/symlist.c (symbol_list_t, symbol_list_new) (symbol_list_prepend, symbol_list_n_type_name_get): here. Adjust all callers. (symbol_list_free): New. * src/scan-gram.l (handle_dollar): Takes a location. * tests/input.at (Invalid $n): Adjust.
This commit is contained in:
12
ChangeLog
12
ChangeLog
@@ -1,3 +1,15 @@
|
|||||||
|
2002-06-17 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
|
* src/reader.h, src/reader.c (symbol_list, symbol_list_new)
|
||||||
|
(symbol_list_prepend, get_type_name): Move to...
|
||||||
|
* src/symlist.h, src/symlist.c (symbol_list_t, symbol_list_new)
|
||||||
|
(symbol_list_prepend, symbol_list_n_type_name_get): here.
|
||||||
|
Adjust all callers.
|
||||||
|
(symbol_list_free): New.
|
||||||
|
* src/scan-gram.l (handle_dollar): Takes a location.
|
||||||
|
* tests/input.at (Invalid $n): Adjust.
|
||||||
|
|
||||||
|
|
||||||
2002-06-17 Akim Demaille <akim@epita.fr>
|
2002-06-17 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
* src/reader.h, src/reader.c (symbol_list_new): Export it.
|
* src/reader.h, src/reader.c (symbol_list_new): Export it.
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ bison_SOURCES = \
|
|||||||
scan-gram.l \
|
scan-gram.l \
|
||||||
scan-skel.l \
|
scan-skel.l \
|
||||||
state.c state.h \
|
state.c state.h \
|
||||||
|
symlist.c symlist.h \
|
||||||
symtab.c symtab.h \
|
symtab.c symtab.h \
|
||||||
system.h \
|
system.h \
|
||||||
types.h \
|
types.h \
|
||||||
|
|||||||
157
src/parse-gram.c
157
src/parse-gram.c
@@ -68,6 +68,7 @@
|
|||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
#include "output.h"
|
#include "output.h"
|
||||||
|
#include "symlist.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
#include "conflicts.h"
|
#include "conflicts.h"
|
||||||
@@ -222,16 +223,16 @@ int current_prec = 0;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef YYSTYPE
|
#ifndef YYSTYPE
|
||||||
#line 89 "parse-gram.y"
|
#line 90 "parse-gram.y"
|
||||||
typedef union {
|
typedef union {
|
||||||
symbol_t *symbol;
|
symbol_t *symbol;
|
||||||
symbol_list *list;
|
symbol_list_t *list;
|
||||||
int integer;
|
int integer;
|
||||||
char *string;
|
char *string;
|
||||||
associativity assoc;
|
associativity assoc;
|
||||||
} yystype;
|
} yystype;
|
||||||
/* Line 199 of /usr/local/share/bison/bison.simple. */
|
/* Line 199 of /usr/local/share/bison/bison.simple. */
|
||||||
#line 235 "parse-gram.c"
|
#line 236 "parse-gram.c"
|
||||||
# define YYSTYPE yystype
|
# define YYSTYPE yystype
|
||||||
# define YYSTYPE_IS_TRIVIAL 1
|
# define YYSTYPE_IS_TRIVIAL 1
|
||||||
#endif
|
#endif
|
||||||
@@ -252,7 +253,7 @@ typedef struct yyltype
|
|||||||
|
|
||||||
|
|
||||||
/* Line 219 of /usr/local/share/bison/bison.simple. */
|
/* Line 219 of /usr/local/share/bison/bison.simple. */
|
||||||
#line 256 "parse-gram.c"
|
#line 257 "parse-gram.c"
|
||||||
|
|
||||||
#if ! defined (yyoverflow) || YYERROR_VERBOSE
|
#if ! defined (yyoverflow) || YYERROR_VERBOSE
|
||||||
|
|
||||||
@@ -447,13 +448,13 @@ static const signed char yyrhs[] =
|
|||||||
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
||||||
static const unsigned short yyrline[] =
|
static const unsigned short yyrline[] =
|
||||||
{
|
{
|
||||||
0, 151, 151, 164, 166, 169, 171, 172, 173, 174,
|
0, 152, 152, 165, 167, 170, 172, 173, 174, 175,
|
||||||
175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
|
176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
|
||||||
185, 186, 189, 191, 192, 196, 204, 204, 210, 210,
|
186, 187, 190, 192, 193, 197, 205, 205, 211, 211,
|
||||||
215, 224, 239, 241, 242, 245, 247, 252, 254, 258,
|
216, 225, 240, 242, 243, 246, 248, 253, 255, 259,
|
||||||
263, 268, 274, 280, 290, 293, 302, 304, 310, 312,
|
264, 269, 275, 281, 291, 294, 303, 305, 311, 313,
|
||||||
315, 315, 320, 322, 325, 328, 330, 332, 336, 338,
|
316, 316, 321, 323, 326, 329, 331, 333, 337, 339,
|
||||||
339, 342, 348, 357, 365, 370, 376, 378
|
340, 343, 349, 358, 366, 371, 377, 379
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1183,7 +1184,7 @@ yyreduce:
|
|||||||
switch (yyn)
|
switch (yyn)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
#line 153 "parse-gram.y"
|
#line 154 "parse-gram.y"
|
||||||
{
|
{
|
||||||
yycontrol->errcode = 0;
|
yycontrol->errcode = 0;
|
||||||
epilogue_set (yyvsp[0].string, yylsp[0]);
|
epilogue_set (yyvsp[0].string, yylsp[0]);
|
||||||
@@ -1191,94 +1192,94 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 6:
|
||||||
#line 171 "parse-gram.y"
|
#line 172 "parse-gram.y"
|
||||||
{ prologue_augment (yyvsp[0].string, yylsp[0]); }
|
{ prologue_augment (yyvsp[0].string, yylsp[0]); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
#line 172 "parse-gram.y"
|
#line 173 "parse-gram.y"
|
||||||
{ debug_flag = 1; }
|
{ debug_flag = 1; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
#line 173 "parse-gram.y"
|
#line 174 "parse-gram.y"
|
||||||
{ muscle_insert (yyvsp[-1].string, yyvsp[0].string); }
|
{ muscle_insert (yyvsp[-1].string, yyvsp[0].string); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 9:
|
case 9:
|
||||||
#line 174 "parse-gram.y"
|
#line 175 "parse-gram.y"
|
||||||
{ defines_flag = 1; }
|
{ defines_flag = 1; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 10:
|
case 10:
|
||||||
#line 175 "parse-gram.y"
|
#line 176 "parse-gram.y"
|
||||||
{ error_verbose = 1; }
|
{ error_verbose = 1; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 11:
|
case 11:
|
||||||
#line 176 "parse-gram.y"
|
#line 177 "parse-gram.y"
|
||||||
{ expected_conflicts = yyvsp[0].integer; }
|
{ expected_conflicts = yyvsp[0].integer; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
case 12:
|
||||||
#line 177 "parse-gram.y"
|
#line 178 "parse-gram.y"
|
||||||
{ spec_file_prefix = yyvsp[0].string; }
|
{ spec_file_prefix = yyvsp[0].string; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 13:
|
case 13:
|
||||||
#line 178 "parse-gram.y"
|
#line 179 "parse-gram.y"
|
||||||
{ locations_flag = 1; }
|
{ locations_flag = 1; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 14:
|
case 14:
|
||||||
#line 179 "parse-gram.y"
|
#line 180 "parse-gram.y"
|
||||||
{ spec_name_prefix = yyvsp[0].string; }
|
{ spec_name_prefix = yyvsp[0].string; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 15:
|
case 15:
|
||||||
#line 180 "parse-gram.y"
|
#line 181 "parse-gram.y"
|
||||||
{ no_lines_flag = 1; }
|
{ no_lines_flag = 1; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 16:
|
case 16:
|
||||||
#line 181 "parse-gram.y"
|
#line 182 "parse-gram.y"
|
||||||
{ spec_outfile = yyvsp[0].string; }
|
{ spec_outfile = yyvsp[0].string; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 17:
|
case 17:
|
||||||
#line 182 "parse-gram.y"
|
#line 183 "parse-gram.y"
|
||||||
{ pure_parser = 1; }
|
{ pure_parser = 1; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 18:
|
case 18:
|
||||||
#line 183 "parse-gram.y"
|
#line 184 "parse-gram.y"
|
||||||
{ skeleton = yyvsp[0].string; }
|
{ skeleton = yyvsp[0].string; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 19:
|
case 19:
|
||||||
#line 184 "parse-gram.y"
|
#line 185 "parse-gram.y"
|
||||||
{ token_table_flag = 1; }
|
{ token_table_flag = 1; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 20:
|
case 20:
|
||||||
#line 185 "parse-gram.y"
|
#line 186 "parse-gram.y"
|
||||||
{ report_flag = 1; }
|
{ report_flag = 1; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 21:
|
case 21:
|
||||||
#line 186 "parse-gram.y"
|
#line 187 "parse-gram.y"
|
||||||
{ yacc_flag = 1; }
|
{ yacc_flag = 1; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 24:
|
case 24:
|
||||||
#line 193 "parse-gram.y"
|
#line 194 "parse-gram.y"
|
||||||
{
|
{
|
||||||
grammar_start_symbol_set (yyvsp[0].symbol, yylsp[0]);
|
grammar_start_symbol_set (yyvsp[0].symbol, yylsp[0]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
#line 197 "parse-gram.y"
|
#line 198 "parse-gram.y"
|
||||||
{
|
{
|
||||||
typed = 1;
|
typed = 1;
|
||||||
MUSCLE_INSERT_INT ("stype_line", yylsp[0].first_line);
|
MUSCLE_INSERT_INT ("stype_line", yylsp[0].first_line);
|
||||||
@@ -1287,12 +1288,12 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 26:
|
case 26:
|
||||||
#line 205 "parse-gram.y"
|
#line 206 "parse-gram.y"
|
||||||
{ current_class = nterm_sym; }
|
{ current_class = nterm_sym; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 27:
|
case 27:
|
||||||
#line 206 "parse-gram.y"
|
#line 207 "parse-gram.y"
|
||||||
{
|
{
|
||||||
current_class = unknown_sym;
|
current_class = unknown_sym;
|
||||||
current_type = NULL;
|
current_type = NULL;
|
||||||
@@ -1300,12 +1301,12 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 28:
|
case 28:
|
||||||
#line 210 "parse-gram.y"
|
#line 211 "parse-gram.y"
|
||||||
{ current_class = token_sym; }
|
{ current_class = token_sym; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 29:
|
case 29:
|
||||||
#line 211 "parse-gram.y"
|
#line 212 "parse-gram.y"
|
||||||
{
|
{
|
||||||
current_class = unknown_sym;
|
current_class = unknown_sym;
|
||||||
current_type = NULL;
|
current_type = NULL;
|
||||||
@@ -1313,74 +1314,74 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 30:
|
case 30:
|
||||||
#line 216 "parse-gram.y"
|
#line 217 "parse-gram.y"
|
||||||
{
|
{
|
||||||
symbol_list *list;
|
symbol_list_t *list;
|
||||||
for (list = yyvsp[0].list; list; list = list->next)
|
for (list = yyvsp[0].list; list; list = list->next)
|
||||||
symbol_type_set (list->sym, list->location, yyvsp[-1].string);
|
symbol_type_set (list->sym, list->location, yyvsp[-1].string);
|
||||||
LIST_FREE (symbol_list, yyvsp[0].list);
|
LIST_FREE (symbol_list_t, yyvsp[0].list);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 31:
|
case 31:
|
||||||
#line 226 "parse-gram.y"
|
#line 227 "parse-gram.y"
|
||||||
{
|
{
|
||||||
symbol_list *list;
|
symbol_list_t *list;
|
||||||
++current_prec;
|
++current_prec;
|
||||||
for (list = yyvsp[0].list; list; list = list->next)
|
for (list = yyvsp[0].list; list; list = list->next)
|
||||||
{
|
{
|
||||||
symbol_type_set (list->sym, list->location, current_type);
|
symbol_type_set (list->sym, list->location, current_type);
|
||||||
symbol_precedence_set (list->sym, list->location, current_prec, yyvsp[-2].assoc);
|
symbol_precedence_set (list->sym, list->location, current_prec, yyvsp[-2].assoc);
|
||||||
}
|
}
|
||||||
LIST_FREE (symbol_list, yyvsp[0].list);
|
LIST_FREE (symbol_list_t, yyvsp[0].list);
|
||||||
current_type = NULL;
|
current_type = NULL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 32:
|
case 32:
|
||||||
#line 240 "parse-gram.y"
|
#line 241 "parse-gram.y"
|
||||||
{ yyval.assoc = left_assoc; }
|
{ yyval.assoc = left_assoc; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 33:
|
case 33:
|
||||||
#line 241 "parse-gram.y"
|
#line 242 "parse-gram.y"
|
||||||
{ yyval.assoc = right_assoc; }
|
{ yyval.assoc = right_assoc; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 34:
|
case 34:
|
||||||
#line 242 "parse-gram.y"
|
#line 243 "parse-gram.y"
|
||||||
{ yyval.assoc = non_assoc; }
|
{ yyval.assoc = non_assoc; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 35:
|
case 35:
|
||||||
#line 246 "parse-gram.y"
|
#line 247 "parse-gram.y"
|
||||||
{ current_type = NULL;}
|
{ current_type = NULL;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 36:
|
case 36:
|
||||||
#line 247 "parse-gram.y"
|
#line 248 "parse-gram.y"
|
||||||
{ current_type = yyvsp[0].string; }
|
{ current_type = yyvsp[0].string; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 37:
|
case 37:
|
||||||
#line 253 "parse-gram.y"
|
#line 254 "parse-gram.y"
|
||||||
{ yyval.list = symbol_list_new (yyvsp[0].symbol, yylsp[0]); }
|
{ yyval.list = symbol_list_new (yyvsp[0].symbol, yylsp[0]); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 38:
|
case 38:
|
||||||
#line 254 "parse-gram.y"
|
#line 255 "parse-gram.y"
|
||||||
{ yyval.list = symbol_list_prepend (yyvsp[-1].list, yyvsp[0].symbol, yylsp[0]); }
|
{ yyval.list = symbol_list_prepend (yyvsp[-1].list, yyvsp[0].symbol, yylsp[0]); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 39:
|
case 39:
|
||||||
#line 260 "parse-gram.y"
|
#line 261 "parse-gram.y"
|
||||||
{
|
{
|
||||||
current_type = yyvsp[0].string;
|
current_type = yyvsp[0].string;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 40:
|
case 40:
|
||||||
#line 264 "parse-gram.y"
|
#line 265 "parse-gram.y"
|
||||||
{
|
{
|
||||||
symbol_class_set (yyvsp[0].symbol, current_class);
|
symbol_class_set (yyvsp[0].symbol, current_class);
|
||||||
symbol_type_set (yyvsp[0].symbol, yylsp[0], current_type);
|
symbol_type_set (yyvsp[0].symbol, yylsp[0], current_type);
|
||||||
@@ -1388,7 +1389,7 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 41:
|
case 41:
|
||||||
#line 269 "parse-gram.y"
|
#line 270 "parse-gram.y"
|
||||||
{
|
{
|
||||||
symbol_class_set (yyvsp[-1].symbol, current_class);
|
symbol_class_set (yyvsp[-1].symbol, current_class);
|
||||||
symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
|
symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
|
||||||
@@ -1397,7 +1398,7 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 42:
|
case 42:
|
||||||
#line 275 "parse-gram.y"
|
#line 276 "parse-gram.y"
|
||||||
{
|
{
|
||||||
symbol_class_set (yyvsp[-1].symbol, current_class);
|
symbol_class_set (yyvsp[-1].symbol, current_class);
|
||||||
symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
|
symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
|
||||||
@@ -1406,7 +1407,7 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 43:
|
case 43:
|
||||||
#line 281 "parse-gram.y"
|
#line 282 "parse-gram.y"
|
||||||
{
|
{
|
||||||
symbol_class_set (yyvsp[-2].symbol, current_class);
|
symbol_class_set (yyvsp[-2].symbol, current_class);
|
||||||
symbol_type_set (yyvsp[-2].symbol, yylsp[-2], current_type);
|
symbol_type_set (yyvsp[-2].symbol, yylsp[-2], current_type);
|
||||||
@@ -1416,77 +1417,77 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 44:
|
case 44:
|
||||||
#line 292 "parse-gram.y"
|
#line 293 "parse-gram.y"
|
||||||
{;}
|
{;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 45:
|
case 45:
|
||||||
#line 294 "parse-gram.y"
|
#line 295 "parse-gram.y"
|
||||||
{;}
|
{;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 50:
|
case 50:
|
||||||
#line 316 "parse-gram.y"
|
#line 317 "parse-gram.y"
|
||||||
{ current_lhs = yyvsp[-1].symbol; current_lhs_location = yylsp[-1]; }
|
{ current_lhs = yyvsp[-1].symbol; current_lhs_location = yylsp[-1]; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 51:
|
case 51:
|
||||||
#line 317 "parse-gram.y"
|
#line 318 "parse-gram.y"
|
||||||
{;}
|
{;}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 52:
|
case 52:
|
||||||
#line 321 "parse-gram.y"
|
|
||||||
{ grammar_rule_end (yylsp[0]); }
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 53:
|
|
||||||
#line 322 "parse-gram.y"
|
#line 322 "parse-gram.y"
|
||||||
{ grammar_rule_end (yylsp[0]); }
|
{ grammar_rule_end (yylsp[0]); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 53:
|
||||||
|
#line 323 "parse-gram.y"
|
||||||
|
{ grammar_rule_end (yylsp[0]); }
|
||||||
|
break;
|
||||||
|
|
||||||
case 54:
|
case 54:
|
||||||
#line 327 "parse-gram.y"
|
#line 328 "parse-gram.y"
|
||||||
{ grammar_rule_begin (current_lhs, current_lhs_location); }
|
{ grammar_rule_begin (current_lhs, current_lhs_location); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 55:
|
case 55:
|
||||||
#line 329 "parse-gram.y"
|
#line 330 "parse-gram.y"
|
||||||
{ grammar_current_rule_symbol_append (yyvsp[0].symbol, yylsp[0]); }
|
{ grammar_current_rule_symbol_append (yyvsp[0].symbol, yylsp[0]); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 56:
|
case 56:
|
||||||
#line 331 "parse-gram.y"
|
#line 332 "parse-gram.y"
|
||||||
{ grammar_current_rule_action_append (yyvsp[0].string, yylsp[0]); }
|
{ grammar_current_rule_action_append (yyvsp[0].string, yylsp[0]); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 57:
|
case 57:
|
||||||
#line 333 "parse-gram.y"
|
#line 334 "parse-gram.y"
|
||||||
{ grammar_current_rule_prec_set (yyvsp[0].symbol); }
|
{ grammar_current_rule_prec_set (yyvsp[0].symbol); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 58:
|
case 58:
|
||||||
#line 337 "parse-gram.y"
|
|
||||||
{ yyval.symbol = yyvsp[0].symbol; }
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 59:
|
|
||||||
#line 338 "parse-gram.y"
|
#line 338 "parse-gram.y"
|
||||||
{ yyval.symbol = yyvsp[0].symbol; }
|
{ yyval.symbol = yyvsp[0].symbol; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 60:
|
case 59:
|
||||||
#line 339 "parse-gram.y"
|
#line 339 "parse-gram.y"
|
||||||
|
{ yyval.symbol = yyvsp[0].symbol; }
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 60:
|
||||||
|
#line 340 "parse-gram.y"
|
||||||
{ yyval.symbol = getsym (yyvsp[0].string, yylsp[0]); }
|
{ yyval.symbol = getsym (yyvsp[0].string, yylsp[0]); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 61:
|
case 61:
|
||||||
#line 344 "parse-gram.y"
|
#line 345 "parse-gram.y"
|
||||||
{ yyval.string = yyvsp[0].string; }
|
{ yyval.string = yyvsp[0].string; }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 62:
|
case 62:
|
||||||
#line 350 "parse-gram.y"
|
#line 351 "parse-gram.y"
|
||||||
{
|
{
|
||||||
yyval.symbol = getsym (yyvsp[0].string, yylsp[0]);
|
yyval.symbol = getsym (yyvsp[0].string, yylsp[0]);
|
||||||
symbol_class_set (yyval.symbol, token_sym);
|
symbol_class_set (yyval.symbol, token_sym);
|
||||||
@@ -1494,7 +1495,7 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 63:
|
case 63:
|
||||||
#line 359 "parse-gram.y"
|
#line 360 "parse-gram.y"
|
||||||
{
|
{
|
||||||
yyval.string = yyvsp[0].string + 1;
|
yyval.string = yyvsp[0].string + 1;
|
||||||
yyval.string[strlen (yyval.string) - 1] = '\0';
|
yyval.string[strlen (yyval.string) - 1] = '\0';
|
||||||
@@ -1502,14 +1503,14 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 64:
|
case 64:
|
||||||
#line 367 "parse-gram.y"
|
#line 368 "parse-gram.y"
|
||||||
{
|
{
|
||||||
yyval.string = xstrdup ("");
|
yyval.string = xstrdup ("");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 65:
|
case 65:
|
||||||
#line 371 "parse-gram.y"
|
#line 372 "parse-gram.y"
|
||||||
{
|
{
|
||||||
yyval.string = yyvsp[0].string;
|
yyval.string = yyvsp[0].string;
|
||||||
}
|
}
|
||||||
@@ -1519,7 +1520,7 @@ yyreduce:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Line 1012 of /usr/local/share/bison/bison.simple. */
|
/* Line 1012 of /usr/local/share/bison/bison.simple. */
|
||||||
#line 1523 "parse-gram.c"
|
#line 1524 "parse-gram.c"
|
||||||
|
|
||||||
yyvsp -= yylen;
|
yyvsp -= yylen;
|
||||||
yyssp -= yylen;
|
yyssp -= yylen;
|
||||||
@@ -1740,7 +1741,7 @@ yyreturn:
|
|||||||
return yyresult;
|
return yyresult;
|
||||||
}
|
}
|
||||||
|
|
||||||
#line 380 "parse-gram.y"
|
#line 381 "parse-gram.y"
|
||||||
|
|
||||||
/*------------------------------------------------------------------.
|
/*------------------------------------------------------------------.
|
||||||
| When debugging the parser, display tokens' locations and values. |
|
| When debugging the parser, display tokens' locations and values. |
|
||||||
|
|||||||
@@ -93,10 +93,10 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifndef YYSTYPE
|
#ifndef YYSTYPE
|
||||||
#line 89 "parse-gram.y"
|
#line 90 "parse-gram.y"
|
||||||
typedef union {
|
typedef union {
|
||||||
symbol_t *symbol;
|
symbol_t *symbol;
|
||||||
symbol_list *list;
|
symbol_list_t *list;
|
||||||
int integer;
|
int integer;
|
||||||
char *string;
|
char *string;
|
||||||
associativity assoc;
|
associativity assoc;
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
#include "output.h"
|
#include "output.h"
|
||||||
|
#include "symlist.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
#include "conflicts.h"
|
#include "conflicts.h"
|
||||||
@@ -88,7 +89,7 @@ int current_prec = 0;
|
|||||||
%union
|
%union
|
||||||
{
|
{
|
||||||
symbol_t *symbol;
|
symbol_t *symbol;
|
||||||
symbol_list *list;
|
symbol_list_t *list;
|
||||||
int integer;
|
int integer;
|
||||||
char *string;
|
char *string;
|
||||||
associativity assoc;
|
associativity assoc;
|
||||||
@@ -214,24 +215,24 @@ symbol_declaration:
|
|||||||
}
|
}
|
||||||
| "%type" TYPE symbols.1
|
| "%type" TYPE symbols.1
|
||||||
{
|
{
|
||||||
symbol_list *list;
|
symbol_list_t *list;
|
||||||
for (list = $3; list; list = list->next)
|
for (list = $3; list; list = list->next)
|
||||||
symbol_type_set (list->sym, list->location, $2);
|
symbol_type_set (list->sym, list->location, $2);
|
||||||
LIST_FREE (symbol_list, $3);
|
LIST_FREE (symbol_list_t, $3);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
precedence_declaration:
|
precedence_declaration:
|
||||||
precedence_declarator type.opt symbols.1
|
precedence_declarator type.opt symbols.1
|
||||||
{
|
{
|
||||||
symbol_list *list;
|
symbol_list_t *list;
|
||||||
++current_prec;
|
++current_prec;
|
||||||
for (list = $3; list; list = list->next)
|
for (list = $3; list; list = list->next)
|
||||||
{
|
{
|
||||||
symbol_type_set (list->sym, list->location, current_type);
|
symbol_type_set (list->sym, list->location, current_type);
|
||||||
symbol_precedence_set (list->sym, list->location, current_prec, $1);
|
symbol_precedence_set (list->sym, list->location, current_prec, $1);
|
||||||
}
|
}
|
||||||
LIST_FREE (symbol_list, $3);
|
LIST_FREE (symbol_list_t, $3);
|
||||||
current_type = NULL;
|
current_type = NULL;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|||||||
79
src/reader.c
79
src/reader.c
@@ -26,6 +26,7 @@
|
|||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
|
#include "symlist.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
#include "complain.h"
|
#include "complain.h"
|
||||||
@@ -35,68 +36,12 @@
|
|||||||
#include "muscle_tab.h"
|
#include "muscle_tab.h"
|
||||||
|
|
||||||
int lineno;
|
int lineno;
|
||||||
static symbol_list *grammar = NULL;
|
static symbol_list_t *grammar = NULL;
|
||||||
static int start_flag = 0;
|
static int start_flag = 0;
|
||||||
|
|
||||||
/* Nonzero if %union has been seen. */
|
/* Nonzero if %union has been seen. */
|
||||||
int typed = 0;
|
int typed = 0;
|
||||||
|
|
||||||
symbol_list *
|
|
||||||
symbol_list_new (symbol_t *sym, location_t location)
|
|
||||||
{
|
|
||||||
symbol_list *res = XMALLOC (symbol_list, 1);
|
|
||||||
res->next = NULL;
|
|
||||||
res->sym = sym;
|
|
||||||
res->location = location;
|
|
||||||
res->action = NULL;
|
|
||||||
res->ruleprec = NULL;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
symbol_list *
|
|
||||||
symbol_list_prepend (symbol_list *list, symbol_t *symbol, location_t location)
|
|
||||||
{
|
|
||||||
symbol_list *res = symbol_list_new (symbol, location);
|
|
||||||
res->next = list;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------.
|
|
||||||
| Get the data type (alternative in the union) of the value for |
|
|
||||||
| symbol N in rule RULE. |
|
|
||||||
`--------------------------------------------------------------*/
|
|
||||||
|
|
||||||
char *
|
|
||||||
get_type_name (int n, symbol_list *rule)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
symbol_list *rp;
|
|
||||||
|
|
||||||
if (n < 0)
|
|
||||||
{
|
|
||||||
complain (_("invalid $ value"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
rp = rule;
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
while (i < n)
|
|
||||||
{
|
|
||||||
rp = rp->next;
|
|
||||||
if (rp == NULL || rp->sym == NULL)
|
|
||||||
{
|
|
||||||
complain (_("invalid $ value"));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rp->sym->type_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------.
|
/*-----------------------.
|
||||||
| Set the start symbol. |
|
| Set the start symbol. |
|
||||||
`-----------------------*/
|
`-----------------------*/
|
||||||
@@ -183,7 +128,7 @@ gensym (location_t location)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------.
|
/*-------------------------------------------------------------------.
|
||||||
| Parse the input grammar into a one symbol_list structure. Each |
|
| Parse the input grammar into a one symbol_list_t structure. Each |
|
||||||
| rule is represented by a sequence of symbols: the left hand side |
|
| rule is represented by a sequence of symbols: the left hand side |
|
||||||
| followed by the contents of the right hand side, followed by a |
|
| followed by the contents of the right hand side, followed by a |
|
||||||
| null pointer instead of a symbol to terminate the rule. The next |
|
| null pointer instead of a symbol to terminate the rule. The next |
|
||||||
@@ -201,13 +146,13 @@ gensym (location_t location)
|
|||||||
`-------------------------------------------------------------------*/
|
`-------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* The (currently) last symbol of GRAMMAR. */
|
/* The (currently) last symbol of GRAMMAR. */
|
||||||
symbol_list *grammar_end = NULL;
|
symbol_list_t *grammar_end = NULL;
|
||||||
|
|
||||||
/* Append S to the GRAMMAR. */
|
/* Append S to the GRAMMAR. */
|
||||||
void
|
void
|
||||||
grammar_symbol_append (symbol_t *symbol, location_t location)
|
grammar_symbol_append (symbol_t *symbol, location_t location)
|
||||||
{
|
{
|
||||||
symbol_list *p = symbol_list_new (symbol, location);
|
symbol_list_t *p = symbol_list_new (symbol, location);
|
||||||
|
|
||||||
if (grammar_end)
|
if (grammar_end)
|
||||||
grammar_end->next = p;
|
grammar_end->next = p;
|
||||||
@@ -220,8 +165,8 @@ grammar_symbol_append (symbol_t *symbol, location_t location)
|
|||||||
/* The rule currently being defined, and the previous rule.
|
/* The rule currently being defined, and the previous rule.
|
||||||
CURRENT_RULE points to the first LHS of the current rule, while
|
CURRENT_RULE points to the first LHS of the current rule, while
|
||||||
PREVIOUS_RULE_END points to the *end* of the previous rule (NULL). */
|
PREVIOUS_RULE_END points to the *end* of the previous rule (NULL). */
|
||||||
symbol_list *current_rule = NULL;
|
symbol_list_t *current_rule = NULL;
|
||||||
symbol_list *previous_rule_end = NULL;
|
symbol_list_t *previous_rule_end = NULL;
|
||||||
|
|
||||||
|
|
||||||
/*----------------------------------------------.
|
/*----------------------------------------------.
|
||||||
@@ -323,7 +268,7 @@ grammar_midrule_action (void)
|
|||||||
action. Create the MIDRULE. */
|
action. Create the MIDRULE. */
|
||||||
location_t dummy_location = current_rule->action_location;
|
location_t dummy_location = current_rule->action_location;
|
||||||
symbol_t *dummy = gensym (dummy_location);
|
symbol_t *dummy = gensym (dummy_location);
|
||||||
symbol_list *midrule = symbol_list_new (dummy, dummy_location);
|
symbol_list_t *midrule = symbol_list_new (dummy, dummy_location);
|
||||||
|
|
||||||
/* Make a new rule, whose body is empty, before the current one, so
|
/* Make a new rule, whose body is empty, before the current one, so
|
||||||
that the action just read can belong to it. */
|
that the action just read can belong to it. */
|
||||||
@@ -397,7 +342,7 @@ packgram (void)
|
|||||||
{
|
{
|
||||||
unsigned int itemno;
|
unsigned int itemno;
|
||||||
int ruleno;
|
int ruleno;
|
||||||
symbol_list *p;
|
symbol_list_t *p;
|
||||||
|
|
||||||
ritem = XCALLOC (item_number_t, nritems);
|
ritem = XCALLOC (item_number_t, nritems);
|
||||||
rules = XCALLOC (rule_t, nrules) - 1;
|
rules = XCALLOC (rule_t, nrules) - 1;
|
||||||
@@ -518,7 +463,7 @@ reader (void)
|
|||||||
|
|
||||||
axiom: %start EOF. */
|
axiom: %start EOF. */
|
||||||
{
|
{
|
||||||
symbol_list *p = symbol_list_new (axiom, empty_location);
|
symbol_list_t *p = symbol_list_new (axiom, empty_location);
|
||||||
p->location = grammar->location;
|
p->location = grammar->location;
|
||||||
p->next = symbol_list_new (startsymbol, empty_location);
|
p->next = symbol_list_new (startsymbol, empty_location);
|
||||||
p->next->next = symbol_list_new (eoftoken, empty_location);
|
p->next->next = symbol_list_new (eoftoken, empty_location);
|
||||||
@@ -544,6 +489,6 @@ reader (void)
|
|||||||
/* Convert the grammar into the format described in gram.h. */
|
/* Convert the grammar into the format described in gram.h. */
|
||||||
packgram ();
|
packgram ();
|
||||||
|
|
||||||
/* The grammar as a symbol_list is no longer needed. */
|
/* The grammar as a symbol_list_t is no longer needed. */
|
||||||
LIST_FREE (symbol_list, grammar);
|
LIST_FREE (symbol_list_t, grammar);
|
||||||
}
|
}
|
||||||
|
|||||||
23
src/reader.h
23
src/reader.h
@@ -21,25 +21,7 @@
|
|||||||
#ifndef READER_H_
|
#ifndef READER_H_
|
||||||
# define READER_H_
|
# define READER_H_
|
||||||
|
|
||||||
# include "location.h"
|
# include "symlist.h"
|
||||||
|
|
||||||
typedef struct symbol_list
|
|
||||||
{
|
|
||||||
struct symbol_list *next;
|
|
||||||
symbol_t *sym;
|
|
||||||
location_t location;
|
|
||||||
|
|
||||||
/* The action is attached to the LHS of a rule. */
|
|
||||||
const char *action;
|
|
||||||
location_t action_location;
|
|
||||||
|
|
||||||
symbol_t *ruleprec;
|
|
||||||
} symbol_list;
|
|
||||||
|
|
||||||
symbol_list *symbol_list_new PARAMS ((symbol_t *sym, location_t location));
|
|
||||||
symbol_list *symbol_list_prepend PARAMS ((symbol_list *list,
|
|
||||||
symbol_t *sym, location_t location));
|
|
||||||
|
|
||||||
# include "parse-gram.h"
|
# include "parse-gram.h"
|
||||||
|
|
||||||
typedef struct gram_control_s
|
typedef struct gram_control_s
|
||||||
@@ -66,7 +48,6 @@ void gram_error (gram_control_t *control,
|
|||||||
location_t *loc, const char *msg);
|
location_t *loc, const char *msg);
|
||||||
int gram_parse (void *control);
|
int gram_parse (void *control);
|
||||||
|
|
||||||
char *get_type_name PARAMS ((int n, symbol_list *rule));
|
|
||||||
extern int typed;
|
extern int typed;
|
||||||
|
|
||||||
/* From reader.c. */
|
/* From reader.c. */
|
||||||
@@ -82,7 +63,7 @@ void grammar_current_rule_symbol_append PARAMS ((symbol_t *symbol,
|
|||||||
location_t l));
|
location_t l));
|
||||||
void grammar_current_rule_action_append PARAMS ((const char *action,
|
void grammar_current_rule_action_append PARAMS ((const char *action,
|
||||||
location_t l));
|
location_t l));
|
||||||
extern symbol_list *current_rule;
|
extern symbol_list_t *current_rule;
|
||||||
void reader PARAMS ((void));
|
void reader PARAMS ((void));
|
||||||
|
|
||||||
#endif /* !READER_H_ */
|
#endif /* !READER_H_ */
|
||||||
|
|||||||
@@ -790,7 +790,7 @@ scanner_last_string_free (void)
|
|||||||
static int braces_level = 0;
|
static int braces_level = 0;
|
||||||
static int percent_percent_count = 0;
|
static int percent_percent_count = 0;
|
||||||
|
|
||||||
static void handle_dollar PARAMS ((char *cp));
|
static void handle_dollar PARAMS ((char *cp, location_t location));
|
||||||
static void handle_at PARAMS ((char *cp));
|
static void handle_at PARAMS ((char *cp));
|
||||||
|
|
||||||
#define SC_COMMENT 1
|
#define SC_COMMENT 1
|
||||||
@@ -1696,7 +1696,7 @@ YY_OBS_GROW; braces_level++;
|
|||||||
case 82:
|
case 82:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 444 "scan-gram.l"
|
#line 444 "scan-gram.l"
|
||||||
{ handle_dollar (yytext); }
|
{ handle_dollar (yytext, *yylloc); }
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 83:
|
case 83:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
@@ -2701,7 +2701,7 @@ int main()
|
|||||||
`------------------------------------------------------------------*/
|
`------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_dollar (char *cp)
|
handle_dollar (char *cp, location_t location)
|
||||||
{
|
{
|
||||||
const char *type_name = NULL;
|
const char *type_name = NULL;
|
||||||
|
|
||||||
@@ -2710,7 +2710,7 @@ handle_dollar (char *cp)
|
|||||||
stack. It is not the same as the rule->length in the case of mid
|
stack. It is not the same as the rule->length in the case of mid
|
||||||
rule actions. */
|
rule actions. */
|
||||||
int rule_length = 0;
|
int rule_length = 0;
|
||||||
symbol_list *rhs;
|
symbol_list_t *rhs;
|
||||||
for (rhs = current_rule->next; rhs; rhs = rhs->next)
|
for (rhs = current_rule->next; rhs; rhs = rhs->next)
|
||||||
++rule_length;
|
++rule_length;
|
||||||
|
|
||||||
@@ -2729,10 +2729,10 @@ handle_dollar (char *cp)
|
|||||||
if (*cp == '$')
|
if (*cp == '$')
|
||||||
{
|
{
|
||||||
if (!type_name)
|
if (!type_name)
|
||||||
type_name = get_type_name (0, current_rule);
|
type_name = symbol_list_n_type_name_get (current_rule, location, 0);
|
||||||
if (!type_name && typed)
|
if (!type_name && typed)
|
||||||
complain (_("$$ of `%s' has no declared type"),
|
complain_at (location, _("$$ of `%s' has no declared type"),
|
||||||
current_rule->sym->tag);
|
current_rule->sym->tag);
|
||||||
if (!type_name)
|
if (!type_name)
|
||||||
type_name = "";
|
type_name = "";
|
||||||
obstack_fgrow1 (&string_obstack,
|
obstack_fgrow1 (&string_obstack,
|
||||||
@@ -2743,13 +2743,14 @@ handle_dollar (char *cp)
|
|||||||
int n = strtol (cp, &cp, 10);
|
int n = strtol (cp, &cp, 10);
|
||||||
|
|
||||||
if (n > rule_length)
|
if (n > rule_length)
|
||||||
complain (_("invalid value: %s%d"), "$", n);
|
complain_at (location, _("invalid value: %s%d"), "$", n);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!type_name && n > 0)
|
if (!type_name && n > 0)
|
||||||
type_name = get_type_name (n, current_rule);
|
type_name = symbol_list_n_type_name_get (current_rule, location,
|
||||||
|
n);
|
||||||
if (!type_name && typed)
|
if (!type_name && typed)
|
||||||
complain (_("$%d of `%s' has no declared type"),
|
complain_at (location, _("$%d of `%s' has no declared type"),
|
||||||
n, current_rule->sym->tag);
|
n, current_rule->sym->tag);
|
||||||
if (!type_name)
|
if (!type_name)
|
||||||
type_name = "";
|
type_name = "";
|
||||||
@@ -2779,7 +2780,7 @@ handle_at (char *cp)
|
|||||||
stack. It is not the same as the rule->length in the case of mid
|
stack. It is not the same as the rule->length in the case of mid
|
||||||
rule actions. */
|
rule actions. */
|
||||||
int rule_length = 0;
|
int rule_length = 0;
|
||||||
symbol_list *rhs;
|
symbol_list_t *rhs;
|
||||||
for (rhs = current_rule->next; rhs; rhs = rhs->next)
|
for (rhs = current_rule->next; rhs; rhs = rhs->next)
|
||||||
++rule_length;
|
++rule_length;
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ scanner_last_string_free (void)
|
|||||||
static int braces_level = 0;
|
static int braces_level = 0;
|
||||||
static int percent_percent_count = 0;
|
static int percent_percent_count = 0;
|
||||||
|
|
||||||
static void handle_dollar PARAMS ((char *cp));
|
static void handle_dollar PARAMS ((char *cp, location_t location));
|
||||||
static void handle_at PARAMS ((char *cp));
|
static void handle_at PARAMS ((char *cp));
|
||||||
|
|
||||||
%}
|
%}
|
||||||
@@ -441,7 +441,7 @@ blanks [ \t\f]+
|
|||||||
|
|
||||||
"{" YY_OBS_GROW; braces_level++;
|
"{" YY_OBS_GROW; braces_level++;
|
||||||
|
|
||||||
"$"("<"[^>]+">")?(-?[0-9]+|"$") { handle_dollar (yytext); }
|
"$"("<"[^>]+">")?(-?[0-9]+|"$") { handle_dollar (yytext, *yylloc); }
|
||||||
"@"(-?[0-9]+|"$") { handle_at (yytext); }
|
"@"(-?[0-9]+|"$") { handle_at (yytext); }
|
||||||
|
|
||||||
[^$@\[\]/\'\"\{\}\n\r]+ YY_OBS_GROW;
|
[^$@\[\]/\'\"\{\}\n\r]+ YY_OBS_GROW;
|
||||||
@@ -520,7 +520,7 @@ blanks [ \t\f]+
|
|||||||
`------------------------------------------------------------------*/
|
`------------------------------------------------------------------*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_dollar (char *cp)
|
handle_dollar (char *cp, location_t location)
|
||||||
{
|
{
|
||||||
const char *type_name = NULL;
|
const char *type_name = NULL;
|
||||||
|
|
||||||
@@ -529,7 +529,7 @@ handle_dollar (char *cp)
|
|||||||
stack. It is not the same as the rule->length in the case of mid
|
stack. It is not the same as the rule->length in the case of mid
|
||||||
rule actions. */
|
rule actions. */
|
||||||
int rule_length = 0;
|
int rule_length = 0;
|
||||||
symbol_list *rhs;
|
symbol_list_t *rhs;
|
||||||
for (rhs = current_rule->next; rhs; rhs = rhs->next)
|
for (rhs = current_rule->next; rhs; rhs = rhs->next)
|
||||||
++rule_length;
|
++rule_length;
|
||||||
|
|
||||||
@@ -548,10 +548,10 @@ handle_dollar (char *cp)
|
|||||||
if (*cp == '$')
|
if (*cp == '$')
|
||||||
{
|
{
|
||||||
if (!type_name)
|
if (!type_name)
|
||||||
type_name = get_type_name (0, current_rule);
|
type_name = symbol_list_n_type_name_get (current_rule, location, 0);
|
||||||
if (!type_name && typed)
|
if (!type_name && typed)
|
||||||
complain (_("$$ of `%s' has no declared type"),
|
complain_at (location, _("$$ of `%s' has no declared type"),
|
||||||
current_rule->sym->tag);
|
current_rule->sym->tag);
|
||||||
if (!type_name)
|
if (!type_name)
|
||||||
type_name = "";
|
type_name = "";
|
||||||
obstack_fgrow1 (&string_obstack,
|
obstack_fgrow1 (&string_obstack,
|
||||||
@@ -562,13 +562,14 @@ handle_dollar (char *cp)
|
|||||||
int n = strtol (cp, &cp, 10);
|
int n = strtol (cp, &cp, 10);
|
||||||
|
|
||||||
if (n > rule_length)
|
if (n > rule_length)
|
||||||
complain (_("invalid value: %s%d"), "$", n);
|
complain_at (location, _("invalid value: %s%d"), "$", n);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!type_name && n > 0)
|
if (!type_name && n > 0)
|
||||||
type_name = get_type_name (n, current_rule);
|
type_name = symbol_list_n_type_name_get (current_rule, location,
|
||||||
|
n);
|
||||||
if (!type_name && typed)
|
if (!type_name && typed)
|
||||||
complain (_("$%d of `%s' has no declared type"),
|
complain_at (location, _("$%d of `%s' has no declared type"),
|
||||||
n, current_rule->sym->tag);
|
n, current_rule->sym->tag);
|
||||||
if (!type_name)
|
if (!type_name)
|
||||||
type_name = "";
|
type_name = "";
|
||||||
@@ -598,7 +599,7 @@ handle_at (char *cp)
|
|||||||
stack. It is not the same as the rule->length in the case of mid
|
stack. It is not the same as the rule->length in the case of mid
|
||||||
rule actions. */
|
rule actions. */
|
||||||
int rule_length = 0;
|
int rule_length = 0;
|
||||||
symbol_list *rhs;
|
symbol_list_t *rhs;
|
||||||
for (rhs = current_rule->next; rhs; rhs = rhs->next)
|
for (rhs = current_rule->next; rhs; rhs = rhs->next)
|
||||||
++rule_length;
|
++rule_length;
|
||||||
|
|
||||||
|
|||||||
99
src/symlist.c
Normal file
99
src/symlist.c
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/* Lists of symbols for Bison
|
||||||
|
Copyright (C) 2002 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
|
Bison is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
Bison is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Bison; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include "system.h"
|
||||||
|
#include "symlist.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------.
|
||||||
|
| Create a list containing SYMBOL at LOCATION. |
|
||||||
|
`----------------------------------------------*/
|
||||||
|
|
||||||
|
symbol_list_t *
|
||||||
|
symbol_list_new (symbol_t *sym, location_t location)
|
||||||
|
{
|
||||||
|
symbol_list_t *res = XMALLOC (symbol_list_t, 1);
|
||||||
|
res->next = NULL;
|
||||||
|
res->sym = sym;
|
||||||
|
res->location = location;
|
||||||
|
res->action = NULL;
|
||||||
|
res->ruleprec = NULL;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-----------------------------------------.
|
||||||
|
| Prepend SYMBOL at LOCATION to the LIST. |
|
||||||
|
`-----------------------------------------*/
|
||||||
|
|
||||||
|
symbol_list_t *
|
||||||
|
symbol_list_prepend (symbol_list_t *list,
|
||||||
|
symbol_t *symbol, location_t location)
|
||||||
|
{
|
||||||
|
symbol_list_t *res = symbol_list_new (symbol, location);
|
||||||
|
res->next = list;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*-------------------------------------------------.
|
||||||
|
| Free the LIST, but not the symbols it contains. |
|
||||||
|
`-------------------------------------------------*/
|
||||||
|
|
||||||
|
void
|
||||||
|
symbol_list_free (symbol_list_t *list)
|
||||||
|
{
|
||||||
|
LIST_FREE (symbol_list_t, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------.
|
||||||
|
| Get the data type (alternative in the union) of the value for |
|
||||||
|
| symbol N in rule RULE. |
|
||||||
|
`--------------------------------------------------------------*/
|
||||||
|
|
||||||
|
char *
|
||||||
|
symbol_list_n_type_name_get (symbol_list_t *rule, location_t location, int n)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
symbol_list_t *rp;
|
||||||
|
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
complain_at (location, _("invalid $ value"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rp = rule;
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
while (i < n)
|
||||||
|
{
|
||||||
|
rp = rp->next;
|
||||||
|
if (rp == NULL || rp->sym == NULL)
|
||||||
|
{
|
||||||
|
complain_at (location, _("invalid $ value"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rp->sym->type_name;
|
||||||
|
}
|
||||||
60
src/symlist.h
Normal file
60
src/symlist.h
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
/* Lists of symbols for Bison
|
||||||
|
Copyright (C) 2002 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
|
Bison is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
Bison is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Bison; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifndef SYMLIST_H_
|
||||||
|
# define SYMLIST_H_
|
||||||
|
|
||||||
|
# include "symtab.h"
|
||||||
|
# include "location.h"
|
||||||
|
|
||||||
|
typedef struct symbol_list_s
|
||||||
|
{
|
||||||
|
struct symbol_list_s *next;
|
||||||
|
symbol_t *sym;
|
||||||
|
location_t location;
|
||||||
|
|
||||||
|
/* The action is attached to the LHS of a rule. */
|
||||||
|
const char *action;
|
||||||
|
location_t action_location;
|
||||||
|
|
||||||
|
symbol_t *ruleprec;
|
||||||
|
} symbol_list_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* Create a list containing SYMBOL at LOCATION. */
|
||||||
|
symbol_list_t *symbol_list_new PARAMS ((symbol_t *sym, location_t location));
|
||||||
|
|
||||||
|
|
||||||
|
/* Prepend SYMBOL at LOCATION to the LIST. */
|
||||||
|
symbol_list_t * symbol_list_prepend PARAMS ((symbol_list_t *list,
|
||||||
|
symbol_t *symbol,
|
||||||
|
location_t location));
|
||||||
|
|
||||||
|
|
||||||
|
/* Free the LIST, but not the symbols it contains. */
|
||||||
|
void symbol_list_free PARAMS ((symbol_list_t *list));
|
||||||
|
|
||||||
|
|
||||||
|
/* Get the data type (alternative in the union) of the value for
|
||||||
|
symbol N in rule RULE. */
|
||||||
|
char *symbol_list_n_type_name_get PARAMS ((symbol_list_t *rule,
|
||||||
|
location_t location, int n));
|
||||||
|
|
||||||
|
#endif /* !SYMLIST_H_ */
|
||||||
@@ -57,7 +57,7 @@ exp: { $$ = $1 ; };
|
|||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CHECK([bison input.y], [1], [],
|
AT_CHECK([bison input.y], [1], [],
|
||||||
[[input.y:2: invalid value: $1
|
[[input.y:2.6-14: invalid value: $1
|
||||||
]])
|
]])
|
||||||
|
|
||||||
AT_CLEANUP
|
AT_CLEANUP
|
||||||
|
|||||||
Reference in New Issue
Block a user