return new_3par_instr(OPC_CAT, left,
right, pref_var, where);
break;
+ case '+':
+ return new_3par_instr(OPC_PLUS, left,
+ right, pref_var, where);
+ break;
+ case '-':
+ return new_3par_instr(OPC_MINUS, left,
+ right, pref_var, where);
+ break;
+ case '*':
+ return new_3par_instr(OPC_MUL, left,
+ right, pref_var, where);
+ break;
+ case '/':
+ return new_3par_instr(OPC_DIV, left,
+ right, pref_var, where);
+ break;
default:
die("evaluate: got to default");
}
case OPC_GT:
printf("GT %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
break;
+ case OPC_LT:
+ printf("LT %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_LE:
+ printf("LE %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_GE:
+ printf("GE %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_RE:
+ printf("RE %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_NRE:
+ printf("NRE %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_NEQ:
+ printf("NEQ %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_EQ:
+ printf("EQ %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
case OPC_AND:
printf("AND %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
break;
+ case OPC_OR:
+ printf("OR %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_XOR:
+ printf("XOR %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_PLUS:
+ printf("PLUS %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_MINUS:
+ printf("MINUS %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_MUL:
+ printf("MUL %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_DIV:
+ printf("DIV %d %d %d\n", p->u.tpop.l, p->u.tpop.r, p->u.tpop.res);
+ break;
+ case OPC_NOT:
+ printf("NOT %d %d\n", p->u.dpop.par, p->u.dpop.res);
+ break;
case OPC_NOP:
puts("NOP");
break;
struct tree* tr;
}
+%right <n> '!'
%token <str> CONST
%token <n> NUM
%token <str> VAR
%nonassoc KW_ELSE
%left ARROW
%left <n> EQ NEQ GE LE '<' '>' RE NRE
-%left '='
+%left <n> '='
%left <n> '.'
%left <n> '+' '-'
%left <n> '*' '/'
%left <n> '|'
%left <n> '^'
%left <n> '&'
-%left <n> '!'
%type <tr> input
%type <tr> command
%type <tr> next
%type <tr> ass
%type <tr> ass_right
+%type <tr> ass_right_p
%type <tr> cif
%type <tr> arrow
%type <tr> cond
%type <n> rop
-%type <n> bop
%type <n> left
%type <n> right
%type <tr> leaves
;
ass:
- VAR '=' ass_right {
+ VAR '=' ass_right_p {
$$ = tree_malloc(ST_ASS);
$$->pt.ass.left = tree_malloc(ST_LEAF);
| KW_MAIL { $$ = K_MAIL; }
;
+ass_right_p: '(' ass_right ')' {$$ = $2; }
+ | ass_right {$$ = $1; }
+;
+
ass_right: leaves
- | ass_right bop ass_right {
+ | ass_right '.' ass_right {
+ $$ = tree_malloc(ST_OP);
+ $$->pt.op.op = $2;
+ $$->pt.op.left = $1;
+ $$->pt.op.right = $3;
+ }
+ | ass_right '+' ass_right {
+ $$ = tree_malloc(ST_OP);
+ $$->pt.op.op = $2;
+ $$->pt.op.left = $1;
+ $$->pt.op.right = $3;
+ }
+ | ass_right '-' ass_right {
+ $$ = tree_malloc(ST_OP);
+ $$->pt.op.op = $2;
+ $$->pt.op.left = $1;
+ $$->pt.op.right = $3;
+ }
+ | ass_right '*' ass_right {
+ $$ = tree_malloc(ST_OP);
+ $$->pt.op.op = $2;
+ $$->pt.op.left = $1;
+ $$->pt.op.right = $3;
+ }
+ | ass_right '/' ass_right {
$$ = tree_malloc(ST_OP);
$$->pt.op.op = $2;
$$->pt.op.left = $1;
$$->pt.op.right = $3;
}
-;
-
-bop: '.' {$$ = $1}
- | '+' {$$ = $1}
- | '-' {$$ = $1}
- | '*' {$$ = $1}
- | '/' {$$ = $1}
;
%%