]> 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 71577d7e6aa3281f0655d82989e7bb319dce771f..af5226c9dd5b1d552e277a5aea1f2ab0f96c5892 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 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"
 
 
-%}
+#include <error.h>
+#include <quotearg.h>
 
 
-%option nounput
-%option noyywrap
-/* If we enable
+#include "getargs.h"
+#include "files.h"
 
 
-   %option yylineno
+int skel_lex (void);
 
 
-   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???  */
+#define QPUTS(String) \
+   fputs (quotearg_style (c_quoting_style, (String)), yyout)
 
 
+%}
 %%
 
 %%
 
-"%%{line}"          { return LINE; }
-"%%{skeleton-line}" { return SLINE; }
+%{
+  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;
+}
 
 
-"%%{yacc}"    { return YACC; }
-"%%{section}" { return SECTION; }
+"@@"      fputc ('@', yyout);
+"@{"      fputc ('[', yyout);
+"@}"      fputc (']', yyout);
 
 
-"%%{guards}"   { return GUARDS; }
-"%%{actions}"  { return ACTIONS; }
-"%%{tokendef}" { return TOKENS; }
+"@oline@"  fprintf (yyout, "%d", lineno + 1);
+"@ofile@"  QPUTS (outname);
+"@output_parser_name@" QPUTS (parser_file_name);
+"@output_header_name@"  QPUTS (spec_defines_file);
 
 
-"%%{"[a-zA-Z][0-9a-zA-Z_-]+"}" { /* Muscle.  */
-  size_t len = strlen (yytext);
-  yylval.string = (char*) malloc (len - 3);
-  strncpy (yylval.string, yytext + 3, len - 4);
-  yylval.string[len - 4] = 0;
-  return MUSCLE;
-}
+"@"       abort ();
+\n        lineno++; ECHO;
+[^@\n]+           ECHO;
 
 
-"%%\"".*"\"" { /* String.  */
-  size_t len = strlen (yytext);
-  yylval.string = (char*) malloc (len - 3);
-  strncpy (yylval.string, yytext + 3, len - 4);
-  yylval.string[len - 4] = 0;
-  return STRING;
-}
+<<EOF>>           xfclose (yyout); free (outname); return EOF;
+%%
 
 
-<<EOF>> { /* End of file.  */
-  return 0;
-}
+/*------------------------.
+| Scan a Bison skeleton.  |
+`------------------------*/
 
 
-"\n" { /* End of line.  */
-  return '\n';
-}
+void scan_skel (FILE *);
 
 
-. { /* Character.  */
-  yylval.character = *yytext;
-  return CHARACTER;
+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);
 }
 }
-
-%%