]> 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 924f4ab922a324f3aa1ac0b6fe821a982cec6188..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 debug nodefault noyywrap nounput
+%option nodefault noyywrap nounput never-interactive debug
 %option prefix="skel_" outfile="lex.yy.c"
 
 %option prefix="skel_" outfile="lex.yy.c"
 
-/* If we enable
+%{
+#include "system.h"
 
 
-   %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"
 
 
-%{
-#include "system.h"
-#include "skeleton.h"
-#include "parse-skel.h"
-%}
+int skel_lex (void);
+
+#define QPUTS(String) \
+   fputs (quotearg_style (c_quoting_style, (String)), yyout)
 
 
-%{
-/* Each time we match a string, move the end cursor to its end. */
-#define YY_USER_ACTION  yylloc->last_column += yyleng;
 %}
 %%
 %}
 %%
+
 %{
 %{
-  /* At each yylex invocation, mark the current position as the
-     start of the next token.  */
-  LOCATION_STEP (*yylloc);
+  int lineno IF_LINT (= 0);
+  char *outname = NULL;
 %}
 
 %}
 
-"%%{line}"          { return LINE; }
-"%%{skeleton-line}" { return SLINE; }
-
-"%%{section}" { return SECTION; }
+"@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;
+}
 
 
-"%%{guards}"   { return GUARDS; }
-"%%{actions}"  { return ACTIONS; }
-"%%{tokendef}" { return TOKENS; }
+"@@"      fputc ('@', yyout);
+"@{"      fputc ('[', yyout);
+"@}"      fputc (']', yyout);
 
 
-  /* Muscle.  */
-"%%{"[a-zA-Z][0-9a-zA-Z_-]+"}" {
-  yylval->string = xstrndup (yytext + 3, yyleng - 4);
-  return MUSCLE;
-}
+"@oline@"  fprintf (yyout, "%d", lineno + 1);
+"@ofile@"  QPUTS (outname);
+"@output_parser_name@" QPUTS (parser_file_name);
+"@output_header_name@"  QPUTS (spec_defines_file);
 
 
-  /* String.  */
-"%%\"".*"\"" {
-  yylval->string = xstrndup (yytext + 3, yyleng - 4);
-  return STRING;
-}
+"@"       abort ();
+\n        lineno++; ECHO;
+[^@\n]+           ECHO;
 
 
-  /* End of line.  */
-"\n" {
-  LOCATION_LINES (*yylloc, yyleng);
-  return '\n';
-}
+<<EOF>>           xfclose (yyout); free (outname); return EOF;
+%%
 
 
-  /* White spaces.  */
-[\t ]+ {
-  yylval->string = yytext;
-  return BLANKS;
-}
+/*------------------------.
+| Scan a Bison skeleton.  |
+`------------------------*/
 
 
-  /* Plain Characters.  */
-[^%\n]+ {
-  yylval->string = yytext;
-  return RAW;
-}
+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);
 }
 }
-
-%%