]> git.saurik.com Git - bison.git/blobdiff - src/scan-skel.l
* data/yacc.c: (b4_lex_param): Corrected for the case where
[bison.git] / src / scan-skel.l
index e56d37230c26ff6b9b8460e170b6888ce8a23d35..af5226c9dd5b1d552e277a5aea1f2ab0f96c5892 100644 (file)
@@ -1,5 +1,6 @@
 /* Scan Bison Skeletons.                                       -*- C -*-
 /* Scan Bison Skeletons.                                       -*- C -*-
-   Copyright (C) 2001, 2002  Free Software Foundation, Inc.
+
+   Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 
    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 
-%option nodefault noyywrap nounput never-interactive
+%option nodefault noyywrap nounput never-interactive debug
 %option prefix="skel_" outfile="lex.yy.c"
 
 %{
 #include "system.h"
 %option prefix="skel_" outfile="lex.yy.c"
 
 %{
 #include "system.h"
-#include "error.h"
+
+#include <error.h>
+#include <quotearg.h>
+
 #include "getargs.h"
 #include "files.h"
 #include "getargs.h"
 #include "files.h"
+
 int skel_lex (void);
 int skel_lex (void);
-static int yylineno = 1;
-static char *yyoutname = NULL;
+
+#define QPUTS(String) \
+   fputs (quotearg_style (c_quoting_style, (String)), yyout)
+
 %}
 %%
 %}
 %%
-  /* This is an approximation, but we don't need more. */
-^"#output \""[^\"]+\"\n        {
-     yytext[yyleng - 2] = '\0';
-     XFREE (yyoutname);
-     yyoutname = xstrdup (yytext + strlen ("#output \""));
-     yyout = xfopen (yyoutname, "w");
-     yylineno = 1;
-   }
-
-"@<:@"           fputc ('[', yyout);
-"@:>@"           fputc (']', yyout);
-
-"__oline__"      fprintf (yyout, "%d", yylineno+1);
-"__ofile__"      fprintf (yyout, "%s", yyoutname);
-[^@_\n]+         ECHO;
-\n+              yylineno += yyleng; ECHO;
-.                ECHO;
-
-<<EOF>>          xfclose (yyout); free (yyoutname); return EOF;
+
+%{
+  int lineno IF_LINT (= 0);
+  char *outname = NULL;
+%}
+
+"@output ".*\n {
+  char const *filename = yytext + sizeof "@output " - 1;
+  yytext[yyleng - 1] = '\0';
+
+  if (*filename == '@')
+    {
+      if (strcmp (filename, "@output_header_name@") == 0)
+       filename = spec_defines_file;
+      else if (strcmp (filename, "@output_parser_name@") == 0)
+       filename = parser_file_name;
+      else
+       abort ();
+    }
+
+  XFREE (outname);
+  outname = xstrdup (filename);
+  xfclose (yyout);
+  yyout = xfopen (outname, "w");
+  lineno = 1;
+}
+
+"@@"      fputc ('@', yyout);
+"@{"      fputc ('[', yyout);
+"@}"      fputc (']', yyout);
+
+"@oline@"  fprintf (yyout, "%d", lineno + 1);
+"@ofile@"  QPUTS (outname);
+"@output_parser_name@" QPUTS (parser_file_name);
+"@output_header_name@"  QPUTS (spec_defines_file);
+
+"@"       abort ();
+\n        lineno++; ECHO;
+[^@\n]+           ECHO;
+
+<<EOF>>           xfclose (yyout); free (outname); return EOF;
 %%
 
 /*------------------------.
 %%
 
 /*------------------------.
@@ -62,8 +91,8 @@ void
 scan_skel (FILE *in)
 {
   skel_in = in;
 scan_skel (FILE *in)
 {
   skel_in = in;
+  skel__flex_debug = trace_flag & trace_skeleton;
   skel_lex ();
   skel_lex ();
-
   /* Reclaim Flex's buffers.  */
   yy_delete_buffer (YY_CURRENT_BUFFER);
 }
   /* Reclaim Flex's buffers.  */
   yy_delete_buffer (YY_CURRENT_BUFFER);
 }