mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-14 14:53:03 +00:00
doc: style changes.
* doc/bison.texinfo: Avoid line width issues with TeX. Upgrade ancient messages. Move some comments to better looking places. Add more @group. (Mfcalc Symbol Table): Reduce variable scopes. Prefer size_t for sizes. Prefer declarations with an initial value. Fix a @group environment.
This commit is contained in:
@@ -1274,8 +1274,9 @@ will suffice. Otherwise, we suggest
|
|||||||
|
|
||||||
@example
|
@example
|
||||||
%@{
|
%@{
|
||||||
#if __STDC_VERSION__ < 199901 && ! defined __GNUC__ && ! defined inline
|
#if (__STDC_VERSION__ < 199901 && ! defined __GNUC__ \
|
||||||
#define inline
|
&& ! defined inline)
|
||||||
|
# define inline
|
||||||
#endif
|
#endif
|
||||||
%@}
|
%@}
|
||||||
@end example
|
@end example
|
||||||
@@ -1464,11 +1465,11 @@ simple program, all the rest of the program can go here.
|
|||||||
@cindex simple examples
|
@cindex simple examples
|
||||||
@cindex examples, simple
|
@cindex examples, simple
|
||||||
|
|
||||||
Now we show and explain three sample programs written using Bison: a
|
Now we show and explain several sample programs written using Bison: a
|
||||||
reverse polish notation calculator, an algebraic (infix) notation
|
reverse polish notation calculator, an algebraic (infix) notation
|
||||||
calculator, and a multi-function calculator. All three have been tested
|
calculator --- later extended to track ``locations'' ---
|
||||||
under BSD Unix 4.3; each produces a usable, though limited, interactive
|
and a multi-function calculator. All
|
||||||
desk-top calculator.
|
produce usable, though limited, interactive desk-top calculators.
|
||||||
|
|
||||||
These examples are simple, but Bison grammars for real programming
|
These examples are simple, but Bison grammars for real programming
|
||||||
languages are written the same way. You can copy these examples into a
|
languages are written the same way. You can copy these examples into a
|
||||||
@@ -1570,24 +1571,28 @@ Here are the grammar rules for the reverse polish notation calculator.
|
|||||||
|
|
||||||
@comment file: rpcalc.y
|
@comment file: rpcalc.y
|
||||||
@example
|
@example
|
||||||
|
@group
|
||||||
input: /* empty */
|
input: /* empty */
|
||||||
| input line
|
| input line
|
||||||
;
|
;
|
||||||
|
@end group
|
||||||
|
|
||||||
|
@group
|
||||||
line: '\n'
|
line: '\n'
|
||||||
| exp '\n' @{ printf ("%.10g\n", $1); @}
|
| exp '\n' @{ printf ("%.10g\n", $1); @}
|
||||||
;
|
;
|
||||||
|
@end group
|
||||||
|
|
||||||
|
@group
|
||||||
exp: NUM @{ $$ = $1; @}
|
exp: NUM @{ $$ = $1; @}
|
||||||
| exp exp '+' @{ $$ = $1 + $2; @}
|
| exp exp '+' @{ $$ = $1 + $2; @}
|
||||||
| exp exp '-' @{ $$ = $1 - $2; @}
|
| exp exp '-' @{ $$ = $1 - $2; @}
|
||||||
| exp exp '*' @{ $$ = $1 * $2; @}
|
| exp exp '*' @{ $$ = $1 * $2; @}
|
||||||
| exp exp '/' @{ $$ = $1 / $2; @}
|
| exp exp '/' @{ $$ = $1 / $2; @}
|
||||||
/* Exponentiation */
|
| exp exp '^' @{ $$ = pow ($1, $2); @} /* Exponentiation */
|
||||||
| exp exp '^' @{ $$ = pow ($1, $2); @}
|
| exp 'n' @{ $$ = -$1; @} /* Unary minus */
|
||||||
/* Unary minus */
|
|
||||||
| exp 'n' @{ $$ = -$1; @}
|
|
||||||
;
|
;
|
||||||
|
@end group
|
||||||
%%
|
%%
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@@ -1846,7 +1851,9 @@ here is the definition we will use:
|
|||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@end group
|
||||||
|
|
||||||
|
@group
|
||||||
/* Called by yyparse on error. */
|
/* Called by yyparse on error. */
|
||||||
void
|
void
|
||||||
yyerror (char const *s)
|
yyerror (char const *s)
|
||||||
@@ -1952,6 +1959,7 @@ parentheses nested to arbitrary depth. Here is the Bison code for
|
|||||||
@example
|
@example
|
||||||
/* Infix notation calculator. */
|
/* Infix notation calculator. */
|
||||||
|
|
||||||
|
@group
|
||||||
%@{
|
%@{
|
||||||
#define YYSTYPE double
|
#define YYSTYPE double
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@@ -1959,32 +1967,41 @@ parentheses nested to arbitrary depth. Here is the Bison code for
|
|||||||
int yylex (void);
|
int yylex (void);
|
||||||
void yyerror (char const *);
|
void yyerror (char const *);
|
||||||
%@}
|
%@}
|
||||||
|
@end group
|
||||||
|
|
||||||
|
@group
|
||||||
/* Bison declarations. */
|
/* Bison declarations. */
|
||||||
%token NUM
|
%token NUM
|
||||||
%left '-' '+'
|
%left '-' '+'
|
||||||
%left '*' '/'
|
%left '*' '/'
|
||||||
%precedence NEG /* negation--unary minus */
|
%precedence NEG /* negation--unary minus */
|
||||||
%right '^' /* exponentiation */
|
%right '^' /* exponentiation */
|
||||||
|
@end group
|
||||||
|
|
||||||
%% /* The grammar follows. */
|
%% /* The grammar follows. */
|
||||||
|
@group
|
||||||
input: /* empty */
|
input: /* empty */
|
||||||
| input line
|
| input line
|
||||||
;
|
;
|
||||||
|
@end group
|
||||||
|
|
||||||
|
@group
|
||||||
line: '\n'
|
line: '\n'
|
||||||
| exp '\n' @{ printf ("\t%.10g\n", $1); @}
|
| exp '\n' @{ printf ("\t%.10g\n", $1); @}
|
||||||
;
|
;
|
||||||
|
@end group
|
||||||
|
|
||||||
exp: NUM @{ $$ = $1; @}
|
@group
|
||||||
| exp '+' exp @{ $$ = $1 + $3; @}
|
exp: NUM @{ $$ = $1; @}
|
||||||
| exp '-' exp @{ $$ = $1 - $3; @}
|
| exp '+' exp @{ $$ = $1 + $3; @}
|
||||||
| exp '*' exp @{ $$ = $1 * $3; @}
|
| exp '-' exp @{ $$ = $1 - $3; @}
|
||||||
| exp '/' exp @{ $$ = $1 / $3; @}
|
| exp '*' exp @{ $$ = $1 * $3; @}
|
||||||
| '-' exp %prec NEG @{ $$ = -$2; @}
|
| exp '/' exp @{ $$ = $1 / $3; @}
|
||||||
|
| '-' exp %prec NEG @{ $$ = -$2; @}
|
||||||
| exp '^' exp @{ $$ = pow ($1, $3); @}
|
| exp '^' exp @{ $$ = pow ($1, $3); @}
|
||||||
| '(' exp ')' @{ $$ = $2; @}
|
| '(' exp ')' @{ $$ = $2; @}
|
||||||
;
|
;
|
||||||
|
@end group
|
||||||
%%
|
%%
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@@ -2521,10 +2538,9 @@ void
|
|||||||
init_table (void)
|
init_table (void)
|
||||||
@{
|
@{
|
||||||
int i;
|
int i;
|
||||||
symrec *ptr;
|
|
||||||
for (i = 0; arith_fncts[i].fname != 0; i++)
|
for (i = 0; arith_fncts[i].fname != 0; i++)
|
||||||
@{
|
@{
|
||||||
ptr = putsym (arith_fncts[i].fname, FNCT);
|
symrec *ptr = putsym (arith_fncts[i].fname, FNCT);
|
||||||
ptr->value.fnctptr = arith_fncts[i].fnct;
|
ptr->value.fnctptr = arith_fncts[i].fnct;
|
||||||
@}
|
@}
|
||||||
@}
|
@}
|
||||||
@@ -2550,8 +2566,7 @@ found, a pointer to that symbol is returned; otherwise zero is returned.
|
|||||||
symrec *
|
symrec *
|
||||||
putsym (char const *sym_name, int sym_type)
|
putsym (char const *sym_name, int sym_type)
|
||||||
@{
|
@{
|
||||||
symrec *ptr;
|
symrec *ptr = (symrec *) malloc (sizeof (symrec));
|
||||||
ptr = (symrec *) malloc (sizeof (symrec));
|
|
||||||
ptr->name = (char *) malloc (strlen (sym_name) + 1);
|
ptr->name = (char *) malloc (strlen (sym_name) + 1);
|
||||||
strcpy (ptr->name,sym_name);
|
strcpy (ptr->name,sym_name);
|
||||||
ptr->type = sym_type;
|
ptr->type = sym_type;
|
||||||
@@ -2628,24 +2643,18 @@ yylex (void)
|
|||||||
/* Char starts an identifier => read the name. */
|
/* Char starts an identifier => read the name. */
|
||||||
if (isalpha (c))
|
if (isalpha (c))
|
||||||
@{
|
@{
|
||||||
symrec *s;
|
|
||||||
static char *symbuf = 0;
|
|
||||||
static int length = 0;
|
|
||||||
int i;
|
|
||||||
@end group
|
|
||||||
|
|
||||||
@group
|
|
||||||
/* Initially make the buffer long enough
|
/* Initially make the buffer long enough
|
||||||
for a 40-character symbol name. */
|
for a 40-character symbol name. */
|
||||||
if (length == 0)
|
static size_t length = 40;
|
||||||
@{
|
static char *symbuf = 0;
|
||||||
length = 40;
|
symrec *s;
|
||||||
symbuf = (char *) malloc (length + 1);
|
int i;
|
||||||
@}
|
@end group
|
||||||
|
if (!symbuf)
|
||||||
|
symbuf = (char *) malloc (length + 1);
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
do
|
do
|
||||||
@end group
|
|
||||||
@group
|
@group
|
||||||
@{
|
@{
|
||||||
/* If buffer is full, make it bigger. */
|
/* If buffer is full, make it bigger. */
|
||||||
@@ -2689,8 +2698,6 @@ The error reporting function is unchanged, and the new version of
|
|||||||
|
|
||||||
@comment file: mfcalc.y
|
@comment file: mfcalc.y
|
||||||
@smallexample
|
@smallexample
|
||||||
|
|
||||||
@group
|
|
||||||
@group
|
@group
|
||||||
/* Called by yyparse on error. */
|
/* Called by yyparse on error. */
|
||||||
void
|
void
|
||||||
@@ -2700,6 +2707,7 @@ yyerror (char const *s)
|
|||||||
@}
|
@}
|
||||||
@end group
|
@end group
|
||||||
|
|
||||||
|
@group
|
||||||
int
|
int
|
||||||
main (int argc, char const* argv[])
|
main (int argc, char const* argv[])
|
||||||
@{
|
@{
|
||||||
@@ -4136,6 +4144,7 @@ By default, @code{YYLLOC_DEFAULT} is defined this way:
|
|||||||
@end group
|
@end group
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
|
@noindent
|
||||||
where @code{YYRHSLOC (rhs, k)} is the location of the @var{k}th symbol
|
where @code{YYRHSLOC (rhs, k)} is the location of the @var{k}th symbol
|
||||||
in @var{rhs} when @var{k} is positive, and the location of the symbol
|
in @var{rhs} when @var{k} is positive, and the location of the symbol
|
||||||
just before the reduction when @var{k} and @var{n} are both zero.
|
just before the reduction when @var{k} and @var{n} are both zero.
|
||||||
@@ -9357,9 +9366,9 @@ The types for semantic values and locations (if enabled).
|
|||||||
@end defcv
|
@end defcv
|
||||||
|
|
||||||
@defcv {Type} {parser} {token}
|
@defcv {Type} {parser} {token}
|
||||||
A structure that contains (only) the definition of the tokens as the
|
A structure that contains (only) the @code{yytokentype} enumeration, which
|
||||||
@code{yytokentype} enumeration. To refer to the token @code{FOO}, the
|
defines the tokens. To refer to the token @code{FOO},
|
||||||
scanner should use @code{yy::parser::token::FOO}. The scanner can use
|
use @code{yy::parser::token::FOO}. The scanner can use
|
||||||
@samp{typedef yy::parser::token token;} to ``import'' the token enumeration
|
@samp{typedef yy::parser::token token;} to ``import'' the token enumeration
|
||||||
(@pxref{Calc++ Scanner}).
|
(@pxref{Calc++ Scanner}).
|
||||||
@end defcv
|
@end defcv
|
||||||
@@ -10043,7 +10052,7 @@ calcxx_driver::scan_begin ()
|
|||||||
yyin = stdin;
|
yyin = stdin;
|
||||||
else if (!(yyin = fopen (file.c_str (), "r")))
|
else if (!(yyin = fopen (file.c_str (), "r")))
|
||||||
@{
|
@{
|
||||||
error (std::string ("cannot open ") + file + ": " + strerror(errno));
|
error ("cannot open " + file + ": " + strerror(errno));
|
||||||
exit (EXIT_FAILURE);
|
exit (EXIT_FAILURE);
|
||||||
@}
|
@}
|
||||||
@}
|
@}
|
||||||
|
|||||||
Reference in New Issue
Block a user