summaryrefslogtreecommitdiff
path: root/igdbg.yacc.y
blob: 956c7e3ecab0bd3610195f1682b08f6721b3762f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
%{
#include <stdio.h>

#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 <string> CMDHDR0 CMDHDR1 CMDHDR2 CMDHDR3 CMDHDR4 CMDHDR5 CMDBEAGLE SUBCMD0 SUBCMD1 SUBCMD2 SUBCMD3 FILENAME CMDTOPAZ
%token <expr> NUMBER 
%token LSHIFT RSHIFT
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS

%type <expr> 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