]> git.saurik.com Git - bison.git/blobdiff - src/scan-gram.l
* src/symtab.h, src/symtab.c (symbol_t): printer and
[bison.git] / src / scan-gram.l
index 5a1ce57b7949c9359342bbb2d26e0ec35edacf35..d1299c5b888274e50828011eac9193f752970ceb 100644 (file)
@@ -136,6 +136,7 @@ blanks   [ \t\f]+
   "%nterm"                return PERCENT_NTERM;
   "%output"               return PERCENT_OUTPUT;
   "%prec"                 return PERCENT_PREC;
+  "%printer"              return PERCENT_PRINTER;
   "%pure"[-_]"parser"     return PERCENT_PURE_PARSER;
   "%right"                return PERCENT_RIGHT;
   "%skeleton"             return PERCENT_SKELETON;
@@ -324,7 +325,7 @@ blanks   [ \t\f]+
     if (c > 255)
       {
        LOCATION_PRINT (stderr, *yylloc);
-       fprintf (stderr, ": invalid escape: %s\n", yytext);
+       fprintf (stderr, ": invalid escape: %s\n", quote (yytext));
        YY_STEP;
       }
     else
@@ -343,11 +344,13 @@ blanks   [ \t\f]+
   \\t  obstack_1grow (&string_obstack, '\t');
   \\v  obstack_1grow (&string_obstack, '\v');
   \\[\\""]   obstack_1grow (&string_obstack, yytext[1]);
-  \\.  {
+  \\(.|\n)     {
     LOCATION_PRINT (stderr, *yylloc);
-    fprintf (stderr, ": unrecognized escape: %s\n", yytext);
+    fprintf (stderr, ": unrecognized escape: %s\n", quote (yytext));
     YY_OBS_GROW;
   }
+  /* FLex wants this rule, in case of a `\<<EOF>>'. */
+  \\                   YY_OBS_GROW;
 }
 
 
@@ -364,8 +367,10 @@ blanks   [ \t\f]+
     yy_pop_state ();
   }
 
-  [^\[\]\'\n\r\\]      YY_OBS_GROW;
-  \\.                  YY_OBS_GROW;
+  [^\[\]\'\n\r\\]+     YY_OBS_GROW;
+  \\(.|\n)             YY_OBS_GROW;
+  /* FLex wants this rule, in case of a `\<<EOF>>'. */
+  \\                   YY_OBS_GROW;
 
   {eols}               YY_OBS_GROW; YY_LINES;
 
@@ -392,7 +397,9 @@ blanks   [ \t\f]+
   }
 
   [^\[\]\"\n\r\\]+      YY_OBS_GROW;
-  \\.                   YY_OBS_GROW;
+  \\(.|\n)              YY_OBS_GROW;
+  /* FLex wants this rule, in case of a `\<<EOF>>'. */
+  \\                   YY_OBS_GROW;
 
   {eols}                YY_OBS_GROW; YY_LINES;
 
@@ -420,6 +427,9 @@ blanks   [ \t\f]+
   /* Comments. */
   "/*"        YY_OBS_GROW; yy_push_state (SC_COMMENT);
   "//".*      YY_OBS_GROW;
+
+  /* Not comments. */
+  "/"         YY_OBS_GROW;
 }
 
 
@@ -479,9 +489,9 @@ blanks   [ \t\f]+
     return PROLOGUE;
   }
 
-  [^%\[\]/\'\"\n\r]+     YY_OBS_GROW;
-  "%"+[^%\}\n\r]+ YY_OBS_GROW;
-  {eols}         YY_OBS_GROW; YY_LINES;
+  [^%\[\]/\'\"\n\r]+ YY_OBS_GROW;
+  "%"                YY_OBS_GROW;
+  {eols}            YY_OBS_GROW; YY_LINES;
 
   <<EOF>> {
     LOCATION_PRINT (stderr, *yylloc);
@@ -491,7 +501,6 @@ blanks   [ \t\f]+
     yylval->string = last_string;
     return PROLOGUE;
   }
-
 }
 
 
@@ -516,7 +525,7 @@ blanks   [ \t\f]+
 %%
 
 /*------------------------------------------------------------------.
-| CP is pointing to a wannabee semantic value (i.e., a `$').        |
+| TEXT is pointing to a wannabee semantic value (i.e., a `$').      |
 |                                                                   |
 | Possible inputs: $[<TYPENAME>]($|integer)                         |
 |                                                                   |
@@ -524,11 +533,10 @@ blanks   [ \t\f]+
 `------------------------------------------------------------------*/
 
 static inline void
-handle_action_dollar (char *cp, location_t location)
+handle_action_dollar (char *text, location_t location)
 {
   const char *type_name = NULL;
-
-  ++cp;
+  char *cp = text + 1;
 
   /* Get the type name if explicit. */
   if (*cp == '<')
@@ -546,7 +554,7 @@ handle_action_dollar (char *cp, location_t location)
        type_name = symbol_list_n_type_name_get (current_rule, location, 0);
       if (!type_name && typed)
        complain_at (location, _("$$ of `%s' has no declared type"),
-                    current_rule->sym->tag);
+                    symbol_tag_get (current_rule->sym));
       if (!type_name)
        type_name = "";
       obstack_fgrow1 (&string_obstack,
@@ -570,7 +578,7 @@ handle_action_dollar (char *cp, location_t location)
                                                     n);
          if (!type_name && typed)
            complain_at (location, _("$%d of `%s' has no declared type"),
-                     n, current_rule->sym->tag);
+                     n, symbol_tag_get (current_rule->sym));
          if (!type_name)
            type_name = "";
          obstack_fgrow3 (&string_obstack,
@@ -580,31 +588,24 @@ handle_action_dollar (char *cp, location_t location)
     }
   else
     {
-      char buf[] = "$c";
-      buf[1] = *cp;
-      complain_at (location, _("%s is invalid"), quote (buf));
+      complain_at (location, _("%s is invalid"), quote (text));
     }
 }
 
 
-/*---------------------------------------.
-| CP is pointing to $$ in a destructor.  |
-`---------------------------------------*/
+/*---------------------------------------------------------------.
+| TEXT is expexted tp be $$ in some code associated to a symbol: |
+| destructor or printer.                                         |
+`---------------------------------------------------------------*/
 
 static inline void
-handle_destructor_dollar (char *cp, location_t location)
+handle_symbol_code_dollar (char *text, location_t location)
 {
-  ++cp;
+  char *cp = text + 1;
   if (*cp == '$')
-    {
-      obstack_sgrow (&string_obstack, "]b4_dollar_dollar[");
-    }
+    obstack_sgrow (&string_obstack, "]b4_dollar_dollar[");
   else
-    {
-      char buf[] = "$c";
-      buf[1] = *cp;
-      complain_at (location, _("%s is invalid"), quote (buf));
-    }
+    complain_at (location, _("%s is invalid"), quote (text));
 }
 
 
@@ -624,7 +625,8 @@ handle_dollar (braced_code_t braced_code_kind,
       break;
 
     case destructor_braced_code:
-      handle_destructor_dollar (text, location);
+    case printer_braced_code:
+      handle_symbol_code_dollar (text, location);
       break;
     }
 }
@@ -638,21 +640,21 @@ handle_dollar (braced_code_t braced_code_kind,
 static inline void
 handle_action_at (char *text, location_t location)
 {
+  char *cp = text + 1;
   locations_flag = 1;
-  ++text;
 
-  if (*text == '$')
+  if (*cp == '$')
     {
       obstack_sgrow (&string_obstack, "]b4_lhs_location[");
     }
-  else if (isdigit (*text) || *text == '-')
+  else if (isdigit (*cp) || *cp == '-')
     {
       /* RULE_LENGTH is the number of values in the current rule so
         far, which says where to find `$0' with respect to the top of
         the stack.  It is not the same as the rule->length in the
         case of mid rule actions.  */
       int rule_length = symbol_list_length (current_rule->next);
-      int n = strtol (text, &text, 10);
+      int n = strtol (cp, &cp, 10);
 
       if (n > rule_length)
        complain_at (location, _("invalid value: %s%d"), "@", n);
@@ -662,31 +664,24 @@ handle_action_at (char *text, location_t location)
     }
   else
     {
-      char buf[] = "@c";
-      buf[1] = *text;
-      complain_at (location, _("%s is invalid"), quote (buf));
+      complain_at (location, _("%s is invalid"), quote (text));
     }
 }
 
 
-/*--------------------------------------------.
-| TEXT is expexted tp be @$ in a destructor.  |
-`--------------------------------------------*/
+/*---------------------------------------------------------------.
+| TEXT is expexted tp be @$ in some code associated to a symbol: |
+| destructor or printer.                                         |
+`---------------------------------------------------------------*/
 
 static inline void
-handle_destructor_at (char *text, location_t location)
+handle_symbol_code_at (char *text, location_t location)
 {
-  ++text;
-  if (*text == '$')
-    {
-      obstack_sgrow (&string_obstack, "]b4_at_dollar[");
-    }
+  char *cp = text + 1;
+  if (*cp == '$')
+    obstack_sgrow (&string_obstack, "]b4_at_dollar[");
   else
-    {
-      char buf[] = "$c";
-      buf[1] = *text;
-      complain_at (location, _("%s is invalid"), quote (buf));
-    }
+    complain_at (location, _("%s is invalid"), quote (text));
 }
 
 
@@ -706,7 +701,8 @@ handle_at (braced_code_t braced_code_kind,
       break;
 
     case destructor_braced_code:
-      handle_destructor_at (text, location);
+    case printer_braced_code:
+      handle_symbol_code_at (text, location);
       break;
     }
 }