]> git.saurik.com Git - bison.git/blobdiff - src/scan-skel.l
* data/glr.c (YYRHSLOC): Move its definition next to its uses.
[bison.git] / src / scan-skel.l
index 0bb71d196f33fcbbdfc56495244ebe83ed975835..47b696da1aa5730b2675042af606d3f63eddcfef 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 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 debug
+%option prefix="skel_" outfile="lex.yy.c"
+
 %{
 #include "system.h"
 %{
 #include "system.h"
-#include "skeleton.h"
-#include "parse-skel.h"
-%}
-
-%option nounput
-%option noyywrap
-/* If we enable
 
 
-   %option yylineno
+#include <error.h>
+#include <quotearg.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???  */
+#include "getargs.h"
+#include "files.h"
 
 
-%%
+int skel_lex (void);
 
 
-"%%{line}"          { return LINE; }
-"%%{skeleton-line}" { return SLINE; }
+#define QPUTS(String) \
+   fputs (quotearg_style (c_quoting_style, (String)), yyout)
 
 
-"%%{yacc}"    { return YACC; }
-"%%{section}" { return SECTION; }
+%}
+%%
 
 
-"%%{guards}"   { return GUARDS; }
-"%%{actions}"  { return ACTIONS; }
-"%%{tokendef}" { return TOKENS; }
+%{
+  int lineno IF_LINT (= 0);
+  char *outname = NULL;
+%}
 
 
-  /* Muscle.  */
-"%%{"[a-zA-Z][0-9a-zA-Z_-]+"}" {
-  yylval.muscle = xstrndup (yytext + 3, yyleng - 4);
-  return MUSCLE;
+"@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);
+    }
+
+  XFREE (outname);
+  outname = xstrdup (filename);
+  xfclose (yyout);
+  yyout = xfopen (outname, "w");
+  lineno = 1;
 }
 
 }
 
-  /* String.  */
-"%%\"".*"\"" {
-  yylval.string = xstrndup (yytext + 3, yyleng - 4);
-  return STRING;
-}
+"@@"      fputc ('@', yyout);
+"@{"      fputc ('[', yyout);
+"@}"      fputc (']', yyout);
 
 
-  /* End of line.  */
-"\n" {
-  return '\n';
-}
+"@oline@"  fprintf (yyout, "%d", lineno + 1);
+"@ofile@"  QPUTS (outname);
+"@output_parser_name@" QPUTS (parser_file_name);
+"@output_header_name@"  QPUTS (spec_defines_file);
 
 
-  /* Plain Character.  */
-. {
-  yylval.character = *yytext;
-  return CHARACTER;
-}
+  /* This pattern must not match more than the previous @ patterns. */
+@[^{}@\n]* fatal ("invalid @ in skeleton: %s", yytext);
+\n        lineno++; ECHO;
+[^@\n]+           ECHO;
 
 
+<<EOF>>           xfclose (yyout); free (outname); 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);
+}