X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/dd5611579b3978eff5c4aa22dc8459b8f53c2fc0..ab8932bfd9f66643eef907d8aad70e7af2bf5841:/doc/bison.texinfo diff --git a/doc/bison.texinfo b/doc/bison.texinfo index 329d81d0..5d87ff50 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -1712,7 +1712,7 @@ yylex (void) /* Skip white space. */ while ((c = getchar ()) == ' ' || c == '\t') - ; + continue; @end group @group /* Process numbers. */ @@ -2158,6 +2158,7 @@ yylex (void) if (c == EOF) return 0; +@group /* Return a single char, and update location. */ if (c == '\n') @{ @@ -2168,6 +2169,7 @@ yylex (void) ++yylloc.last_column; return c; @} +@end group @end example Basically, the lexical analyzer performs the same processing as before: @@ -2467,6 +2469,10 @@ The function @code{getsym} is passed the name of the symbol to look up. If found, a pointer to that symbol is returned; otherwise zero is returned. @smallexample +#include /* malloc. */ +#include /* strlen. */ + +@group symrec * putsym (char const *sym_name, int sym_type) @{ @@ -2480,7 +2486,9 @@ putsym (char const *sym_name, int sym_type) sym_table = ptr; return ptr; @} +@end group +@group symrec * getsym (char const *sym_name) @{ @@ -2491,6 +2499,7 @@ getsym (char const *sym_name) return ptr; return 0; @} +@end group @end smallexample The function @code{yylex} must now recognize variables, numeric values, and @@ -2520,7 +2529,8 @@ yylex (void) int c; /* Ignore white space, get first nonwhite character. */ - while ((c = getchar ()) == ' ' || c == '\t'); + while ((c = getchar ()) == ' ' || c == '\t') + continue; if (c == EOF) return 0; @@ -2841,19 +2851,26 @@ definitions. Thus, they belong in one or more @code{%code requires}: @smallexample +@group %code top @{ #define _GNU_SOURCE #include @} +@end group +@group %code requires @{ #include "ptypes.h" @} +@end group +@group %union @{ long int n; tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */ @} +@end group +@group %code requires @{ #define YYLTYPE YYLTYPE typedef struct YYLTYPE @@ -2865,12 +2882,15 @@ Thus, they belong in one or more @code{%code requires}: char *filename; @} YYLTYPE; @} +@end group +@group %code @{ static void print_token_value (FILE *, int, YYSTYPE); #define YYPRINT(F, N, L) print_token_value (F, N, L) static void trace_token (enum yytokentype token, YYLTYPE loc); @} +@end group @dots{} @end smallexample @@ -2908,19 +2928,26 @@ sufficient. Instead, move its prototype from the unqualified @code{%code} to a @code{%code provides}: @smallexample +@group %code top @{ #define _GNU_SOURCE #include @} +@end group +@group %code requires @{ #include "ptypes.h" @} +@end group +@group %union @{ long int n; tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */ @} +@end group +@group %code requires @{ #define YYLTYPE YYLTYPE typedef struct YYLTYPE @@ -2932,15 +2959,20 @@ sufficient. Instead, move its prototype from the unqualified char *filename; @} YYLTYPE; @} +@end group +@group %code provides @{ void trace_token (enum yytokentype token, YYLTYPE loc); @} +@end group +@group %code @{ static void print_token_value (FILE *, int, YYSTYPE); #define YYPRINT(F, N, L) print_token_value (F, N, L) @} +@end group @dots{} @end smallexample @@ -2970,15 +3002,19 @@ For example, you may organize semantic-type-related directives by semantic type: @smallexample +@group %code requires @{ #include "type1.h" @} %union @{ type1 field1; @} %destructor @{ type1_free ($$); @} %printer @{ type1_print ($$); @} +@end group +@group %code requires @{ #include "type2.h" @} %union @{ type2 field2; @} %destructor @{ type2_free ($$); @} %printer @{ type2_print ($$); @} +@end group @end smallexample @noindent @@ -4092,7 +4128,7 @@ In references, in order to specify names containing dots and dashes, an explicit bracketed syntax @code{$[name]} and @code{@@[name]} must be used: @example @group -if-stmt: IF '(' expr ')' THEN then.stmt ';' +if-stmt: "if" '(' expr ')' "then" then.stmt ';' @{ $[if-stmt] = new_if_stmt ($expr, $[then.stmt]); @} @end group @end example @@ -6683,18 +6719,22 @@ For example, here is an erroneous attempt to define a sequence of zero or more @code{word} groupings. @example +@group sequence: /* empty */ @{ printf ("empty sequence\n"); @} | maybeword | sequence word @{ printf ("added word %s\n", $2); @} ; +@end group +@group maybeword: /* empty */ @{ printf ("empty maybeword\n"); @} | word @{ printf ("single word %s\n", $1); @} ; +@end group @end example @noindent @@ -6771,18 +6811,24 @@ Second, to prevent either a @code{words} or a @code{redirects} from being empty: @example +@group sequence: /* empty */ | sequence words | sequence redirects ; +@end group +@group words: word | words word ; +@end group +@group redirects:redirect | redirects redirect ; +@end group @end example @node Mysterious Conflicts @@ -7622,11 +7668,13 @@ earlier: @example typedef int foo, bar; int baz (void) +@group @{ static bar (bar); /* @r{redeclare @code{bar} as static variable} */ extern foo foo (foo); /* @r{redeclare @code{foo} as function} */ return foo (bar); @} +@end group @end example Unfortunately, the name being declared is separated from the declaration @@ -7639,17 +7687,21 @@ declaration in which that can't be done. Here is a part of the duplication, with actions omitted for brevity: @example +@group initdcl: declarator maybeasm '=' init | declarator maybeasm ; +@end group +@group notype_initdcl: notype_declarator maybeasm '=' init | notype_declarator maybeasm ; +@end group @end example @noindent @@ -7904,6 +7956,7 @@ Grammar and reports the uses of the symbols: @example +@group Terminals, with rules where they appear $end (0) 0 @@ -7913,13 +7966,16 @@ $end (0) 0 '/' (47) 4 error (256) NUM (258) 5 +@end group +@group Nonterminals, with rules where they appear $accept (8) on left: 0 exp (9) on left: 1 2 3 4 5, on right: 0 1 2 3 4 +@end group @end example @noindent @@ -8136,6 +8192,7 @@ state 8 The remaining states are similar: @example +@group state 9 exp -> exp . '+' exp (rule 1) @@ -8149,7 +8206,9 @@ state 9 '/' [reduce using rule 2 (exp)] $default reduce using rule 2 (exp) +@end group +@group state 10 exp -> exp . '+' exp (rule 1) @@ -8162,7 +8221,9 @@ state 10 '/' [reduce using rule 3 (exp)] $default reduce using rule 3 (exp) +@end group +@group state 11 exp -> exp . '+' exp (rule 1) @@ -8181,6 +8242,7 @@ state 11 '*' [reduce using rule 4 (exp)] '/' [reduce using rule 4 (exp)] $default reduce using rule 4 (exp) +@end group @end example @noindent @@ -9314,9 +9376,11 @@ preceding tokens. Comments would be treated equally. @comment file: calc++-scanner.ll @example +@group %@{ # define YY_USER_ACTION yylloc->columns (yyleng); %@} +@end group %% %@{ yylloc->step (); @@ -9358,6 +9422,7 @@ on the scanner's data, it is simpler to implement them in this file. @comment file: calc++-scanner.ll @example +@group void calcxx_driver::scan_begin () @{ @@ -9370,12 +9435,15 @@ calcxx_driver::scan_begin () exit (EXIT_FAILURE); @} @} +@end group +@group void calcxx_driver::scan_end () @{ fclose (yyin); @} +@end group @end example @node Calc++ Top Level @@ -9388,6 +9456,7 @@ The top level file, @file{calc++.cc}, poses no problem. #include #include "calc++-driver.hh" +@group int main (int argc, char *argv[]) @{ @@ -9400,6 +9469,7 @@ main (int argc, char *argv[]) else if (!driver.parse (*argv)) std::cout << driver.result << std::endl; @} +@end group @end example @node Java Parsers @@ -9997,10 +10067,10 @@ are addressed. @node Memory Exhausted @section Memory Exhausted -@display +@quotation My parser returns with error with a @samp{memory exhausted} message. What can I do? -@end display +@end quotation This question is already addressed elsewhere, @xref{Recursion, ,Recursive Rules}. @@ -10011,20 +10081,20 @@ This question is already addressed elsewhere, @xref{Recursion, The following phenomenon has several symptoms, resulting in the following typical questions: -@display +@quotation 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 the error flag of @code{yyparse}? -@end display +@end quotation @noindent or -@display +@quotation 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 @code{%define api.pure}. -@end display +although I did specify @samp{%define api.pure}. +@end quotation These problems typically come not from Bison itself, but from Lex-generated scanners. Because these scanners use large buffers for @@ -10032,49 +10102,57 @@ speed, they might not notice a change of input file. As a demonstration, consider the following source file, @file{first-line.l}: -@verbatim -%{ +@example +@group +%@{ #include #include -%} +%@} +@end group %% .*\n ECHO; return 1; %% +@group int yyparse (char const *file) -{ +@{ yyin = fopen (file, "r"); if (!yyin) - { - perror ("fopen"); - exit (EXIT_FAILURE); - } + @{ + perror ("fopen"); + exit (EXIT_FAILURE); + @} +@end group +@group /* One token only. */ yylex (); if (fclose (yyin) != 0) - { - perror ("fclose"); - exit (EXIT_FAILURE); - } + @{ + perror ("fclose"); + exit (EXIT_FAILURE); + @} return 0; -} +@} +@end group +@group int main (void) -{ +@{ yyparse ("input"); yyparse ("input"); return 0; -} -@end verbatim +@} +@end group +@end example @noindent If the file @file{input} contains -@verbatim +@example input:1: Hello, input:2: World! -@end verbatim +@end example @noindent then instead of getting the first line twice, you get: @@ -10105,35 +10183,41 @@ start condition, through a call to @samp{BEGIN (0)}. @node Strings are Destroyed @section Strings are Destroyed -@display +@quotation My parser seems to destroy old strings, or maybe it loses track of them. Instead of reporting @samp{"foo", "bar"}, it reports @samp{"bar", "bar"}, or even @samp{"foo\nbar", "bar"}. -@end display +@end quotation This error is probably the single most frequent ``bug report'' sent to Bison lists, but is only concerned with a misunderstanding of the role of the scanner. Consider the following Lex code: -@verbatim -%{ +@example +@group +%@{ #include char *yylval = NULL; -%} +%@} +@end group +@group %% .* yylval = yytext; return 1; \n /* IGNORE */ %% +@end group +@group int main () -{ +@{ /* Similar to using $1, $2 in a Bison action. */ char *fst = (yylex (), yylval); char *snd = (yylex (), yylval); printf ("\"%s\", \"%s\"\n", fst, snd); return 0; -} -@end verbatim +@} +@end group +@end example If you compile and run this code, you get: @@ -10164,10 +10248,10 @@ $ @kbd{printf 'one\ntwo\n' | ./split-lines} @node Implementing Gotos/Loops @section Implementing Gotos/Loops -@display +@quotation My simple calculator supports variables, assignments, and functions, but how can I implement gotos, or loops? -@end display +@end quotation Although very pedagogical, the examples included in the document blur the distinction to make between the parser---whose job is to recover @@ -10194,11 +10278,11 @@ invited to consult the dedicated literature. @node Multiple start-symbols @section Multiple start-symbols -@display +@quotation I have several closely related grammars, and I would like to share their implementations. In fact, I could use a single grammar but with multiple entry points. -@end display +@end quotation Bison does not support multiple start-symbols, but there is a very simple means to simulate them. If @code{foo} and @code{bar} are the two @@ -10243,9 +10327,9 @@ available in the scanner (e.g., a global variable or using @node Secure? Conform? @section Secure? Conform? -@display +@quotation Is Bison secure? Does it conform to POSIX? -@end display +@end quotation If you're looking for a guarantee or certification, we don't provide it. However, Bison is intended to be a reliable program that conforms to the @@ -10255,11 +10339,11 @@ please send us a bug report. @node I can't build Bison @section I can't build Bison -@display +@quotation I can't build Bison because @command{make} complains that @code{msgfmt} is not found. What should I do? -@end display +@end quotation Like most GNU packages with internationalization support, that feature is turned on by default. If you have problems building in the @file{po} @@ -10273,9 +10357,9 @@ Bison. See the file @file{ABOUT-NLS} for more information. @node Where can I find help? @section Where can I find help? -@display +@quotation I'm having trouble using Bison. Where can I find help? -@end display +@end quotation First, read this fine manual. Beyond that, you can send mail to @email{help-bison@@gnu.org}. This mailing list is intended to be @@ -10290,9 +10374,9 @@ hearts. @node Bug Reports @section Bug Reports -@display +@quotation I found a bug. What should I include in the bug report? -@end display +@end quotation Before you send a bug report, make sure you are using the latest version. Check @url{ftp://ftp.gnu.org/pub/gnu/bison/} or one of its @@ -10321,10 +10405,10 @@ Send bug reports to @email{bug-bison@@gnu.org}. @node More Languages @section More Languages -@display +@quotation Will Bison ever have C++ and Java support? How about @var{insert your favorite language here}? -@end display +@end quotation C++ and Java support is there now, and is documented. We'd love to add other languages; contributions are welcome. @@ -10332,9 +10416,9 @@ languages; contributions are welcome. @node Beta Testing @section Beta Testing -@display +@quotation What is involved in being a beta tester? -@end display +@end quotation It's not terribly involved. Basically, you would download a test release, compile it, and use it to build and run a parser or two. After @@ -10352,9 +10436,9 @@ systems are especially welcome. @node Mailing Lists @section Mailing Lists -@display +@quotation How do I join the help-bison and bug-bison mailing lists? -@end display +@end quotation See @url{http://lists.gnu.org/}.