2002-05-19 05:14:02 +00:00
|
|
|
.\" Copyright (C) Caldera International Inc. 2001-2002. All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions are
|
|
|
|
.\" met:
|
|
|
|
.\"
|
|
|
|
.\" Redistributions of source code and documentation must retain the above
|
|
|
|
.\" copyright notice, this list of conditions and the following
|
|
|
|
.\" disclaimer.
|
|
|
|
.\"
|
|
|
|
.\" Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
|
|
.\"
|
|
|
|
.\" All advertising materials mentioning features or use of this software
|
|
|
|
.\" must display the following acknowledgement:
|
|
|
|
.\"
|
|
|
|
.\" This product includes software developed or owned by Caldera
|
|
|
|
.\" International, Inc. Neither the name of Caldera International, Inc.
|
|
|
|
.\" nor the names of other contributors may be used to endorse or promote
|
|
|
|
.\" products derived from this software without specific prior written
|
|
|
|
.\" permission.
|
|
|
|
.\"
|
|
|
|
.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
|
|
|
|
.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
|
|
.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
|
.\" DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE
|
|
|
|
.\" FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
|
|
.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
|
|
.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
|
|
.\" OR OTHERWISE) RISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
|
|
|
.\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2002-05-19 04:37:39 +00:00
|
|
|
.\"
|
|
|
|
.\" @(#)ssa 8.1 (Berkeley) 6/8/93
|
|
|
|
.\"
|
|
|
|
.\" $FreeBSD$
|
|
|
|
.SH
|
|
|
|
Appendix A: A Simple Example
|
|
|
|
.PP
|
|
|
|
This example gives the complete Yacc specification for a small desk calculator;
|
|
|
|
the desk calculator has 26 registers, labeled ``a'' through ``z'', and accepts
|
|
|
|
arithmetic expressions made up of the operators +, \-, *, /,
|
|
|
|
% (mod operator), & (bitwise and), | (bitwise or), and assignment.
|
|
|
|
If an expression at the top level is an assignment, the value is not
|
|
|
|
printed; otherwise it is.
|
|
|
|
As in C, an integer that begins with 0 (zero) is assumed to be octal;
|
|
|
|
otherwise, it is assumed to be decimal.
|
|
|
|
.PP
|
|
|
|
As an example of a Yacc specification, the desk calculator
|
|
|
|
does a reasonable job of showing how precedences and ambiguities
|
|
|
|
are used, and demonstrating simple error recovery.
|
|
|
|
The major oversimplifications are that the
|
|
|
|
lexical analysis phase is much simpler than for most applications, and the
|
|
|
|
output is produced immediately, line by line.
|
|
|
|
Note the way that decimal and octal integers are read in by the grammar rules;
|
|
|
|
This job is probably better done by the lexical analyzer.
|
|
|
|
.sp
|
|
|
|
.nf
|
|
|
|
.ta .5i 1i 1.5i 2i 2.5i
|
|
|
|
|
|
|
|
%{
|
|
|
|
# include <stdio.h>
|
|
|
|
# include <ctype.h>
|
|
|
|
|
|
|
|
int regs[26];
|
|
|
|
int base;
|
|
|
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
%start list
|
|
|
|
|
|
|
|
%token DIGIT LETTER
|
|
|
|
|
|
|
|
%left \'|\'
|
|
|
|
%left \'&\'
|
|
|
|
%left \'+\' \'\-\'
|
|
|
|
%left \'*\' \'/\' \'%\'
|
|
|
|
%left UMINUS /* supplies precedence for unary minus */
|
|
|
|
|
|
|
|
%% /* beginning of rules section */
|
|
|
|
|
|
|
|
list : /* empty */
|
|
|
|
| list stat \'\en\'
|
|
|
|
| list error \'\en\'
|
|
|
|
{ yyerrok; }
|
|
|
|
;
|
|
|
|
|
|
|
|
stat : expr
|
|
|
|
{ printf( "%d\en", $1 ); }
|
|
|
|
| LETTER \'=\' expr
|
|
|
|
{ regs[$1] = $3; }
|
|
|
|
;
|
|
|
|
|
|
|
|
expr : \'(\' expr \')\'
|
|
|
|
{ $$ = $2; }
|
|
|
|
| expr \'+\' expr
|
|
|
|
{ $$ = $1 + $3; }
|
|
|
|
| expr \'\-\' expr
|
|
|
|
{ $$ = $1 \- $3; }
|
|
|
|
| expr \'*\' expr
|
|
|
|
{ $$ = $1 * $3; }
|
|
|
|
| expr \'/\' expr
|
|
|
|
{ $$ = $1 / $3; }
|
|
|
|
| expr \'%\' expr
|
|
|
|
{ $$ = $1 % $3; }
|
|
|
|
| expr \'&\' expr
|
|
|
|
{ $$ = $1 & $3; }
|
|
|
|
| expr \'|\' expr
|
|
|
|
{ $$ = $1 | $3; }
|
|
|
|
| \'\-\' expr %prec UMINUS
|
|
|
|
{ $$ = \- $2; }
|
|
|
|
| LETTER
|
|
|
|
{ $$ = regs[$1]; }
|
|
|
|
| number
|
|
|
|
;
|
|
|
|
|
|
|
|
number : DIGIT
|
|
|
|
{ $$ = $1; base = ($1==0) ? 8 : 10; }
|
|
|
|
| number DIGIT
|
|
|
|
{ $$ = base * $1 + $2; }
|
|
|
|
;
|
|
|
|
|
|
|
|
%% /* start of programs */
|
|
|
|
|
|
|
|
yylex() { /* lexical analysis routine */
|
|
|
|
/* returns LETTER for a lower case letter, yylval = 0 through 25 */
|
|
|
|
/* return DIGIT for a digit, yylval = 0 through 9 */
|
|
|
|
/* all other characters are returned immediately */
|
|
|
|
|
|
|
|
int c;
|
|
|
|
|
|
|
|
while( (c=getchar()) == \' \' ) { /* skip blanks */ }
|
|
|
|
|
|
|
|
/* c is now nonblank */
|
|
|
|
|
|
|
|
if( islower( c ) ) {
|
|
|
|
yylval = c \- \'a\';
|
|
|
|
return ( LETTER );
|
|
|
|
}
|
|
|
|
if( isdigit( c ) ) {
|
|
|
|
yylval = c \- \'0\';
|
|
|
|
return( DIGIT );
|
|
|
|
}
|
|
|
|
return( c );
|
|
|
|
}
|
|
|
|
.fi
|
|
|
|
.bp
|