]> 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 fc88b4a1da19ca4880848d15752dd1f1fabdfe47..7ac27c6ebd335fe1c0ad057b444d2ca548777826 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, 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 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
+#include <error.h>
+#include <quotearg.h>
 
 
-   %option yylineno
+#include "complain.h"
+#include "getargs.h"
+#include "files.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???  */
+int skel_lex (void);
 
 
-%%
+#define QPUTS(String) \
+   fputs (quotearg_style (c_quoting_style, (String)), yyout)
 
 
-"%%{line}"          { return LINE; }
-"%%{skeleton-line}" { return SLINE; }
-
-"%%{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);
+    }
+
+  if (outname)
+    {
+      free (outname);
+      xfclose (yyout);
+    }
+  outname = xstrdup (filename);
+  yyout = xfopen (outname, "w");
+  lineno = 1;
 }
 
 }
 
-  /* String.  */
-"%%\"".*"\"" {
-  yylval.string = xstrndup (yytext + 3, yyleng - 4);
-  return STRING;
+"@@"      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;
 }
 }
+%%
 
 
-  /* End of line.  */
-"\n" {
-  return '\n';
-}
+/*------------------------.
+| Scan a Bison skeleton.  |
+`------------------------*/
 
 
-  /* White spaces.  */
-[\t ]+ {
-  yylval.literal = yytext;
-  return BLANKS;
-}
+void scan_skel (FILE *);
 
 
-  /* Plain 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);
 }
 }
-
-%%