]> git.saurik.com Git - bison.git/blobdiff - src/scan-skel.l
Work around portability problems with Visual Age C compiler
[bison.git] / src / scan-skel.l
index 71577d7e6aa3281f0655d82989e7bb319dce771f..06370fa6dedca1012806dd4ef4257a9d71412c53 100644 (file)
@@ -1,6 +1,6 @@
-                                                             /* -*- C -*- */
-/* Scan Bison Skeletons.
-   Copyright (C) 2001  Free Software Foundation, Inc.
+/* Scan Bison Skeletons.                                       -*- C -*-
+
+   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    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
 
    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.  */
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.  */
+
+%option nodefault noyywrap nounput never-interactive debug
+%option prefix="skel_" outfile="lex.yy.c"
 
 %{
 
 %{
+/* Work around a bug in flex 2.5.31.  See Debian bug 333231
+   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+#undef skel_wrap
+#define skel_wrap() 1
 
 #include "system.h"
 
 #include "system.h"
-#include "skeleton.h"
-#include "parse-skel.h"
-
-%}
 
 
-%option nounput
-%option noyywrap
-/* If we enable
+#include <error.h>
+#include <quotearg.h>
 
 
-   %option yylineno
+#include "complain.h"
+#include "getargs.h"
+#include "files.h"
+#include "scan-skel.h"
 
 
-   Then we have warning: `yy_flex_realloc' defined but not used.
-   Seems like a Flex bug to me: Why the heck yylineno would trigger
-   the REJECT exception???  */
+#define QPUTS(String) \
+   fputs (quotearg_style (c_quoting_style, (String)), yyout)
 
 
+%}
 %%
 
 %%
 
-"%%{line}"          { return LINE; }
-"%%{skeleton-line}" { return SLINE; }
-
-"%%{yacc}"    { return YACC; }
-"%%{section}" { return SECTION; }
-
-"%%{guards}"   { return GUARDS; }
-"%%{actions}"  { return ACTIONS; }
-"%%{tokendef}" { return TOKENS; }
-
-"%%{"[a-zA-Z][0-9a-zA-Z_-]+"}" { /* Muscle.  */
-  size_t len = strlen (yytext);
-  yylval.string = (char*) malloc (len - 3);
-  strncpy (yylval.string, yytext + 3, len - 4);
-  yylval.string[len - 4] = 0;
-  return MUSCLE;
-}
-
-"%%\"".*"\"" { /* String.  */
-  size_t len = strlen (yytext);
-  yylval.string = (char*) malloc (len - 3);
-  strncpy (yylval.string, yytext + 3, len - 4);
-  yylval.string[len - 4] = 0;
-  return STRING;
-}
+%{
+  int lineno IF_LINT (= 0);
+  char *outname = NULL;
+%}
 
 
-<<EOF>> { /* End of file.  */
-  return 0;
+"@output ".*\n {
+  char const *file_name = yytext + sizeof "@output " - 1;
+  yytext[yyleng - 1] = '\0';
+
+  if (*file_name == '@')
+    {
+      if (strcmp (file_name, "@output_header_name@") == 0)
+       file_name = spec_defines_file;
+      else if (strcmp (file_name, "@output_parser_name@") == 0)
+       file_name = parser_file_name;
+      else
+       fatal ("invalid token in skeleton: %s", yytext);
+    }
+
+  if (outname)
+    {
+      free (outname);
+      xfclose (yyout);
+    }
+  outname = xstrdup (file_name);
+  yyout = xfopen (outname, "w");
+  lineno = 1;
 }
 
 }
 
-"\n" { /* End of line.  */
-  return '\n';
+"@@"      fputc ('@', yyout);
+"@{"      fputc ('[', yyout);
+"@}"      fputc (']', yyout);
+
+"@oline@"  fprintf (yyout, "%d", lineno + 1);
+"@ofile@"  QPUTS (outname);
+"@dir_prefix@" QPUTS (dir_prefix);
+"@output_parser_name@" QPUTS (parser_file_name);
+"@output_header_name@" QPUTS (spec_defines_file);
+
+  /* This pattern must not match more than the previous @ patterns. */
+@[^{}@\n]* fatal ("invalid @ in skeleton: %s", yytext);
+\n        lineno++; ECHO;
+[^@\n]+           ECHO;
+
+<<EOF>> {
+  if (outname)
+    {
+      free (outname);
+      xfclose (yyout);
+    }
+  return EOF;
 }
 }
+%%
 
 
-. { /* Character.  */
-  yylval.character = *yytext;
-  return CHARACTER;
+/*------------------------.
+| Scan a Bison skeleton.  |
+`------------------------*/
+
+void
+scan_skel (FILE *in)
+{
+  skel_in = in;
+  skel__flex_debug = trace_flag & trace_skeleton;
+  skel_lex ();
+  /* Reclaim Flex's buffers.  */
+  yy_delete_buffer (YY_CURRENT_BUFFER);
 }
 }
-
-%%