aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2012-04-26 18:19:00 +0000
committerDimitri Sokolyuk <demon@dim13.org>2012-04-26 18:19:00 +0000
commit83442d261889e93d9385769697c81290c52a5502 (patch)
treea2fa63f0f498fbaefa0b36614e1d33d654e49719
parent721d81db60bffed314b2ec12ff6e83bc8b910a0a (diff)
more expressions
-rw-r--r--gramar.y21
-rw-r--r--lexer.l10
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 <ival> NUMBER
%token <sval> STRING QSTRING
%type <ival> 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;