C.6.1 YACCµÄÔ´³ÌÐòÀý1
¡¡¡¡%{
¡¡¡¡#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 ¡ä\n¡ä
¡¡¡¡¡¡¡¡|list error ¡ä\n¡ä
¡¡¡¡¡¡¡¡¡¡¡¡{ yyerrok ; }
¡¡¡¡¡¡¡¡;
¡¡¡¡stat:expr
¡¡¡¡¡¡¡¡¡¡¡¡{ printf("%d£Ü£î",$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() {
¡¡¡¡¡¡¡¡/* lexcial analysis routine */
¡¡¡¡¡¡¡¡/* return DIGIT for a digit, yylval=0
¡¡¡¡¡¡¡¡¡¡ through 9 */
¡¡¡¡¡¡¡¡/* return LETTER for a lower case letter,
¡¡¡¡¡¡¡¡¡¡ yylval=0 through 25 */
¡¡¡¡¡¡¡¡/* 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);
¡¡¡¡}
|