]> git.saurik.com Git - bison.git/blobdiff - src/scan-code.l
Finer input type for yytranslate.
[bison.git] / src / scan-code.l
index 2a718f2c8406dfaac2a5abdaeaf21fba34370c2b..13a78c27fb00c8a00dff6d11f5e315d8016b4fce 100644 (file)
@@ -1,12 +1,12 @@
 /* Bison Action Scanner                             -*- C -*-
 
 /* Bison Action Scanner                             -*- C -*-
 
-   Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
-   This program is free software; you can redistribute it and/or modify
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301  USA
-*/
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 %option debug nodefault nounput noyywrap never-interactive
 %option prefix="code_" outfile="lex.yy.c"
 
 %option debug nodefault nounput noyywrap never-interactive
 %option prefix="code_" outfile="lex.yy.c"
@@ -173,12 +170,14 @@ splice     (\\[ \f\t\v]*\n)*
 
   "{"  STRING_GROW; ++braces_level;
   "}"  {
 
   "{"  STRING_GROW; ++braces_level;
   "}"  {
-    bool outer_brace = --braces_level < 0;
+    bool outer_brace = --braces_level == 0;
 
     /* As an undocumented Bison extension, append `;' before the last
        brace in braced code, so that the user code can omit trailing
        `;'.  But do not append `;' if emulating Yacc, since Yacc does
 
     /* As an undocumented Bison extension, append `;' before the last
        brace in braced code, so that the user code can omit trailing
        `;'.  But do not append `;' if emulating Yacc, since Yacc does
-       not append one.
+       not append one.  Also, some output languages (like Java) do not
+       accept an extra semicolon, so don't append if the user specified
+       a skeleton or language.
 
        FIXME: Bison should warn if a semicolon seems to be necessary
        here, and should omit the semicolon if it seems unnecessary
 
        FIXME: Bison should warn if a semicolon seems to be necessary
        here, and should omit the semicolon if it seems unnecessary
@@ -189,7 +188,8 @@ splice       (\\[ \f\t\v]*\n)*
        should also diagnose other Bison extensions like %yacc.
        Perhaps there should also be a GCC-style --pedantic-errors
        option, so that such warnings are diagnosed as errors.  */
        should also diagnose other Bison extensions like %yacc.
        Perhaps there should also be a GCC-style --pedantic-errors
        option, so that such warnings are diagnosed as errors.  */
-    if (outer_brace && ! yacc_flag)
+    if (outer_brace && !yacc_flag && language_prio == default_prio
+        && skeleton_prio == default_prio)
       obstack_1grow (&obstack_for_string, ';');
 
     STRING_GROW;
       obstack_1grow (&obstack_for_string, ';');
 
     STRING_GROW;
@@ -202,7 +202,10 @@ splice      (\\[ \f\t\v]*\n)*
     obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar[");
     self->is_value_used = true;
   }
     obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar[");
     self->is_value_used = true;
   }
-  "@$"   obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
+  "@$" {
+    obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
+    locations_flag = true;
+  }
 }
 
 
 }
 
 
@@ -304,7 +307,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
 
       obstack_fgrow1 (&obstack_for_string,
                      "]b4_lhs_value([%s])[", type_name);
 
       obstack_fgrow1 (&obstack_for_string,
                      "]b4_lhs_value([%s])[", type_name);
-      rule->used = true;
+      rule->action_props.is_value_used = true;
     }
   else
     {
     }
   else
     {
@@ -333,7 +336,8 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
                          "]b4_rhs_value(%d, %d, [%s])[",
                          effective_rule_length, n, type_name);
           if (n > 0)
                          "]b4_rhs_value(%d, %d, [%s])[",
                          effective_rule_length, n, type_name);
           if (n > 0)
-            symbol_list_n_get (effective_rule, n)->used = true;
+            symbol_list_n_get (effective_rule, n)->action_props.is_value_used =
+              true;
        }
       else
        complain_at (dollar_loc, _("integer out of range: %s"), quote (text));
        }
       else
        complain_at (dollar_loc, _("integer out of range: %s"), quote (text));
@@ -479,30 +483,3 @@ code_scanner_free (void)
   /* Reclaim Flex's buffers.  */
   yylex_destroy ();
 }
   /* Reclaim Flex's buffers.  */
   yylex_destroy ();
 }
-
-char const *
-translate_rule_action (symbol_list *rule)
-{
-  code_props cp;
-  code_props_rule_action_init (&cp, rule->action, rule->action_location, rule);
-  code_props_translate_code (&cp);
-  return cp.code;
-}
-
-char const *
-translate_symbol_action (char const *a, location l)
-{
-  code_props cp;
-  code_props_symbol_action_init (&cp, a, l);
-  code_props_translate_code (&cp);
-  return cp.code;
-}
-
-char const *
-translate_code (char const *a, location l)
-{
-  code_props cp;
-  code_props_plain_init (&cp, a, l);
-  code_props_translate_code (&cp);
-  return cp.code;
-}