* src/reader.h, src/reader.c (symbol_list, symbol_list_new)
authorAkim Demaille <akim@epita.fr>
Mon, 17 Jun 2002 07:04:49 +0000 (07:04 +0000)
committerAkim Demaille <akim@epita.fr>
Mon, 17 Jun 2002 07:04:49 +0000 (07:04 +0000)
(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.

12 files changed:
ChangeLog
src/Makefile.am
src/parse-gram.c
src/parse-gram.h
src/parse-gram.y
src/reader.c
src/reader.h
src/scan-gram.c
src/scan-gram.l
src/symlist.c [new file with mode: 0644]
src/symlist.h [new file with mode: 0644]
tests/input.at

index 2b0c8ce..b93266f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 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>
+
        * src/reader.h, src/reader.c (symbol_list_new): Export it.
        (symbol_list_prepend): New.
        * src/parse-gram.y (%union): `list' is a new member.
index 4815815..c710058 100644 (file)
@@ -59,6 +59,7 @@ bison_SOURCES =                                 \
        scan-gram.l                               \
        scan-skel.l                               \
        state.c state.h                           \
+       symlist.c symlist.h                       \
        symtab.c symtab.h                         \
        system.h                                  \
        types.h                                   \
index 31c9d98..6a08310 100644 (file)
@@ -68,6 +68,7 @@
 #include "files.h"
 #include "getargs.h"
 #include "output.h"
+#include "symlist.h"
 #include "gram.h"
 #include "reader.h"
 #include "conflicts.h"
@@ -222,16 +223,16 @@ int current_prec = 0;
 #endif
 
 #ifndef YYSTYPE
-#line 89 "parse-gram.y"
+#line 90 "parse-gram.y"
 typedef union {
   symbol_t *symbol;
-  symbol_list *list;
+  symbol_list_t *list;
   int integer;
   char *string;
   associativity assoc;
 } yystype;
 /* Line 199 of /usr/local/share/bison/bison.simple.  */
-#line 235 "parse-gram.c"
+#line 236 "parse-gram.c"
 # define YYSTYPE yystype
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
@@ -252,7 +253,7 @@ typedef struct yyltype
 
 
 /* Line 219 of /usr/local/share/bison/bison.simple.  */
-#line 256 "parse-gram.c"
+#line 257 "parse-gram.c"
 
 #if ! defined (yyoverflow) || YYERROR_VERBOSE
 
@@ -447,13 +448,13 @@ static const signed char yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short yyrline[] =
 {
-       0,   151,   151,   164,   166,   169,   171,   172,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,   182,   183,   184,
-     185,   186,   189,   191,   192,   196,   204,   204,   210,   210,
-     215,   224,   239,   241,   242,   245,   247,   252,   254,   258,
-     263,   268,   274,   280,   290,   293,   302,   304,   310,   312,
-     315,   315,   320,   322,   325,   328,   330,   332,   336,   338,
-     339,   342,   348,   357,   365,   370,   376,   378
+       0,   152,   152,   165,   167,   170,   172,   173,   174,   175,
+     176,   177,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   190,   192,   193,   197,   205,   205,   211,   211,
+     216,   225,   240,   242,   243,   246,   248,   253,   255,   259,
+     264,   269,   275,   281,   291,   294,   303,   305,   311,   313,
+     316,   316,   321,   323,   326,   329,   331,   333,   337,   339,
+     340,   343,   349,   358,   366,   371,   377,   379
 };
 #endif
 
@@ -1183,7 +1184,7 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-#line 153 "parse-gram.y"
+#line 154 "parse-gram.y"
     {
       yycontrol->errcode = 0;
       epilogue_set (yyvsp[0].string, yylsp[0]);
@@ -1191,94 +1192,94 @@ yyreduce:
     break;
 
   case 6:
-#line 171 "parse-gram.y"
+#line 172 "parse-gram.y"
     { prologue_augment (yyvsp[0].string, yylsp[0]); }
     break;
 
   case 7:
-#line 172 "parse-gram.y"
+#line 173 "parse-gram.y"
     { debug_flag = 1; }
     break;
 
   case 8:
-#line 173 "parse-gram.y"
+#line 174 "parse-gram.y"
     { muscle_insert (yyvsp[-1].string, yyvsp[0].string); }
     break;
 
   case 9:
-#line 174 "parse-gram.y"
+#line 175 "parse-gram.y"
     { defines_flag = 1; }
     break;
 
   case 10:
-#line 175 "parse-gram.y"
+#line 176 "parse-gram.y"
     { error_verbose = 1; }
     break;
 
   case 11:
-#line 176 "parse-gram.y"
+#line 177 "parse-gram.y"
     { expected_conflicts = yyvsp[0].integer; }
     break;
 
   case 12:
-#line 177 "parse-gram.y"
+#line 178 "parse-gram.y"
     { spec_file_prefix = yyvsp[0].string; }
     break;
 
   case 13:
-#line 178 "parse-gram.y"
+#line 179 "parse-gram.y"
     { locations_flag = 1; }
     break;
 
   case 14:
-#line 179 "parse-gram.y"
+#line 180 "parse-gram.y"
     { spec_name_prefix = yyvsp[0].string; }
     break;
 
   case 15:
-#line 180 "parse-gram.y"
+#line 181 "parse-gram.y"
     { no_lines_flag = 1; }
     break;
 
   case 16:
-#line 181 "parse-gram.y"
+#line 182 "parse-gram.y"
     { spec_outfile = yyvsp[0].string; }
     break;
 
   case 17:
-#line 182 "parse-gram.y"
+#line 183 "parse-gram.y"
     { pure_parser = 1; }
     break;
 
   case 18:
-#line 183 "parse-gram.y"
+#line 184 "parse-gram.y"
     { skeleton = yyvsp[0].string; }
     break;
 
   case 19:
-#line 184 "parse-gram.y"
+#line 185 "parse-gram.y"
     { token_table_flag = 1; }
     break;
 
   case 20:
-#line 185 "parse-gram.y"
+#line 186 "parse-gram.y"
     { report_flag = 1; }
     break;
 
   case 21:
-#line 186 "parse-gram.y"
+#line 187 "parse-gram.y"
     { yacc_flag = 1; }
     break;
 
   case 24:
-#line 193 "parse-gram.y"
+#line 194 "parse-gram.y"
     {
       grammar_start_symbol_set (yyvsp[0].symbol, yylsp[0]);
     }
     break;
 
   case 25:
-#line 197 "parse-gram.y"
+#line 198 "parse-gram.y"
     {
       typed = 1;
       MUSCLE_INSERT_INT ("stype_line", yylsp[0].first_line);
@@ -1287,12 +1288,12 @@ yyreduce:
     break;
 
   case 26:
-#line 205 "parse-gram.y"
+#line 206 "parse-gram.y"
     { current_class = nterm_sym; }
     break;
 
   case 27:
-#line 206 "parse-gram.y"
+#line 207 "parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1300,12 +1301,12 @@ yyreduce:
     break;
 
   case 28:
-#line 210 "parse-gram.y"
+#line 211 "parse-gram.y"
     { current_class = token_sym; }
     break;
 
   case 29:
-#line 211 "parse-gram.y"
+#line 212 "parse-gram.y"
     {
       current_class = unknown_sym;
       current_type = NULL;
@@ -1313,74 +1314,74 @@ yyreduce:
     break;
 
   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)
        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;
 
   case 31:
-#line 226 "parse-gram.y"
+#line 227 "parse-gram.y"
     {
-      symbol_list *list;
+      symbol_list_t *list;
       ++current_prec;
       for (list = yyvsp[0].list; list; list = list->next)
        {
          symbol_type_set (list->sym, list->location, current_type);
          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;
     }
     break;
 
   case 32:
-#line 240 "parse-gram.y"
+#line 241 "parse-gram.y"
     { yyval.assoc = left_assoc; }
     break;
 
   case 33:
-#line 241 "parse-gram.y"
+#line 242 "parse-gram.y"
     { yyval.assoc = right_assoc; }
     break;
 
   case 34:
-#line 242 "parse-gram.y"
+#line 243 "parse-gram.y"
     { yyval.assoc = non_assoc; }
     break;
 
   case 35:
-#line 246 "parse-gram.y"
+#line 247 "parse-gram.y"
     { current_type = NULL;}
     break;
 
   case 36:
-#line 247 "parse-gram.y"
+#line 248 "parse-gram.y"
     { current_type = yyvsp[0].string; }
     break;
 
   case 37:
-#line 253 "parse-gram.y"
+#line 254 "parse-gram.y"
     { yyval.list = symbol_list_new (yyvsp[0].symbol, yylsp[0]); }
     break;
 
   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]); }
     break;
 
   case 39:
-#line 260 "parse-gram.y"
+#line 261 "parse-gram.y"
     {
        current_type = yyvsp[0].string;
      }
     break;
 
   case 40:
-#line 264 "parse-gram.y"
+#line 265 "parse-gram.y"
     {
        symbol_class_set (yyvsp[0].symbol, current_class);
        symbol_type_set (yyvsp[0].symbol, yylsp[0], current_type);
@@ -1388,7 +1389,7 @@ yyreduce:
     break;
 
   case 41:
-#line 269 "parse-gram.y"
+#line 270 "parse-gram.y"
     {
       symbol_class_set (yyvsp[-1].symbol, current_class);
       symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
@@ -1397,7 +1398,7 @@ yyreduce:
     break;
 
   case 42:
-#line 275 "parse-gram.y"
+#line 276 "parse-gram.y"
     {
       symbol_class_set (yyvsp[-1].symbol, current_class);
       symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
@@ -1406,7 +1407,7 @@ yyreduce:
     break;
 
   case 43:
-#line 281 "parse-gram.y"
+#line 282 "parse-gram.y"
     {
       symbol_class_set (yyvsp[-2].symbol, current_class);
       symbol_type_set (yyvsp[-2].symbol, yylsp[-2], current_type);
@@ -1416,77 +1417,77 @@ yyreduce:
     break;
 
   case 44:
-#line 292 "parse-gram.y"
+#line 293 "parse-gram.y"
     {;}
     break;
 
   case 45:
-#line 294 "parse-gram.y"
+#line 295 "parse-gram.y"
     {;}
     break;
 
   case 50:
-#line 316 "parse-gram.y"
+#line 317 "parse-gram.y"
     { current_lhs = yyvsp[-1].symbol; current_lhs_location = yylsp[-1]; }
     break;
 
   case 51:
-#line 317 "parse-gram.y"
+#line 318 "parse-gram.y"
     {;}
     break;
 
   case 52:
-#line 321 "parse-gram.y"
+#line 322 "parse-gram.y"
     { grammar_rule_end (yylsp[0]); }
     break;
 
   case 53:
-#line 322 "parse-gram.y"
+#line 323 "parse-gram.y"
     { grammar_rule_end (yylsp[0]); }
     break;
 
   case 54:
-#line 327 "parse-gram.y"
+#line 328 "parse-gram.y"
     { grammar_rule_begin (current_lhs, current_lhs_location); }
     break;
 
   case 55:
-#line 329 "parse-gram.y"
+#line 330 "parse-gram.y"
     { grammar_current_rule_symbol_append (yyvsp[0].symbol, yylsp[0]); }
     break;
 
   case 56:
-#line 331 "parse-gram.y"
+#line 332 "parse-gram.y"
     { grammar_current_rule_action_append (yyvsp[0].string, yylsp[0]); }
     break;
 
   case 57:
-#line 333 "parse-gram.y"
+#line 334 "parse-gram.y"
     { grammar_current_rule_prec_set (yyvsp[0].symbol); }
     break;
 
   case 58:
-#line 337 "parse-gram.y"
+#line 338 "parse-gram.y"
     { yyval.symbol = yyvsp[0].symbol; }
     break;
 
   case 59:
-#line 338 "parse-gram.y"
+#line 339 "parse-gram.y"
     { yyval.symbol = yyvsp[0].symbol; }
     break;
 
   case 60:
-#line 339 "parse-gram.y"
+#line 340 "parse-gram.y"
     { yyval.symbol = getsym (yyvsp[0].string, yylsp[0]); }
     break;
 
   case 61:
-#line 344 "parse-gram.y"
+#line 345 "parse-gram.y"
     { yyval.string = yyvsp[0].string; }
     break;
 
   case 62:
-#line 350 "parse-gram.y"
+#line 351 "parse-gram.y"
     {
       yyval.symbol = getsym (yyvsp[0].string, yylsp[0]);
       symbol_class_set (yyval.symbol, token_sym);
@@ -1494,7 +1495,7 @@ yyreduce:
     break;
 
   case 63:
-#line 359 "parse-gram.y"
+#line 360 "parse-gram.y"
     {
       yyval.string = yyvsp[0].string + 1;
       yyval.string[strlen (yyval.string) - 1] = '\0';
@@ -1502,14 +1503,14 @@ yyreduce:
     break;
 
   case 64:
-#line 367 "parse-gram.y"
+#line 368 "parse-gram.y"
     {
       yyval.string = xstrdup ("");
     }
     break;
 
   case 65:
-#line 371 "parse-gram.y"
+#line 372 "parse-gram.y"
     {
       yyval.string = yyvsp[0].string;
     }
@@ -1519,7 +1520,7 @@ yyreduce:
     }
 
 /* Line 1012 of /usr/local/share/bison/bison.simple.  */
-#line 1523 "parse-gram.c"
+#line 1524 "parse-gram.c"
 \f
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -1740,7 +1741,7 @@ yyreturn:
   return yyresult;
 }
 
-#line 380 "parse-gram.y"
+#line 381 "parse-gram.y"
 
 /*------------------------------------------------------------------.
 | When debugging the parser, display tokens' locations and values.  |
index f5d9b37..543c70c 100644 (file)
 
 
 #ifndef YYSTYPE
-#line 89 "parse-gram.y"
+#line 90 "parse-gram.y"
 typedef union {
   symbol_t *symbol;
-  symbol_list *list;
+  symbol_list_t *list;
   int integer;
   char *string;
   associativity assoc;
index aa1d2b5..46ccb54 100644 (file)
@@ -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"
@@ -88,7 +89,7 @@ int current_prec = 0;
 %union
 {
   symbol_t *symbol;
-  symbol_list *list;
+  symbol_list_t *list;
   int integer;
   char *string;
   associativity assoc;
@@ -214,24 +215,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);
+      LIST_FREE (symbol_list_t, $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);
+      LIST_FREE (symbol_list_t, $3);
       current_type = NULL;
     }
 ;
index d6abad6..0a3f0e2 100644 (file)
@@ -26,6 +26,7 @@
 #include "getargs.h"
 #include "files.h"
 #include "symtab.h"
+#include "symlist.h"
 #include "options.h"
 #include "gram.h"
 #include "complain.h"
 #include "muscle_tab.h"
 
 int lineno;
-static symbol_list *grammar = NULL;
+static symbol_list_t *grammar = NULL;
 static int start_flag = 0;
 
 /* Nonzero if %union has been seen.  */
 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;
-}
-
 \f
-/*--------------------------------------------------------------.
-| 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.  |
 `-----------------------*/
@@ -183,7 +128,7 @@ gensym (location_t location)
 }
 \f
 /*-------------------------------------------------------------------.
-| 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   |
 | followed by the contents of the right hand side, followed by a     |
 | 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. */
-symbol_list *grammar_end = NULL;
+symbol_list_t *grammar_end = NULL;
 
 /* Append S to the GRAMMAR. */
 void
 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)
     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.
    CURRENT_RULE points to the first LHS of the current rule, while
    PREVIOUS_RULE_END points to the *end* of the previous rule (NULL).  */
-symbol_list *current_rule = NULL;
-symbol_list *previous_rule_end = NULL;
+symbol_list_t *current_rule = NULL;
+symbol_list_t *previous_rule_end = NULL;
 
 
 /*----------------------------------------------.
@@ -323,7 +268,7 @@ grammar_midrule_action (void)
      action.  Create the MIDRULE.  */
   location_t dummy_location = current_rule->action_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
      that the action just read can belong to it.  */
@@ -397,7 +342,7 @@ packgram (void)
 {
   unsigned int itemno;
   int ruleno;
-  symbol_list *p;
+  symbol_list_t *p;
 
   ritem = XCALLOC (item_number_t, nritems);
   rules = XCALLOC (rule_t, nrules) - 1;
@@ -518,7 +463,7 @@ reader (void)
 
      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->next = symbol_list_new (startsymbol, 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.  */
   packgram ();
 
-  /* The grammar as a symbol_list is no longer needed. */
-  LIST_FREE (symbol_list, grammar);
+  /* The grammar as a symbol_list_t is no longer needed. */
+  LIST_FREE (symbol_list_t, grammar);
 }
index 8241940..b5b0ae3 100644 (file)
 #ifndef READER_H_
 # define READER_H_
 
-# include "location.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 "symlist.h"
 # include "parse-gram.h"
 
 typedef struct gram_control_s
@@ -66,7 +48,6 @@ void gram_error (gram_control_t *control,
                 location_t *loc, const char *msg);
 int gram_parse (void *control);
 
-char *get_type_name PARAMS ((int n, symbol_list *rule));
 extern int typed;
 
 /* From reader.c. */
@@ -82,7 +63,7 @@ void grammar_current_rule_symbol_append PARAMS ((symbol_t *symbol,
                                                 location_t l));
 void grammar_current_rule_action_append PARAMS ((const char *action,
                                                 location_t l));
-extern symbol_list *current_rule;
+extern symbol_list_t *current_rule;
 void reader PARAMS ((void));
 
 #endif /* !READER_H_ */
index 7d96db7..6b7f4dd 100644 (file)
@@ -790,7 +790,7 @@ scanner_last_string_free (void)
 static int braces_level = 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));
 
 #define SC_COMMENT 1
@@ -1696,7 +1696,7 @@ YY_OBS_GROW; braces_level++;
 case 82:
 YY_RULE_SETUP
 #line 444 "scan-gram.l"
-{ handle_dollar (yytext); }
+{ handle_dollar (yytext, *yylloc); }
        YY_BREAK
 case 83:
 YY_RULE_SETUP
@@ -2701,7 +2701,7 @@ int main()
 `------------------------------------------------------------------*/
 
 static void
-handle_dollar (char *cp)
+handle_dollar (char *cp, location_t location)
 {
   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
      rule actions.  */
   int rule_length = 0;
-  symbol_list *rhs;
+  symbol_list_t *rhs;
   for (rhs = current_rule->next; rhs; rhs = rhs->next)
     ++rule_length;
 
@@ -2729,10 +2729,10 @@ handle_dollar (char *cp)
   if (*cp == '$')
     {
       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)
-       complain (_("$$ of `%s' has no declared type"),
-                 current_rule->sym->tag);
+       complain_at (location, _("$$ of `%s' has no declared type"),
+                    current_rule->sym->tag);
       if (!type_name)
        type_name = "";
       obstack_fgrow1 (&string_obstack,
@@ -2743,13 +2743,14 @@ handle_dollar (char *cp)
       int n = strtol (cp, &cp, 10);
 
       if (n > rule_length)
-       complain (_("invalid value: %s%d"), "$", n);
+       complain_at (location, _("invalid value: %s%d"), "$", n);
       else
        {
          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)
-           complain (_("$%d of `%s' has no declared type"),
+           complain_at (location, _("$%d of `%s' has no declared type"),
                      n, current_rule->sym->tag);
          if (!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
      rule actions.  */
   int rule_length = 0;
-  symbol_list *rhs;
+  symbol_list_t *rhs;
   for (rhs = current_rule->next; rhs; rhs = rhs->next)
     ++rule_length;
 
index cd8ca51..15d7543 100644 (file)
@@ -80,7 +80,7 @@ scanner_last_string_free (void)
 static int braces_level = 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));
 
 %}
@@ -441,7 +441,7 @@ blanks   [ \t\f]+
 
   "{"                  YY_OBS_GROW; braces_level++;
 
-  "$"("<"[^>]+">")?(-?[0-9]+|"$") { handle_dollar (yytext); }
+  "$"("<"[^>]+">")?(-?[0-9]+|"$") { handle_dollar (yytext, *yylloc); }
   "@"(-?[0-9]+|"$")            { handle_at (yytext); }
 
   [^$@\[\]/\'\"\{\}\n\r]+ YY_OBS_GROW;
@@ -520,7 +520,7 @@ blanks   [ \t\f]+
 `------------------------------------------------------------------*/
 
 static void
-handle_dollar (char *cp)
+handle_dollar (char *cp, location_t location)
 {
   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
      rule actions.  */
   int rule_length = 0;
-  symbol_list *rhs;
+  symbol_list_t *rhs;
   for (rhs = current_rule->next; rhs; rhs = rhs->next)
     ++rule_length;
 
@@ -548,10 +548,10 @@ handle_dollar (char *cp)
   if (*cp == '$')
     {
       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)
-       complain (_("$$ of `%s' has no declared type"),
-                 current_rule->sym->tag);
+       complain_at (location, _("$$ of `%s' has no declared type"),
+                    current_rule->sym->tag);
       if (!type_name)
        type_name = "";
       obstack_fgrow1 (&string_obstack,
@@ -562,13 +562,14 @@ handle_dollar (char *cp)
       int n = strtol (cp, &cp, 10);
 
       if (n > rule_length)
-       complain (_("invalid value: %s%d"), "$", n);
+       complain_at (location, _("invalid value: %s%d"), "$", n);
       else
        {
          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)
-           complain (_("$%d of `%s' has no declared type"),
+           complain_at (location, _("$%d of `%s' has no declared type"),
                      n, current_rule->sym->tag);
          if (!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
      rule actions.  */
   int rule_length = 0;
-  symbol_list *rhs;
+  symbol_list_t *rhs;
   for (rhs = current_rule->next; rhs; rhs = rhs->next)
     ++rule_length;
 
diff --git a/src/symlist.c b/src/symlist.c
new file mode 100644 (file)
index 0000000..4ae5f01
--- /dev/null
@@ -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;
+}
diff --git a/src/symlist.h b/src/symlist.h
new file mode 100644 (file)
index 0000000..b41540b
--- /dev/null
@@ -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_ */
index 548032d..8c952aa 100644 (file)
@@ -57,7 +57,7 @@ exp: { $$ = $1 ; };
 ]])
 
 AT_CHECK([bison input.y], [1], [],
-[[input.y:2: invalid value: $1
+[[input.y:2.6-14: invalid value: $1
 ]])
 
 AT_CLEANUP