]> git.saurik.com Git - bison.git/blobdiff - src/scan-skel.l
Add Makevars.template, stamp-po.
[bison.git] / src / scan-skel.l
index aa71ac8c865bd563e50b001c07cb691655438f55..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 "quotearg.h"
-#include "error.h"
+
+#include <error.h>
+#include <quotearg.h>
+
 #include "getargs.h"
 #include "files.h"
 
 int skel_lex (void);
 
 #include "getargs.h"
 #include "files.h"
 
 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", quotearg_style (escape_quoting_style, 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;
 %%
 
 /*------------------------.
 %%
 
 /*------------------------.
@@ -66,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);
 }