X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/a06ea4aa98143a6ad9ff5c4bcd9189aee44d8eaf..637fa3f83edca74df6a9d834ffe7bfd4d7468793:/doc/bison.texinfo diff --git a/doc/bison.texinfo b/doc/bison.texinfo index 22abaada..d09f42a8 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -6376,26 +6376,26 @@ This question is already addressed elsewhere, @xref{Recursion, @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 source file, .*\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 @@ -6546,9 +6549,9 @@ but how can I implement loops? @end display Although very pedagogical, the examples included in the document blur -the distinction to make between the parser ---whose job is to recover +the distinction to make between the parser---whose job is to recover the structure of a text and to transmit it to subsequent modules of -the program--- and the processing (such as the execution) of this +the program---and the processing (such as the execution) of this structure. This works well with so called straight line programs, i.e., precisely those that have a straightforward execution model: execute simple instructions one after the others.