diff options
Diffstat (limited to 'parser.y')
-rw-r--r-- | parser.y | 29 |
1 files changed, 21 insertions, 8 deletions
@@ -16,7 +16,7 @@ void yyerror(const char *msg) #define MKARGVALUE(v) (struct argument) { .type = ARG_INTEGER, .value = (v) } #define MKARGLABEL(l) (struct argument) { .type = ARG_LABEL, .label = (l) } #define MKARGTYPE(t) (struct argument) { .type = (t) } -#define MKARGEXPR(op,c) (struct argument) { .type = (op), .children = c } +#define MKARGEXPR(op,...) (struct argument) { .type = (op), .children = { __VA_ARGS__ } } %} @@ -87,8 +87,16 @@ void yyerror(const char *msg) %token T_OPERATOR_ADD "+" %token T_OPERATOR_SUB "-" +%token T_OPERATOR_MUL "*" +%token T_OPERATOR_DIV "/" %token T_OPERATOR_NOT "!" %token T_OPERATOR_INV "~" +%token T_LPAREN "(" +%token T_RPAREN ")" + +%left "-" "+" +%left "*" "/" +%precedence NEG %type <inst> inst %type <arg> reg @@ -184,13 +192,18 @@ reg: T_LABEL { } expr: - intlit { $$ = MKARGVALUE($1); } - | T_LABEL { $$ = MKARGLABEL($1); } - | "." { $$ = MKARGTYPE(ARG_PC); } - | "+" expr { $$ = MKARGEXPR(ARG_UNARY_ADD, { argdup(&$2) }); } - | "-" expr { $$ = MKARGEXPR(ARG_UNARY_SUB, { argdup(&$2) }); } - | "!" expr { $$ = MKARGEXPR(ARG_UNARY_NOT, { argdup(&$2) }); } - | "~" expr { $$ = MKARGEXPR(ARG_UNARY_INV, { argdup(&$2) }); } + intlit { $$ = MKARGVALUE($1); } + | T_LABEL { $$ = MKARGLABEL($1); } + | "." { $$ = MKARGTYPE(ARG_PC); } + | "+" expr %prec NEG { $$ = MKARGEXPR(ARG_UNARY_ADD, argdup(&$2)); } + | "-" expr %prec NEG { $$ = MKARGEXPR(ARG_UNARY_SUB, argdup(&$2)); } + | "!" expr %prec NEG { $$ = MKARGEXPR(ARG_UNARY_NOT, argdup(&$2)); } + | "~" expr %prec NEG { $$ = MKARGEXPR(ARG_UNARY_INV, argdup(&$2)); } + | expr "+" expr { $$ = MKARGEXPR(ARG_ADD, argdup(&$1), argdup(&$3)); } + | expr "-" expr { $$ = MKARGEXPR(ARG_SUB, argdup(&$1), argdup(&$3)); } + | expr "*" expr { $$ = MKARGEXPR(ARG_MUL, argdup(&$1), argdup(&$3)); } + | expr "/" expr { $$ = MKARGEXPR(ARG_DIV, argdup(&$1), argdup(&$3)); } + | "(" expr ")" { $$ = $2; } ; intlit: T_INT |