%{ #include #include "stable.h" NODE *tree; extern int lineno,yydebug; /*extern eprint();*/ int debug,vtype,vsz,arsz; %} /* Leaf types first */ %token INT 1 %token CHAR 2 %token FLOAT 3 /* operators =<>+-&|* /%^!~,?:;()[]{} */ %token ASG 4 /* = */ %token EQU 5 /* == */ %token LT 6 /* < */ %token LEQU 7 /* <= */ %token GT 8 /* > */ %token GEQU 9 /* >= */ %token PLUS 10 /* + */ %token PLUSASG 11 /* += */ %token MINUS 12 /* - */ %token MINUSASG 13 /* -= */ %token BAND 14 /* & */ %token BANDASG 15 /* &= */ %token BOR 16 /* | */ %token BORASG 17 /* |= */ %token AST 18 /* * */ %token ASTASG 19 /* *= */ %token DIV 20 /* / */ %token DIVASG 21 /* /= */ %token MOD 22 /* % */ %token MODASG 23 /* %= */ %token BXOR 24 /* ^ */ %token BXORASG 25 /* ^= */ %token LNOT 26 /* ! */ %token NEQU 27 /* != */ %token BNOT 28 /* ~ */ %token COMMA 29 /* , */ %token QUEST 30 /* ? */ %token COLON 31 /* : */ %token SEMI 32 /* ; */ %token LPAR 33 /* ( */ %token RPAR 34 /* ) */ %token LBRK 35 /* [ */ %token RBRK 36 /* ] */ %token LBRC 37 /* { */ %token RBRC 38 /* } */ %token SHL 39 /* << */ %token SHLASG 40 /* <<= */ %token SHR 41 /* >> */ %token SHRASG 42 /* >>= */ %token INC 43 /* ++ */ %token DEC 44 /* -- */ %token LAND 45 /* && */ %token LOR 46 /* || */ %token ID 47 %token STR 48 %token CONST 49 %token CONTINUE 50 %token BREAK 51 %token DEFAULT 52 %token CASE 53 %token RETURN 54 %token NULST 55 /* Unary types next */ %token UN 56 /* - */ %token FUNC 57 /* Others are binary of don't care */ %token EXTERN 58 %token IF 60 %token ELSE 61 %token WHILE 62 %token FOR 63 %token FOR1 64 %token FOR2 65 %token DO 66 %token SWITCH 67 %token INDEX 68 %token FID 69 %token LASTTOK 70 %% start : source ; source : source decl | source funct | ; decl : type ilst SEMI ; type : INT | CHAR | FLOAT ; farray : LBRK CONST RBRK | LBRK RBRK | ; ptrtype : AST | ; ilst : ilst COMMA ilst1 | ilst1 ; ilst1 : ptrtype ID farray init ; init : ASG CS | ASG LBRC lst RBRC | ; lst : lst COMMA CS | CS ; CS : CONST | STR | ID ; funct : ID LPAR plst0 RPAR LBRC ldecls stp RBRC ; plst0 : plst0 COMMA plst1 | plst1 | ; plst1 : type ptrtype ID parray ; parray : LBRK RBRK | ; ldlst : ldlst type llst SEMI | type llst SEMI ; ldecls : ldlst | ; llst : llst COMMA llst1 | llst1 ; llst1 : ptrtype ID farray init ; explst : explst COMMA exp | exp ; arglst : explst | ; nexp : exp | ; stl : st | LBRC stp RBRC ; nstp : stp | ; stp : stp st | st ; st : RETURN SEMI | RETURN LPAR exp RPAR SEMI | CONTINUE SEMI | BREAK SEMI | IF LPAR exp RPAR stl opelse | WHILE LPAR exp RPAR stl | DO LBRC stl RBRC WHILE LPAR exp RPAR | FOR LPAR asnst SEMI nexp SEMI asnst1 RPAR stl | SWITCH LPAR exp RPAR LBRC swstl RBRC | asnst SEMI | exp SEMI | SEMI ; asnst : lval ASG exp | lval PLUSASG exp | lval MINUSASG exp | lval BANDASG exp | lval BORASG exp | lval DIVASG exp | lval MODASG exp | lval ASTASG exp | lval SHLASG exp | lval SHRASG exp ; asnst1 : asnst | exp ; opelse : ELSE stl | ; swstl : swstl swst | swst ; swst : CASE CONST COLON nstp | DEFAULT COLON nstp ; exp : exp QUEST exp COLON exp | lor ; lor : lor LOR land | land ; land : land LAND bor | bor ; bor : bor BOR eor | eor ; eor : eor BXOR band | band ; band : band BAND eqal | eqal ; eqal : eqal EQU rel | eqal NEQU rel | rel ; rel : rel LT shft | rel GT shft | rel LEQU shft | rel GEQU shft | shft ; shft : shft SHL add | shft SHR add | add ; add : add PLUS mul | add MINUS mul | mul ; mul : mul AST unary | mul DIV unary | mul MOD unary | unary ; unary : LPAR exp RPAR | un2 | STR ; un2 : BAND lval1 | MINUS un1 | BNOT un1 | LNOT un1 | un1 ; un1 : func | CONST ; func : lval1 LPAR arglst RPAR | lval ; lval : INC lval | DEC lval | AST lval | lval1 ; lval1 : ID LBRK exp RBRK | ID ; %% yyerror(s) char *s; { fprintf(stderr,"ERROR:Line %u:%s\n",lineno,s); exit(1); } yywarn(s) char *s; { fprintf(stderr,"WARNING:Line %u:%s\n",lineno,s); exit(1); } main(argc,argv) int argc; char *argv[]; { if(argc>1) debug=atoi(argv[1]); else debug=0; if(debug&2)yydebug=1; yyparse(); /* fwalk(tree,eprint,0);*/ }