]> git.saurik.com Git - bison.git/blobdiff - src/scan-skel.l
Akim Demaille <akim@epita.fr>
[bison.git] / src / scan-skel.l
index 9a01ffefe37d4b870d1c2cd81dfbb8d404346490..4f34a6c67716aacb303736269c61c52186917ed9 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.
 
 
    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
+%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;
+#include "scan-skel.h"
+
+#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;
-   }
-
-"__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 *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;
+}
+
+"@@"      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;
+}
 %%
 %%
+
+/*------------------------.
+| 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);
+}