//%define parse.error verbose
%token ASSIGN BCLOSE BINAND BINOR BOOL BOPEN CCLOSE CHAR COMMA CONS COPEN
-%token DIVIDE ELSE IDENT IF INTEGER INVERSE MINUS MODULO NIL PLUS POWER RETURN
-%token SEMICOLON TIMES VAR WHILE
+%token DIVIDE DOT ELSE IDENT IF INTEGER INVERSE MINUS MODULO NIL PLUS POWER
+%token RETURN SEMICOLON TIMES VAR WHILE
%parse-param { struct ast **result }
| RETURN SEMICOLON { $$ = ast_return(NULL); }
;
+field
+ : { $$ = NULL; }
+ | field DOT IDENT { $$ = ast_cons($3, $1); }
+
expr
: expr BINOR expr { $$ = ast_binop($1, binor, $3); }
| expr BINAND expr { $$ = ast_binop($1, binand, $3); }
| expr MODULO expr { $$ = ast_binop($1, modulo, $3); }
| expr POWER expr { $$ = ast_binop($1, power, $3); }
| MINUS expr { $$ = ast_unop(negate, $2); }
- | INVERSE expr { $$ = ast_unop(inverse, $2); }
+ | INVERSE expr %prec TIMES { $$ = ast_unop(inverse, $2); }
| BOPEN expr BCLOSE { $$ = $2; }
| IDENT BOPEN fargs BCLOSE { $$ = ast_funcall($1, ast_list($3)); }
| INTEGER
| BOOL
| CHAR
- | IDENT
+ | IDENT field { $$ = ast_ident($1, ast_list($2)); }
| NIL { $$ = ast_nil(); }
;