From 83442d261889e93d9385769697c81290c52a5502 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 26 Apr 2012 18:19:00 +0000 Subject: more expressions --- gramar.y | 21 ++++++++++++++++++--- lexer.l | 10 +++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/gramar.y b/gramar.y index 2045f9c..f28244f 100644 --- a/gramar.y +++ b/gramar.y @@ -69,15 +69,21 @@ struct label { %token NOP BRK DAT ORG %token JSR HCF INT IAG IAS IAP IAQ HWN HWQ HWI %token LBR RBR LBRACE RBRACE LPAR RPAR -%token COMMA DP PLUS MINUS MULT +%token COMMA DP +%token PLUS MINUS EMUL EDIV EMOD ENOT EXOR EAND EOR SHIFTL SHIFTR %token DOT HASH MACRO INCLUDE %token NUMBER %token STRING QSTRING %type register opcode operand expr extended noop +%left EOR +%left EXOR +%left EAND +%left SHIFTL SHIFTR %left PLUS MINUS -%left MULT +%left EMUL EDIV EMOD +%left ENOT UMINUS %% @@ -128,9 +134,18 @@ expr yyerror("integer too big"); $$ = $1; } + | MINUS expr %prec UMINUS { $$ = -$2; } + | ENOT expr { $$ = ~$2; } | expr PLUS expr { $$ = $1 + $3; } | expr MINUS expr { $$ = $1 - $3; } - | expr MULT expr { $$ = $1 * $3; } + | expr EMUL expr { $$ = $1 * $3; } + | expr EDIV expr { $$ = $3 ? $1 / $3 : 0; } + | expr EMOD expr { $$ = $1 % $3; } + | expr EXOR expr { $$ = $1 ^ $3; } + | expr EAND expr { $$ = $1 & $3; } + | expr EOR expr { $$ = $1 | $3; } + | expr SHIFTL expr { $$ = $1 << $3; } + | expr SHIFTR expr { $$ = $1 >> $3; } | LPAR expr RPAR { $$ = $2; } ; diff --git a/lexer.l b/lexer.l index 1619da4..606074d 100644 --- a/lexer.l +++ b/lexer.l @@ -99,7 +99,15 @@ DEC [0-9]+ "+" return PLUS; "-" return MINUS; -"*" return MULT; +"*" return EMUL; +"/" return EDIV; +"%" return EMOD; +"~" return ENOT; +"^" return EXOR; +"&" return EAND; +"|" return EOR; +"<<" return SHIFTL; +">>" return SHIFTR; "," return COMMA; ":" return DP; "[" return LBR; -- cgit v1.2.3