]> git.saurik.com Git - bison.git/blobdiff - src/scan-skel.l
* configure.ac (AC_GNU_SOURCE): Use it instead of hand written code.
[bison.git] / src / scan-skel.l
index 924f4ab922a324f3aa1ac0b6fe821a982cec6188..114407fc06764fc30b7d663fc8106c55e9355d41 100644 (file)
@@ -1,6 +1,5 @@
-                                                             /* -*- C -*- */
-/* Scan Bison Skeletons.
-   Copyright (C) 2001  Free Software Foundation, Inc.
+/* Scan Bison Skeletons.                                       -*- C -*-
+   Copyright (C) 2001, 2002  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
 %option prefix="skel_" outfile="lex.yy.c"
 
 %option prefix="skel_" outfile="lex.yy.c"
 
-/* If we enable
-
-   %option yylineno
-
-   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 "system.h"
 %{
 #include "system.h"
-#include "skeleton.h"
-#include "parse-skel.h"
-%}
-
-%{
-/* Each time we match a string, move the end cursor to its end. */
-#define YY_USER_ACTION  yylloc->last_column += yyleng;
+#include "error.h"
+#include "getargs.h"
+#include "files.h"
+int skel_lex PARAMS ((void));
+static int yylineno = 1;
+static char *yyoutname = NULL;
 %}
 %%
 %}
 %%
-%{
-  /* At each yylex invocation, mark the current position as the
-     start of the next token.  */
-  LOCATION_STEP (*yylloc);
-%}
-
-"%%{line}"          { return LINE; }
-"%%{skeleton-line}" { return SLINE; }
-
-"%%{section}" { return SECTION; }
-
-"%%{guards}"   { return GUARDS; }
-"%%{actions}"  { return ACTIONS; }
-"%%{tokendef}" { return TOKENS; }
-
-  /* Muscle.  */
-"%%{"[a-zA-Z][0-9a-zA-Z_-]+"}" {
-  yylval->string = xstrndup (yytext + 3, yyleng - 4);
-  return MUSCLE;
-}
-
-  /* String.  */
-"%%\"".*"\"" {
-  yylval->string = xstrndup (yytext + 3, yyleng - 4);
-  return STRING;
-}
-
-  /* End of line.  */
-"\n" {
-  LOCATION_LINES (*yylloc, yyleng);
-  return '\n';
-}
-
-  /* White spaces.  */
-[\t ]+ {
-  yylval->string = yytext;
-  return BLANKS;
-}
-
-  /* Plain Characters.  */
-[^%\n]+ {
-  yylval->string = yytext;
-  return RAW;
-}
+  /* 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;
+   }
+
+"@<:@"           fputc ('[', yyout);
+"@:>@"           fputc (']', yyout);
+
+"__oline__"      fprintf (yyout, "%d", yylineno+1);
+"__ofile__"      fprintf (yyout, "%s", yyoutname);
+[^@_\n]+         ECHO;
+\n+              yylineno += yyleng; ECHO;
+.                ECHO;
+
+<<EOF>>          xfclose (yyout); free (yyoutname); return EOF;
+%%
 
 
-  /* Plain Character.  */
-. {
-  yylval->character = *yytext;
-  return CHARACTER;
+/* From lib/readpipe.c.  */
+FILE *readpipe PARAMS ((const char *, ...));
+
+/*----------------------.
+| Run our backend, M4.  |
+`----------------------*/
+
+void m4_invoke PARAMS ((const char *definitions));
+
+void
+m4_invoke (const char *definitions)
+{
+  /* Invoke m4 on the definition of the muscles, and the skeleton. */
+  const char *bison_pkgdatadir = getenv ("BISON_PKGDATADIR");
+  const char *m4 = getenv ("M4");
+  int pkg_data_len;
+  char *full_skeleton;
+
+  if (!m4)
+    m4 = M4;
+  if (!bison_pkgdatadir)
+    bison_pkgdatadir = PKGDATADIR;
+  pkg_data_len = strlen (bison_pkgdatadir);
+  full_skeleton = XMALLOC (char, pkg_data_len + strlen (skeleton) + 2);
+  if (bison_pkgdatadir[pkg_data_len-1] == '/')
+    sprintf (full_skeleton, "%s%s", bison_pkgdatadir, skeleton);
+  else
+    sprintf (full_skeleton, "%s/%s", bison_pkgdatadir, skeleton);
+  if (trace_flag & trace_tools)
+    fprintf (stderr,
+            "running: %s -I %s m4sugar/m4sugar.m4 %s %s\n",
+            m4, bison_pkgdatadir, definitions, full_skeleton);
+  skel_in = readpipe (m4,
+                     "-I", bison_pkgdatadir,
+                     "m4sugar/m4sugar.m4",
+                     definitions,
+                     full_skeleton,
+                     NULL);
+  XFREE (full_skeleton);
+  if (!skel_in)
+    error (EXIT_FAILURE, errno, "cannot run m4");
+  skel_lex ();
+
+  /* Reclaim Flex's buffers.  */
+  yy_delete_buffer (YY_CURRENT_BUFFER);
 }
 }
-
-%%