]> git.saurik.com Git - bison.git/blobdiff - src/scan-gram.l
Prototype support of %lex-param and %parse-param.
[bison.git] / src / scan-gram.l
index ef3976af3903f966c9396ce4e74db52b1344b41a..235272f1f90addccca08d84365d8f7dab039ec72 100644 (file)
@@ -79,6 +79,14 @@ scanner_last_string_free (void)
 static int braces_level = 0;
 static int percent_percent_count = 0;
 
+/* Within well-formed rules, 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.
+
+   Outside of well-formed rules, RULE_LENGTH has an undefined value.  */
+static int rule_length;
+
 static void handle_dollar PARAMS ((braced_code_t code_kind,
                                   char *cp, location_t location));
 static void handle_at PARAMS ((braced_code_t code_kind,
@@ -99,18 +107,7 @@ blanks   [ \t\f]+
 %{
   /* At each yylex invocation, mark the current position as the
      start of the next token.  */
-#define TR_POS 0
-#if TR_POS
-  fprintf (stderr, "FOO1: %p: ", yylloc);
-  LOCATION_PRINT (stderr, *yylloc);
-  fprintf (stderr, "\n");
-#endif
   YY_STEP;
-#if TR_POS
-  fprintf (stderr, "BAR1: ");
-  LOCATION_PRINT (stderr, *yylloc);
-  fprintf (stderr, "\n");
-#endif
 %}
 
 
@@ -129,7 +126,7 @@ blanks   [ \t\f]+
   "%expect"               return PERCENT_EXPECT;
   "%file-prefix"          return PERCENT_FILE_PREFIX;
   "%fixed"[-_]"output"[-_]"files"   return PERCENT_YACC;
-  "%glr"[-_]"parser"     return PERCENT_GLR_PARSER;
+  "%glr-parser"           return PERCENT_GLR_PARSER;
   "%left"                 return PERCENT_LEFT;
   "%locations"            return PERCENT_LOCATIONS;
   "%merge"               return PERCENT_MERGE;
@@ -138,10 +135,12 @@ blanks   [ \t\f]+
   "%nonassoc"             return PERCENT_NONASSOC;
   "%nterm"                return PERCENT_NTERM;
   "%output"               return PERCENT_OUTPUT;
-  "%prec"                 return PERCENT_PREC;
+  "%parse-param"          return PERCENT_PARSE_PARAM;
+  "%prec"                 { rule_length--; return PERCENT_PREC; }
   "%printer"              return PERCENT_PRINTER;
   "%pure"[-_]"parser"     return PERCENT_PURE_PARSER;
   "%right"                return PERCENT_RIGHT;
+  "%lex-param"            return PERCENT_LEX_PARAM;
   "%skeleton"             return PERCENT_SKELETON;
   "%start"                return PERCENT_START;
   "%term"                 return PERCENT_TOKEN;
@@ -153,14 +152,16 @@ blanks   [ \t\f]+
   "%yacc"                 return PERCENT_YACC;
 
   "="                     return EQUAL;
-  ":"                     return COLON;
-  "|"                     return PIPE;
+  ":"                     { rule_length = 0; return COLON; }
+  "|"                     { rule_length = 0; return PIPE; }
+  ","                     return COMMA;
   ";"                     return SEMICOLON;
 
   {eols}      YY_LINES; YY_STEP;
   {blanks}    YY_STEP;
   {id}        {
     yylval->symbol = symbol_get (yytext, *yylloc);
+    rule_length++;
     return ID;
   }
 
@@ -262,6 +263,7 @@ blanks   [ \t\f]+
     YY_OBS_FINISH;
     yylval->string = last_string;
     yy_pop_state ();
+    rule_length++;
     return STRING;
   }
 
@@ -298,6 +300,7 @@ blanks   [ \t\f]+
                                    (unsigned char) last_string[1], *yylloc);
       YY_OBS_FREE;
       yy_pop_state ();
+      rule_length++;
       return ID;
     }
   }
@@ -347,7 +350,7 @@ blanks   [ \t\f]+
   \\r  obstack_1grow (&string_obstack, '\r');
   \\t  obstack_1grow (&string_obstack, '\t');
   \\v  obstack_1grow (&string_obstack, '\v');
-  \\[\\""]   obstack_1grow (&string_obstack, yytext[1]);
+  \\[\\""'']   obstack_1grow (&string_obstack, yytext[1]);
   \\(.|\n)     {
     LOCATION_PRINT (stderr, *yylloc);
     fprintf (stderr, _(": unrecognized escape: %s\n"), quote (yytext));
@@ -451,6 +454,7 @@ blanks   [ \t\f]+
        yy_pop_state ();
        YY_OBS_FINISH;
        yylval->string = last_string;
+       rule_length++;
        return BRACED_CODE;
       }
   }
@@ -566,11 +570,6 @@ handle_action_dollar (char *text, location_t location)
     }
   else if (('0' <= *cp && *cp <= '9') || *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 (cp, &cp, 10);
 
       if (n > rule_length)
@@ -653,11 +652,6 @@ handle_action_at (char *text, location_t location)
     }
   else if (('0' <= *cp && *cp <= '9') || *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 (cp, &cp, 10);
 
       if (n > rule_length)