%{ #include #ifdef __cplusplus extern "C" { #endif int process_cmd(char *cmdhdr, int argc, ...); void yyerror(char *s); int yylex(void); int yyparse(void); int yywrap(void); %} %union { unsigned long expr; char *string; } %token CMDHDR0 CMDHDR1 CMDHDR2 CMDHDR3 CMDHDR4 CMDHDR5 CMDBEAGLE SUBCMD0 SUBCMD1 SUBCMD2 SUBCMD3 FILENAME CMDTOPAZ %token NUMBER %token LSHIFT RSHIFT %left '-' '+' %left '*' '/' %nonassoc UMINUS %type expression %% command: CMDHDR0 { process_cmd($1,0); } | CMDHDR1 expression { process_cmd($1,1,$2); } | CMDHDR2 expression expression { process_cmd($1,2,$2,$3); } | CMDHDR3 expression expression expression { process_cmd($1,3,$2,$3,$4);} | CMDHDR4 expression expression expression expression { process_cmd($1,4,$2,$3,$4,$5);} | CMDHDR5 expression expression expression expression expression { process_cmd($1,4,$2,$3,$4,$5,$6);} expression: expression '+' expression { $$ = $1 + $3; } | expression '-' expression { $$ = $1 - $3; } | expression '*' expression { $$ = $1 * $3; } | expression '/' expression { if ($3 == 0.0) yyerror("divide by zero"); else $$ = $1 / $3; } | expression LSHIFT expression { $$ = $1 << $3; } | expression RSHIFT expression { $$ = $1 >> $3; } | '-' expression %prec UMINUS { $$ = -$2; } | '(' expression ')' { $$ = $2; } | NUMBER ; %% void yyerror(char *s) { fprintf(stderr,"%s\n",s); } int yywrap() { return(1); } #ifdef __cplusplus } #endif