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}
;
%%