]> git.saurik.com Git - bison.git/blobdiff - src/scan-gram.l
* src/reader.h, src/reader.c (symbol_list, symbol_list_new)
[bison.git] / src / scan-gram.l
index 4cc1b060f6b74c72d1e06dbcdfaa614a28bd18f6..15d75433af51c53c7165f3d1209690316f409654 100644 (file)
 #include "reader.h"
 
 /* Each time we match a string, move the end cursor to its end. */
+#define YY_USER_INIT                           \
+do {                                           \
+  LOCATION_RESET (*yylloc);                    \
+   /* This is only to avoid GCC warnings. */   \
+  if (yycontrol) {;};                          \
+} while (0)
+
 #define YY_USER_ACTION  LOCATION_COLUMNS (*yylloc, yyleng)
 #define YY_LINES        LOCATION_LINES (*yylloc, yyleng); lineno += yyleng;
 #define YY_STEP         LOCATION_STEP (*yylloc)
@@ -69,14 +76,11 @@ scanner_last_string_free (void)
 }
 
 
-/* This is only to avoid GCC warnings. */
-#define YY_USER_INIT    if (yycontrol) {;};
-
 
 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));
 
 %}
@@ -96,7 +100,7 @@ blanks   [ \t\f]+
      start of the next token.  */
 #define TR_POS 0
 #if TR_POS
-  fprintf (stderr, "FOO1: ");
+  fprintf (stderr, "FOO1: %p: ", yylloc);
   LOCATION_PRINT (stderr, *yylloc);
   fprintf (stderr, "\n");
 #endif
@@ -150,7 +154,7 @@ blanks   [ \t\f]+
   {eols}      YY_LINES; YY_STEP;
   {blanks}    YY_STEP;
   {id}        {
-    yylval->symbol = getsym (yytext);
+    yylval->symbol = getsym (yytext, *yylloc);
     return ID;
   }
 
@@ -282,7 +286,7 @@ blanks   [ \t\f]+
     assert (yy_top_state () == INITIAL);
     {
       YY_OBS_FINISH;
-      yylval->symbol = getsym (last_string);
+      yylval->symbol = getsym (last_string, *yylloc);
       symbol_class_set (yylval->symbol, token_sym);
       symbol_user_token_number_set (yylval->symbol, last_string[1]);
       YY_OBS_FREE;
@@ -437,10 +441,10 @@ 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;
+  [^$@\[\]/\'\"\{\}\n\r]+ YY_OBS_GROW;
   {eols}       YY_OBS_GROW; YY_LINES;
 
   /* A lose $, or /, or etc. */
@@ -471,7 +475,7 @@ blanks   [ \t\f]+
     return PROLOGUE;
   }
 
-  [^\[\]%\n\r]+          YY_OBS_GROW;
+  [^%\[\]/\'\"\n\r]+     YY_OBS_GROW;
   "%"+[^%\}\n\r]+ YY_OBS_GROW;
   {eols}         YY_OBS_GROW; YY_LINES;
 
@@ -516,7 +520,7 @@ blanks   [ \t\f]+
 `------------------------------------------------------------------*/
 
 static void
-handle_dollar (char *cp)
+handle_dollar (char *cp, location_t location)
 {
   const char *type_name = NULL;
 
@@ -525,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;
 
@@ -544,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,
@@ -558,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 = "";
@@ -594,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;