Annotation of 43BSDReno/share/doc/ps1/15.yacc/ssa, revision 1.1.1.1

1.1       root        1: .\"    @(#)ssa 6.1 (Berkeley) 5/8/86
                      2: .\"
                      3: .SH
                      4: Appendix A:  A Simple Example
                      5: .PP
                      6: This example gives the complete Yacc specification for a small desk calculator;
                      7: the desk calculator has 26 registers, labeled ``a'' through ``z'', and accepts
                      8: arithmetic expressions made up of the operators +, \-, *, /,
                      9: % (mod operator), & (bitwise and), | (bitwise or), and assignment.
                     10: If an expression at the top level is an assignment, the value is not
                     11: printed; otherwise it is.
                     12: As in C, an integer that begins with 0 (zero) is assumed to be octal;
                     13: otherwise, it is assumed to be decimal.
                     14: .PP
                     15: As an example of a Yacc specification, the desk calculator
                     16: does a reasonable job of showing how precedences and ambiguities
                     17: are used, and demonstrating simple error recovery.
                     18: The major oversimplifications are that the
                     19: lexical analysis phase is much simpler than for most applications, and the
                     20: output is produced immediately, line by line.
                     21: Note the way that decimal and octal integers are read in by the grammar rules;
                     22: This job is probably better done by the lexical analyzer.
                     23: .sp
                     24: .nf
                     25: .ta .5i 1i 1.5i 2i 2.5i
                     26: 
                     27: %{
                     28: #  include  <stdio.h>
                     29: #  include  <ctype.h>
                     30: 
                     31: int  regs[26];
                     32: int  base;
                     33: 
                     34: %}
                     35: 
                     36: %start  list
                     37: 
                     38: %token  DIGIT  LETTER
                     39: 
                     40: %left  \'|\'
                     41: %left  \'&\'
                     42: %left  \'+\'  \'\-\'
                     43: %left  \'*\'  \'/\'  \'%\'
                     44: %left  UMINUS      /*  supplies  precedence  for  unary  minus  */
                     45: 
                     46: %%      /*  beginning  of  rules  section  */
                     47: 
                     48: list   :       /*  empty  */
                     49:        |       list  stat  \'\en\'
                     50:        |       list  error  \'\en\'
                     51:                        {       yyerrok;  }
                     52:        ;
                     53: 
                     54: stat   :       expr
                     55:                        {       printf( "%d\en", $1 );  }
                     56:        |       LETTER  \'=\'  expr
                     57:                        {       regs[$1]  =  $3;  }
                     58:        ;
                     59: 
                     60: expr   :       \'(\'  expr  \')\'
                     61:                        {       $$  =  $2;  }
                     62:        |       expr  \'+\'  expr
                     63:                        {       $$  =  $1  +  $3;  }
                     64:        |       expr  \'\-\'  expr
                     65:                        {       $$  =  $1  \-  $3;  }
                     66:        |       expr  \'*\'  expr
                     67:                        {       $$  =  $1  *  $3;  }
                     68:        |       expr  \'/\'  expr
                     69:                        {       $$  =  $1  /  $3;  }
                     70:        |       expr  \'%\'  expr
                     71:                        {       $$  =  $1  %  $3;  }
                     72:        |       expr  \'&\'  expr
                     73:                        {       $$  =  $1  &  $3;  }
                     74:        |       expr  \'|\'  expr
                     75:                        {       $$  =  $1  |  $3;  }
                     76:        |       \'\-\'  expr        %prec  UMINUS
                     77:                        {       $$  =  \-  $2;  }
                     78:        |       LETTER
                     79:                        {       $$  =  regs[$1];  }
                     80:        |       number          
                     81:        ;
                     82: 
                     83: number :       DIGIT
                     84:                        {       $$ = $1;    base  =  ($1==0)  ?  8  :  10;  }
                     85:        |       number  DIGIT
                     86:                        {       $$  =  base * $1  +  $2;  }
                     87:        ;
                     88: 
                     89: %%      /*  start  of  programs  */
                     90: 
                     91: yylex() {              /*  lexical  analysis  routine  */
                     92:               /*  returns  LETTER  for  a  lower  case  letter,  yylval = 0  through  25  */
                     93:               /*  return  DIGIT  for  a  digit,  yylval = 0  through  9  */
                     94:               /*  all  other  characters  are  returned  immediately  */
                     95: 
                     96:        int  c;
                     97: 
                     98:        while(  (c=getchar())  ==  \' \'  )  {  /*  skip  blanks  */  }
                     99: 
                    100:        /*  c  is  now  nonblank  */
                    101: 
                    102:        if(  islower(  c  )  )  {       
                    103:                yylval  =  c  \-  \'a\';
                    104:                return  (  LETTER  );
                    105:                }
                    106:        if(  isdigit(  c  )  )  {       
                    107:                yylval  =  c  \-  \'0\';
                    108:                return(  DIGIT  );
                    109:                }
                    110:        return(  c  );
                    111:        }
                    112: .fi
                    113: .bp

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.