]> granicus.if.org Git - yasm/commitdiff
Add unary precedence to some of the expression rules.
authorPeter Johnson <peter@tortall.net>
Wed, 11 Jul 2001 21:04:58 +0000 (21:04 -0000)
committerPeter Johnson <peter@tortall.net>
Wed, 11 Jul 2001 21:04:58 +0000 (21:04 -0000)
Add '+' as a unary operator.
Change target to use expr instead of just explabel.

svn path=/trunk/yasm/; revision=126

modules/parsers/nasm/bison.y.in
modules/parsers/nasm/nasm-bison.y
src/bison.y.in
src/parsers/nasm/bison.y.in
src/parsers/nasm/nasm-bison.y

index 410862b656d99702a05fbbd996960c9e978e6fa8..5a4accf58c2dea68821b79cf3d8433774f94b934 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.20 2001/07/11 04:07:10 peter Exp $
+/* $Id: bison.y.in,v 1.21 2001/07/11 21:04:58 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -70,7 +70,6 @@ extern void yyerror(char *);
 %token <int_val> REG_AL REG_CL REG_DL REG_BL REG_AH REG_CH REG_DH REG_BH
 %token <int_val> REG_ES REG_CS REG_SS REG_DS REG_FS REG_GS
 %token LEFT_OP RIGHT_OP SIGNDIV SIGNMOD
-%token START_SECTION_OFFSET ENTRY_POINT
 %token <syminfo> ID LOCAL_ID SPECIAL_ID
 
 /* instruction tokens (dynamically generated) */
@@ -97,8 +96,8 @@ extern void yyerror(char *);
 %left '&'
 %left LEFT_OP RIGHT_OP
 %left '-' '+'
-%left '*' '/' '%'
-%nonassoc '~'
+%left '*' '/' SIGNDIV '%' SIGNMOD
+%nonassoc UNARYOP
 
 %%
 input: /* empty */
@@ -307,10 +306,7 @@ imm32: imm
 ;
 
 /* jump targets */
-target: explabel       {
-       $$.val = expr_new_ident(EXPR_SYM, ExprSym(sym_use_get($1.name, SYM_LABEL)));
-       $$.op_sel = JR_NONE;
-    }
+target: expr           { $$.val = $1; $$.op_sel = JR_NONE; }
     | SHORT target     { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
     | NEAR target      { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
 ;
@@ -337,9 +333,10 @@ expr:
     | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
     | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
     | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    | '+' expr %prec UNARYOP   { $$ = $2; }
+    | '-' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NEG, $2); }
     /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '~' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NOT, $2); }
     | '(' expr ')'     { $$ = $2; }
 ;
 
index ccd537a3937dca84cb82734606b062a1c149dc3b..364f84cf7b149000ba9d54038745b0fff9179a57 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.20 2001/07/11 04:07:10 peter Exp $
+/* $Id: nasm-bison.y,v 1.21 2001/07/11 21:04:58 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -70,7 +70,6 @@ extern void yyerror(char *);
 %token <int_val> REG_AL REG_CL REG_DL REG_BL REG_AH REG_CH REG_DH REG_BH
 %token <int_val> REG_ES REG_CS REG_SS REG_DS REG_FS REG_GS
 %token LEFT_OP RIGHT_OP SIGNDIV SIGNMOD
-%token START_SECTION_OFFSET ENTRY_POINT
 %token <syminfo> ID LOCAL_ID SPECIAL_ID
 
 /* instruction tokens (dynamically generated) */
@@ -97,8 +96,8 @@ extern void yyerror(char *);
 %left '&'
 %left LEFT_OP RIGHT_OP
 %left '-' '+'
-%left '*' '/' '%'
-%nonassoc '~'
+%left '*' '/' SIGNDIV '%' SIGNMOD
+%nonassoc UNARYOP
 
 %%
 input: /* empty */
@@ -307,10 +306,7 @@ imm32: imm
 ;
 
 /* jump targets */
-target: explabel       {
-       $$.val = expr_new_ident(EXPR_SYM, ExprSym(sym_use_get($1.name, SYM_LABEL)));
-       $$.op_sel = JR_NONE;
-    }
+target: expr           { $$.val = $1; $$.op_sel = JR_NONE; }
     | SHORT target     { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
     | NEAR target      { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
 ;
@@ -337,9 +333,10 @@ expr:
     | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
     | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
     | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    | '+' expr %prec UNARYOP   { $$ = $2; }
+    | '-' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NEG, $2); }
     /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '~' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NOT, $2); }
     | '(' expr ')'     { $$ = $2; }
 ;
 
index 410862b656d99702a05fbbd996960c9e978e6fa8..5a4accf58c2dea68821b79cf3d8433774f94b934 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.20 2001/07/11 04:07:10 peter Exp $
+/* $Id: bison.y.in,v 1.21 2001/07/11 21:04:58 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -70,7 +70,6 @@ extern void yyerror(char *);
 %token <int_val> REG_AL REG_CL REG_DL REG_BL REG_AH REG_CH REG_DH REG_BH
 %token <int_val> REG_ES REG_CS REG_SS REG_DS REG_FS REG_GS
 %token LEFT_OP RIGHT_OP SIGNDIV SIGNMOD
-%token START_SECTION_OFFSET ENTRY_POINT
 %token <syminfo> ID LOCAL_ID SPECIAL_ID
 
 /* instruction tokens (dynamically generated) */
@@ -97,8 +96,8 @@ extern void yyerror(char *);
 %left '&'
 %left LEFT_OP RIGHT_OP
 %left '-' '+'
-%left '*' '/' '%'
-%nonassoc '~'
+%left '*' '/' SIGNDIV '%' SIGNMOD
+%nonassoc UNARYOP
 
 %%
 input: /* empty */
@@ -307,10 +306,7 @@ imm32: imm
 ;
 
 /* jump targets */
-target: explabel       {
-       $$.val = expr_new_ident(EXPR_SYM, ExprSym(sym_use_get($1.name, SYM_LABEL)));
-       $$.op_sel = JR_NONE;
-    }
+target: expr           { $$.val = $1; $$.op_sel = JR_NONE; }
     | SHORT target     { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
     | NEAR target      { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
 ;
@@ -337,9 +333,10 @@ expr:
     | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
     | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
     | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    | '+' expr %prec UNARYOP   { $$ = $2; }
+    | '-' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NEG, $2); }
     /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '~' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NOT, $2); }
     | '(' expr ')'     { $$ = $2; }
 ;
 
index 410862b656d99702a05fbbd996960c9e978e6fa8..5a4accf58c2dea68821b79cf3d8433774f94b934 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.20 2001/07/11 04:07:10 peter Exp $
+/* $Id: bison.y.in,v 1.21 2001/07/11 21:04:58 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -70,7 +70,6 @@ extern void yyerror(char *);
 %token <int_val> REG_AL REG_CL REG_DL REG_BL REG_AH REG_CH REG_DH REG_BH
 %token <int_val> REG_ES REG_CS REG_SS REG_DS REG_FS REG_GS
 %token LEFT_OP RIGHT_OP SIGNDIV SIGNMOD
-%token START_SECTION_OFFSET ENTRY_POINT
 %token <syminfo> ID LOCAL_ID SPECIAL_ID
 
 /* instruction tokens (dynamically generated) */
@@ -97,8 +96,8 @@ extern void yyerror(char *);
 %left '&'
 %left LEFT_OP RIGHT_OP
 %left '-' '+'
-%left '*' '/' '%'
-%nonassoc '~'
+%left '*' '/' SIGNDIV '%' SIGNMOD
+%nonassoc UNARYOP
 
 %%
 input: /* empty */
@@ -307,10 +306,7 @@ imm32: imm
 ;
 
 /* jump targets */
-target: explabel       {
-       $$.val = expr_new_ident(EXPR_SYM, ExprSym(sym_use_get($1.name, SYM_LABEL)));
-       $$.op_sel = JR_NONE;
-    }
+target: expr           { $$.val = $1; $$.op_sel = JR_NONE; }
     | SHORT target     { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
     | NEAR target      { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
 ;
@@ -337,9 +333,10 @@ expr:
     | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
     | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
     | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    | '+' expr %prec UNARYOP   { $$ = $2; }
+    | '-' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NEG, $2); }
     /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '~' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NOT, $2); }
     | '(' expr ')'     { $$ = $2; }
 ;
 
index ccd537a3937dca84cb82734606b062a1c149dc3b..364f84cf7b149000ba9d54038745b0fff9179a57 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.20 2001/07/11 04:07:10 peter Exp $
+/* $Id: nasm-bison.y,v 1.21 2001/07/11 21:04:58 peter Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -70,7 +70,6 @@ extern void yyerror(char *);
 %token <int_val> REG_AL REG_CL REG_DL REG_BL REG_AH REG_CH REG_DH REG_BH
 %token <int_val> REG_ES REG_CS REG_SS REG_DS REG_FS REG_GS
 %token LEFT_OP RIGHT_OP SIGNDIV SIGNMOD
-%token START_SECTION_OFFSET ENTRY_POINT
 %token <syminfo> ID LOCAL_ID SPECIAL_ID
 
 /* instruction tokens (dynamically generated) */
@@ -97,8 +96,8 @@ extern void yyerror(char *);
 %left '&'
 %left LEFT_OP RIGHT_OP
 %left '-' '+'
-%left '*' '/' '%'
-%nonassoc '~'
+%left '*' '/' SIGNDIV '%' SIGNMOD
+%nonassoc UNARYOP
 
 %%
 input: /* empty */
@@ -307,10 +306,7 @@ imm32: imm
 ;
 
 /* jump targets */
-target: explabel       {
-       $$.val = expr_new_ident(EXPR_SYM, ExprSym(sym_use_get($1.name, SYM_LABEL)));
-       $$.op_sel = JR_NONE;
-    }
+target: expr           { $$.val = $1; $$.op_sel = JR_NONE; }
     | SHORT target     { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
     | NEAR target      { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
 ;
@@ -337,9 +333,10 @@ expr:
     | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
     | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
     | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    | '+' expr %prec UNARYOP   { $$ = $2; }
+    | '-' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NEG, $2); }
     /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '~' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NOT, $2); }
     | '(' expr ')'     { $$ = $2; }
 ;