]> git.saurik.com Git - bison.git/blobdiff - src/scan-skel.l
* NEWS: Bison-generated C parsers no longer quote literal strings
[bison.git] / src / scan-skel.l
index e7eeaa568ee24a142ef237df84dee97889075748..7ac27c6ebd335fe1c0ad057b444d2ca548777826 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, 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.
 
    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
+%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 <quotearg.h>
+
+#include "complain.h"
+#include "getargs.h"
 #include "files.h"
 #include "files.h"
-int skel_lex PARAMS ((void));
-static int yylineno = 1;
-static char *yyoutname = NULL;
+
+int skel_lex (void);
+
+#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);
-"__ofile__"      fprintf (yyout, "%s", yyoutname);
-[^@_\n]+         ECHO;
-\n+              yylineno += yyleng; ECHO;
-.                ECHO;
 
 
+%{
+  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
+       fatal ("invalid token in skeleton: %s", yytext);
+    }
+
+  if (outname)
+    {
+      free (outname);
+      xfclose (yyout);
+    }
+  outname = xstrdup (filename);
+  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);
+
+  /* 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;
+}
 %%
 %%
+
+/*------------------------.
+| Scan a Bison skeleton.  |
+`------------------------*/
+
+void scan_skel (FILE *);
+
+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);
+}