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 '.'
-%left '+' '-'
-%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
;
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 '.' ass_right {
$$ = tree_malloc(ST_OP);
- $$->pt.op.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;
}