Discussion:
yyrestart
Akim Demaille
2003-03-29 13:29:18 UTC
Permalink
Index: ChangeLog
from Akim Demaille <***@epita.fr>

* doc/bison.texinfo (How Can I Reset @code{yyparse}): New.

Index: doc/bison.texinfo
===================================================================
RCS file: /cvsroot/bison/bison/doc/bison.texinfo,v
retrieving revision 1.103
diff -u -u -r1.103 bison.texinfo
--- doc/bison.texinfo 29 Mar 2003 11:26:46 -0000 1.103
+++ doc/bison.texinfo 29 Mar 2003 13:27:44 -0000
@@ -284,6 +284,7 @@
Frequently Asked Questions

* Parser Stack Overflow:: Breaking the Stack Limits
+* How Can I Reset @code{yyparse}:: @code{yyparse} Keeps some State
* Strings are Destroyed:: @code{yylval} Loses Track of Strings

Copying This Manual
@@ -6353,6 +6354,7 @@

@menu
* Parser Stack Overflow:: Breaking the Stack Limits
+* How Can I Reset @code{yyparse}:: @code{yyparse} Keeps some State
* Strings are Destroyed:: @code{yylval} Loses Track of Strings
@end menu

@@ -6366,6 +6368,89 @@

This question is already addressed elsewhere, @xref{Recursion,
,Recursive Rules}.
+
+@node How Can I Reset @code{yyparse}
+@section How Can I Reset @code{yyparse}
+
+The following phenomenon gives raise to several incarnations,
+resulting in the following typical questions:
+
+@display
+I invoke @code{yyparse} several times, and on correct input it works
+properly; but when a parse error is found, all the other calls fail
+too. How can I reset @code{yyparse}'s error flag?
+@end display
+
+@noindent
+or
+
+@display
+My parser includes support for a @samp{#include} like feature, in
+which case I run @code{yyparse} from @code{yyparse}. This fails
+although I did specify I needed a @code{%pure-parser}.
+@end display
+
+These problems are not related to Bison itself, but with the Lex
+generated scanners. Because these scanners use large buffers for
+speed, they might not notice a change of input file. As a
+demonstration, consider the following source file,
+@file{first-line.l}:
+
+@verbatim
+%{
+#include <stdio.h>
+#include <stdlib.h>
+%}
+%%
+.*\n ECHO; return 1;
+%%
+int
+yyparse (const char *file)
+{
+ yyin = fopen (file, "r");
+ if (!yyin)
+ exit (2);
+ /* One token only. */
+ yylex ();
+ if (!fclose (yyin))
+ exit (3);
+ return 0;
+}
+
+int
+main ()
+{
+ yyparse ("input");
+ yyparse ("input");
+ return 0;
+}
+@end verbatim
+
+@noindent
+If the file @file{input} contains
+
+@verbatim
+input:1: Hello,
+input:2: World!
+@end verbatim
+
+@noindent
+then instead of getting twice the first line, you get:
+
+@example
+$ @kbd{flex -ofirst-line.c first-line.l}
+$ @kbd{gcc -ofirst-line first-line.c -ll}
+$ @kbd{./first-line}
+input:1: Hello,
+input:2: World!
+@end example
+
+Therefore, whenever you change @code{yyin}, you must tell the Lex
+generated scanner to discard its current buffer, and to switch to the
+new one. This depends upon your implementation of Lex, see its
+documentation for more. For instance, in the case of Flex, a simple
+call @samp{yyrestart (yyin)} suffices after each change to
+@code{yyin}.

@node Strings are Destroyed
@section Strings are Destroyed
Paul Eggert
2003-05-12 19:38:27 UTC
Permalink
Date: Sat, 29 Mar 2003 14:29:18 +0100
Thanks. I installed the following minor English and technical fixups to that.

2003-05-12 Paul Eggert <***@twinsun.com>

* doc/bison.texinfo (How Can I Reset @code{yyparse}): Reword the
English a bit. Fix fclose typo. Change "const char" to "char
const", and use ANSI C rather than K&R for "main". Suggest
YY_FLUSH_BUFFER over yyrestart (as that is what Flex recommends)
and suggest yy_switch_to_buffer.

--- bison.texinfo.~1.107.~ Tue Apr 29 11:52:00 2003
+++ bison.texinfo Mon May 12 12:27:05 2003
@@ -6376,26 +6376,26 @@ This question is already addressed elsew
@node How Can I Reset @code{yyparse}
@section How Can I Reset @code{yyparse}

-The following phenomenon gives raise to several incarnations,
-resulting in the following typical questions:
+The following phenomenon has several symptoms, resulting in the
+following typical questions:

@display
I invoke @code{yyparse} several times, and on correct input it works
properly; but when a parse error is found, all the other calls fail
-too. How can I reset @code{yyparse}'s error flag?
+too. How can I reset the error flag of @code{yyparse}?
@end display

@noindent
or

@display
-My parser includes support for a @samp{#include} like feature, in
+My parser includes support for an @samp{#include}-like feature, in
which case I run @code{yyparse} from @code{yyparse}. This fails
although I did specify I needed a @code{%pure-parser}.
@end display

-These problems are not related to Bison itself, but with the Lex
-generated scanners. Because these scanners use large buffers for
+These problems typically come not from Bison itself, but from
+Lex-generated scanners. Because these scanners use large buffers for
speed, they might not notice a change of input file. As a
demonstration, consider the following source file,
@file{first-line.l}:
@@ -6409,20 +6409,20 @@ demonstration, consider the following so
.*\n ECHO; return 1;
%%
int
-yyparse (const char *file)
+yyparse (char const *file)
{
yyin = fopen (file, "r");
if (!yyin)
exit (2);
/* One token only. */
yylex ();
- if (!fclose (yyin))
+ if (fclose (yyin) != 0)
exit (3);
return 0;
}

int
-main ()
+main (void)
{
yyparse ("input");
yyparse ("input");
@@ -6439,7 +6439,7 @@ input:2: World!
@end verbatim

@noindent
-then instead of getting twice the first line, you get:
+then instead of getting the first line twice, you get:

@example
$ @kbd{flex -ofirst-line.c first-line.l}
@@ -6449,12 +6449,15 @@ input:1: Hello,
input:2: World!
@end example

-Therefore, whenever you change @code{yyin}, you must tell the Lex
-generated scanner to discard its current buffer, and to switch to the
-new one. This depends upon your implementation of Lex, see its
-documentation for more. For instance, in the case of Flex, a simple
-call @samp{yyrestart (yyin)} suffices after each change to
-@code{yyin}.
+Therefore, whenever you change @code{yyin}, you must tell the
+Lex-generated scanner to discard its current buffer and switch to the
+new one. This depends upon your implementation of Lex; see its
+documentation for more. For Flex, it suffices to call
+@samp{YY_FLUSH_BUFFER} after each change to @code{yyin}. If your
+Flex-generated scanner needs to read from several input streams to
+handle features like include files, you might consider using Flex
+functions like @samp{yy_switch_to_buffer} that manipulate multiple
+input buffers.

@node Strings are Destroyed
@section Strings are Destroyed

Loading...