/* ======================================================================== bisl.y - yacc code for BISL compiler Copyright 1996 Micah Beck / Simon D. Levy University of Tennessee All distributions of this product must include source code. Source code is not to be distributed in any modified form. Global routines: fatal_error - fatal error interceptor set_input - set parser input to specified file ======================================================================== */ %{ #include "bisl.h" %} /* ------------------------------------------------------------------------ Grammar ------------------------------------------------------------------------ */ /* *** members of this union are accessible as fields in yylval *** */ %union { char *name; /* for ID, FNAME */ int number; /* for INT */ POINT *point; /* for PNT */ NODE *node; /* for NOD */ BEXP *expr; /* for EXP */ CSTR *cstr; /* for CSR */ TUPL *tuple; /* for TUP */ } /* *** these are the non-terminals of the language *** */ %type PNT %type OID %type OIT %type NOD %type TUP %type RGN %type CSR %type EXP %type ANDEXP %type OREXP /* *** these are variable terminals *** */ %token ID %token STR %token FNAME %token URLID %token INT /* *** these are constant terminals *** */ %token COMMENT %token IMAGE %token SOUND %token URL %token STRING %token TEXT %token BACK %token LPAR %token RPAR %token COM %token CNSTR %token ARROW %token RECT %token CIRC %token DCLICK %token CLICK %token ROLL %token TOG %token GIFF %token PLACE %token SHOW %token HIDE %token AND %token OR %token XOR %token NOT %token ERROR /* used only for reporting non-token-character errors*/ %start program %% program : STMTL {return *yytext;} program : ERROR {;} STMTL : STMTL STMT {;} STMTL : STMT {;} STMT : COMMENT {;} STMT : ID ARROW TUP {add_tupl($1, $3);} STMT : ID CNSTR CSR {add_cstr($1, $3);} STMT : NOD RPAR {;} STMT : NOD COM EXP RPAR {constrain_node($1, $3);} NOD : IMAGE LPAR ID {$$ = make_image($3);} NOD : SOUND LPAR FNAME {$$ = make_sound($3);} NOD : BACK LPAR ID {$$ = make_back($3);} NOD : TEXT LPAR ID {$$ = make_text($3);} NOD : URL LPAR URLID {$$ = make_url($3);} TUP : GIFF LPAR FNAME RPAR {$$ = make_giff($3);} TUP : PLACE LPAR ID COM PNT RPAR {$$ = make_place($3, $5, 0);} TUP : PLACE LPAR ID COM PNT COM INT RPAR {$$ = make_place($3, $5, $7);} TUP : STRING LPAR STR COM OID COM OID COM OIT COM OID RPAR {$$ = make_string($3, $5, $7, $9, $11);} TUP : RGN RPAR {$$ = $1;} TUP : RGN COM ID RPAR {$$ = add_place($1, $3);} RGN : RECT LPAR PNT COM PNT {$$ = make_rect($3, $5);} RGN : CIRC LPAR PNT COM INT {$$ = make_circ($3, $5);} CSR : DCLICK LPAR ID RPAR {$$ =make_cstr1(c_Dclick,$3);} CSR : CLICK LPAR ID RPAR {$$ = make_cstr1(c_Click,$3);} CSR : ROLL LPAR ID RPAR {$$ = make_cstr1(c_Roll,$3);} CSR : TOG LPAR ID RPAR {$$ = make_cstr2(c_Tog, $3);} PNT : INT COM INT {$$ = make_point($1, $3);} OID : ID {$$ = $1;} OID : {$$ = 0;} OIT : INT {$$ = $1;} OIT : {$$ = 0;} /* *** Boolean expression parsing; reusable *** */ EXP : OREXP OR EXP {$$ = make_infix($1, $3, b_Or);} EXP : OREXP XOR EXP {$$ = make_infix( make_infix($1, make_prefix($3, b_Not), b_And), make_infix(make_prefix($1, b_Not), $3, b_And), b_Or);} EXP : OREXP {$$ = $1;} OREXP : ANDEXP AND OREXP {$$ = make_infix($1, $3, b_And);} OREXP : ANDEXP {$$ = $1;} ANDEXP : NOT ANDEXP {$$ = make_prefix($2, b_Not);} ANDEXP : LPAR EXP RPAR {$$ = $2;} ANDEXP : ID {$$ = make_terminal($1);} %% #include "lex.yy.c" /* ------------------------------------------------------------------------ lex / yacc stuff ------------------------------------------------------------------------ */ yywrap() { return 1; } yyerror(char *err) { fatal_error(err); } /* ------------------------------------------------------------------------ fatal_error - fatal error interceptor. Appends line number to error string and passes message along to platform-specific error handler. ------------------------------------------------------------------------ */ void fatal_error(char *what) { char msg[100]; sprintf(msg, "ERROR in line %d: %s", lineno, what); handle_error(msg); } /* fatal_error */ /* ------------------------------------------------------------------------ set_input - set parser input to specified file ------------------------------------------------------------------------ */ void set_input(FILE *fp) { yyin = fp; } /* set_input */