]> granicus.if.org Git - yasm/commitdiff
Add expr_contains_float() and symrec_get_equ() functions. These are the first
authorPeter Johnson <peter@tortall.net>
Fri, 12 Oct 2001 02:34:30 +0000 (02:34 -0000)
committerPeter Johnson <peter@tortall.net>
Fri, 12 Oct 2001 02:34:30 +0000 (02:34 -0000)
of many functions like this which will be needed for advanced validity checking
in the finalization of the parser stage.
Fix yacc grammar to not use the (incorrect) expr_no_fltstr, and change memexp
to memexpr and its handling to prepare for memory expressions.

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

16 files changed:
libyasm/expr.c
libyasm/expr.h
libyasm/symrec.c
libyasm/symrec.h
modules/arch/x86/expr.c
modules/arch/x86/x86expr.c
modules/parsers/nasm/bison.y.in
modules/parsers/nasm/nasm-bison.y
src/arch/x86/expr.c
src/arch/x86/x86expr.c
src/expr.c
src/expr.h
src/parsers/nasm/bison.y.in
src/parsers/nasm/nasm-bison.y
src/symrec.c
src/symrec.h

index 252065f738b874426ff4d93aa996c0a79ef8b433..077a45ab96684fe27b79dbf831b1c2aa75625a69 100644 (file)
@@ -142,6 +142,42 @@ ExprFloat(floatnum *f)
     return e;
 }
 
+int
+expr_contains_float(const expr *e)
+{
+    if (!e)
+       return 0;
+
+    switch (e->left.type) {
+       case EXPR_SYM:
+           if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+               return 1;
+           break;
+       case EXPR_EXPR:
+           if (expr_contains_float(e->left.data.expn))
+               return 1;
+           break;
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+
+    switch (e->right.type) {
+       case EXPR_SYM:
+           return expr_contains_float(symrec_get_equ(e->right.data.sym));
+       case EXPR_EXPR:
+           return expr_contains_float(e->right.data.expn);
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+    return 0;
+}
+
 /* get rid of unnecessary branches if possible.  report. */
 int
 expr_simplify(expr *e)
index 8adad2db4e546b7facae7607fa85ec09fb4f8f20..17b0a11a27d452381ae4ed4e6e7202f22418eeda 100644 (file)
@@ -88,6 +88,8 @@ ExprItem *ExprFloat(floatnum *);
 #define expr_new_ident(r) \
     expr_new ((ExprItem *)NULL, EXPR_IDENT, (r))
 
+int expr_contains_float(const expr *);
+
 int expr_simplify(expr *);
 void expr_print(expr *);
 
index d18f352e93eb2c6cdd3ba3c46abee3b15c04c551..1f800b2c0de18747be2db7b7b71652a4714ed587 100644 (file)
@@ -229,6 +229,14 @@ symrec_get_name(const symrec *sym)
     return sym->name;
 }
 
+const expr *
+symrec_get_equ(const symrec *sym)
+{
+    if (sym->type == SYM_EQU)
+       return sym->value.expn;
+    return (const expr *)NULL;
+}
+
 void
 symrec_print(const symrec *sym)
 {
index 2f136021e5f7ed1aadb744b1cc3f67a71880c878..de22e6fcf4f03851139b54010adc38d63f18e3d8 100644 (file)
@@ -67,6 +67,8 @@ int symrec_get_int_value(const symrec *sym, unsigned long *ret_val,
 
 const char *symrec_get_name(const symrec *sym);
 
+const expr *symrec_get_equ(const symrec *sym);
+
 int symrec_foreach(int (*func) (symrec *sym));
 
 void symrec_print(const symrec *sym);
index 252065f738b874426ff4d93aa996c0a79ef8b433..077a45ab96684fe27b79dbf831b1c2aa75625a69 100644 (file)
@@ -142,6 +142,42 @@ ExprFloat(floatnum *f)
     return e;
 }
 
+int
+expr_contains_float(const expr *e)
+{
+    if (!e)
+       return 0;
+
+    switch (e->left.type) {
+       case EXPR_SYM:
+           if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+               return 1;
+           break;
+       case EXPR_EXPR:
+           if (expr_contains_float(e->left.data.expn))
+               return 1;
+           break;
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+
+    switch (e->right.type) {
+       case EXPR_SYM:
+           return expr_contains_float(symrec_get_equ(e->right.data.sym));
+       case EXPR_EXPR:
+           return expr_contains_float(e->right.data.expn);
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+    return 0;
+}
+
 /* get rid of unnecessary branches if possible.  report. */
 int
 expr_simplify(expr *e)
index 252065f738b874426ff4d93aa996c0a79ef8b433..077a45ab96684fe27b79dbf831b1c2aa75625a69 100644 (file)
@@ -142,6 +142,42 @@ ExprFloat(floatnum *f)
     return e;
 }
 
+int
+expr_contains_float(const expr *e)
+{
+    if (!e)
+       return 0;
+
+    switch (e->left.type) {
+       case EXPR_SYM:
+           if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+               return 1;
+           break;
+       case EXPR_EXPR:
+           if (expr_contains_float(e->left.data.expn))
+               return 1;
+           break;
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+
+    switch (e->right.type) {
+       case EXPR_SYM:
+           return expr_contains_float(symrec_get_equ(e->right.data.sym));
+       case EXPR_EXPR:
+           return expr_contains_float(e->right.data.expn);
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+    return 0;
+}
+
 /* get rid of unnecessary branches if possible.  report. */
 int
 expr_simplify(expr *e)
index d246fe04854b30862718ec7af3afc52e9ac739a2..32ebf299881fab9f231914fb6823a0ef00d2d938 100644 (file)
@@ -111,13 +111,13 @@ static bytecode *nasm_parser_temp_bc;
 %type <bc> line lineexp exp instr instrbase
 
 %type <int_info> fpureg reg32 reg16 reg8 segreg
-%type <ea> mem memaddr memexp memfar
+%type <ea> mem memaddr memfar
 %type <ea> mem8x mem16x mem32x mem64x mem80x mem128x
 %type <ea> mem8 mem16 mem32 mem64 mem80 mem128 mem1632
 %type <ea> rm8x rm16x rm32x /*rm64x rm128x*/
 %type <ea> rm8 rm16 rm32 rm64 rm128
 %type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> expr expr_no_string expr_no_fltstr
+%type <exp> expr expr_no_string memexpr
 %type <sym> explabel
 %type <str_val> label_id
 %type <tgt_val> target
@@ -154,10 +154,10 @@ line: '\n'                { $$ = (bytecode *)NULL; }
 ;
 
 lineexp: exp
-    | TIMES expr_no_fltstr exp         { $$ = $3; SetBCMultiple($$, $2); }
+    | TIMES expr exp                   { $$ = $3; SetBCMultiple($$, $2); }
     | label                            { $$ = (bytecode *)NULL; }
     | label exp                                { $$ = $2; }
-    | label TIMES expr_no_fltstr exp   { $$ = $4; SetBCMultiple($$, $3); }
+    | label TIMES expr exp             { $$ = $4; SetBCMultiple($$, $3); }
     | label_id EQU expr                        {
        symrec_define_equ($1, $3);
        $$ = (bytecode *)NULL;
@@ -166,7 +166,7 @@ lineexp: exp
 
 exp: instr
     | DECLARE_DATA datavals        { $$ = bytecode_new_data(&$2, $1); }
-    | RESERVE_SPACE expr_no_fltstr  { $$ = bytecode_new_reserve($2, $1); }
+    | RESERVE_SPACE expr           { $$ = bytecode_new_reserve($2, $1); }
 ;
 
 datavals: dataval          {
@@ -265,10 +265,10 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-memexp: expr   { $$ = effaddr_new_expr($1); }
+memexpr: expr
 ;
 
-memaddr: memexp                    { $$ = $1; SetEASegment($$, 0); }
+memaddr: memexpr           { $$ = effaddr_new_expr($1); SetEASegment($$, 0); }
     | REG_CS ':' memaddr    { $$ = $3; SetEASegment($$, 0x2E); }
     | REG_SS ':' memaddr    { $$ = $3; SetEASegment($$, 0x36); }
     | REG_DS ':' memaddr    { $$ = $3; SetEASegment($$, 0x3E); }
@@ -387,17 +387,14 @@ imm32: imm
 ;
 
 /* jump targets */
-target: expr_no_fltstr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
+target: expr           { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
     | SHORT target     { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
     | NEAR target      { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
 ;
 
 /* expression trees */
-expr_no_string: expr_no_fltstr
+expr_no_string: INTNUM         { $$ = expr_new_ident(ExprInt($1)); }
     | FLTNUM                   { $$ = expr_new_ident(ExprFloat($1)); }
-;
-
-expr_no_fltstr: INTNUM         { $$ = expr_new_ident(ExprInt($1)); }
     | explabel                 { $$ = expr_new_ident(ExprSym($1)); }
     /*| expr '||' expr         { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
     | expr '|' expr            { $$ = expr_new_tree($1, EXPR_OR, $3); }
index d246fe04854b30862718ec7af3afc52e9ac739a2..32ebf299881fab9f231914fb6823a0ef00d2d938 100644 (file)
@@ -111,13 +111,13 @@ static bytecode *nasm_parser_temp_bc;
 %type <bc> line lineexp exp instr instrbase
 
 %type <int_info> fpureg reg32 reg16 reg8 segreg
-%type <ea> mem memaddr memexp memfar
+%type <ea> mem memaddr memfar
 %type <ea> mem8x mem16x mem32x mem64x mem80x mem128x
 %type <ea> mem8 mem16 mem32 mem64 mem80 mem128 mem1632
 %type <ea> rm8x rm16x rm32x /*rm64x rm128x*/
 %type <ea> rm8 rm16 rm32 rm64 rm128
 %type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> expr expr_no_string expr_no_fltstr
+%type <exp> expr expr_no_string memexpr
 %type <sym> explabel
 %type <str_val> label_id
 %type <tgt_val> target
@@ -154,10 +154,10 @@ line: '\n'                { $$ = (bytecode *)NULL; }
 ;
 
 lineexp: exp
-    | TIMES expr_no_fltstr exp         { $$ = $3; SetBCMultiple($$, $2); }
+    | TIMES expr exp                   { $$ = $3; SetBCMultiple($$, $2); }
     | label                            { $$ = (bytecode *)NULL; }
     | label exp                                { $$ = $2; }
-    | label TIMES expr_no_fltstr exp   { $$ = $4; SetBCMultiple($$, $3); }
+    | label TIMES expr exp             { $$ = $4; SetBCMultiple($$, $3); }
     | label_id EQU expr                        {
        symrec_define_equ($1, $3);
        $$ = (bytecode *)NULL;
@@ -166,7 +166,7 @@ lineexp: exp
 
 exp: instr
     | DECLARE_DATA datavals        { $$ = bytecode_new_data(&$2, $1); }
-    | RESERVE_SPACE expr_no_fltstr  { $$ = bytecode_new_reserve($2, $1); }
+    | RESERVE_SPACE expr           { $$ = bytecode_new_reserve($2, $1); }
 ;
 
 datavals: dataval          {
@@ -265,10 +265,10 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-memexp: expr   { $$ = effaddr_new_expr($1); }
+memexpr: expr
 ;
 
-memaddr: memexp                    { $$ = $1; SetEASegment($$, 0); }
+memaddr: memexpr           { $$ = effaddr_new_expr($1); SetEASegment($$, 0); }
     | REG_CS ':' memaddr    { $$ = $3; SetEASegment($$, 0x2E); }
     | REG_SS ':' memaddr    { $$ = $3; SetEASegment($$, 0x36); }
     | REG_DS ':' memaddr    { $$ = $3; SetEASegment($$, 0x3E); }
@@ -387,17 +387,14 @@ imm32: imm
 ;
 
 /* jump targets */
-target: expr_no_fltstr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
+target: expr           { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
     | SHORT target     { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
     | NEAR target      { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
 ;
 
 /* expression trees */
-expr_no_string: expr_no_fltstr
+expr_no_string: INTNUM         { $$ = expr_new_ident(ExprInt($1)); }
     | FLTNUM                   { $$ = expr_new_ident(ExprFloat($1)); }
-;
-
-expr_no_fltstr: INTNUM         { $$ = expr_new_ident(ExprInt($1)); }
     | explabel                 { $$ = expr_new_ident(ExprSym($1)); }
     /*| expr '||' expr         { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
     | expr '|' expr            { $$ = expr_new_tree($1, EXPR_OR, $3); }
index 252065f738b874426ff4d93aa996c0a79ef8b433..077a45ab96684fe27b79dbf831b1c2aa75625a69 100644 (file)
@@ -142,6 +142,42 @@ ExprFloat(floatnum *f)
     return e;
 }
 
+int
+expr_contains_float(const expr *e)
+{
+    if (!e)
+       return 0;
+
+    switch (e->left.type) {
+       case EXPR_SYM:
+           if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+               return 1;
+           break;
+       case EXPR_EXPR:
+           if (expr_contains_float(e->left.data.expn))
+               return 1;
+           break;
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+
+    switch (e->right.type) {
+       case EXPR_SYM:
+           return expr_contains_float(symrec_get_equ(e->right.data.sym));
+       case EXPR_EXPR:
+           return expr_contains_float(e->right.data.expn);
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+    return 0;
+}
+
 /* get rid of unnecessary branches if possible.  report. */
 int
 expr_simplify(expr *e)
index 252065f738b874426ff4d93aa996c0a79ef8b433..077a45ab96684fe27b79dbf831b1c2aa75625a69 100644 (file)
@@ -142,6 +142,42 @@ ExprFloat(floatnum *f)
     return e;
 }
 
+int
+expr_contains_float(const expr *e)
+{
+    if (!e)
+       return 0;
+
+    switch (e->left.type) {
+       case EXPR_SYM:
+           if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+               return 1;
+           break;
+       case EXPR_EXPR:
+           if (expr_contains_float(e->left.data.expn))
+               return 1;
+           break;
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+
+    switch (e->right.type) {
+       case EXPR_SYM:
+           return expr_contains_float(symrec_get_equ(e->right.data.sym));
+       case EXPR_EXPR:
+           return expr_contains_float(e->right.data.expn);
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+    return 0;
+}
+
 /* get rid of unnecessary branches if possible.  report. */
 int
 expr_simplify(expr *e)
index 252065f738b874426ff4d93aa996c0a79ef8b433..077a45ab96684fe27b79dbf831b1c2aa75625a69 100644 (file)
@@ -142,6 +142,42 @@ ExprFloat(floatnum *f)
     return e;
 }
 
+int
+expr_contains_float(const expr *e)
+{
+    if (!e)
+       return 0;
+
+    switch (e->left.type) {
+       case EXPR_SYM:
+           if (expr_contains_float(symrec_get_equ(e->left.data.sym)))
+               return 1;
+           break;
+       case EXPR_EXPR:
+           if (expr_contains_float(e->left.data.expn))
+               return 1;
+           break;
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+
+    switch (e->right.type) {
+       case EXPR_SYM:
+           return expr_contains_float(symrec_get_equ(e->right.data.sym));
+       case EXPR_EXPR:
+           return expr_contains_float(e->right.data.expn);
+       case EXPR_FLOAT:
+           return 1;
+       case EXPR_INT:
+       case EXPR_NONE:
+           break;
+    }
+    return 0;
+}
+
 /* get rid of unnecessary branches if possible.  report. */
 int
 expr_simplify(expr *e)
index 8adad2db4e546b7facae7607fa85ec09fb4f8f20..17b0a11a27d452381ae4ed4e6e7202f22418eeda 100644 (file)
@@ -88,6 +88,8 @@ ExprItem *ExprFloat(floatnum *);
 #define expr_new_ident(r) \
     expr_new ((ExprItem *)NULL, EXPR_IDENT, (r))
 
+int expr_contains_float(const expr *);
+
 int expr_simplify(expr *);
 void expr_print(expr *);
 
index d246fe04854b30862718ec7af3afc52e9ac739a2..32ebf299881fab9f231914fb6823a0ef00d2d938 100644 (file)
@@ -111,13 +111,13 @@ static bytecode *nasm_parser_temp_bc;
 %type <bc> line lineexp exp instr instrbase
 
 %type <int_info> fpureg reg32 reg16 reg8 segreg
-%type <ea> mem memaddr memexp memfar
+%type <ea> mem memaddr memfar
 %type <ea> mem8x mem16x mem32x mem64x mem80x mem128x
 %type <ea> mem8 mem16 mem32 mem64 mem80 mem128 mem1632
 %type <ea> rm8x rm16x rm32x /*rm64x rm128x*/
 %type <ea> rm8 rm16 rm32 rm64 rm128
 %type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> expr expr_no_string expr_no_fltstr
+%type <exp> expr expr_no_string memexpr
 %type <sym> explabel
 %type <str_val> label_id
 %type <tgt_val> target
@@ -154,10 +154,10 @@ line: '\n'                { $$ = (bytecode *)NULL; }
 ;
 
 lineexp: exp
-    | TIMES expr_no_fltstr exp         { $$ = $3; SetBCMultiple($$, $2); }
+    | TIMES expr exp                   { $$ = $3; SetBCMultiple($$, $2); }
     | label                            { $$ = (bytecode *)NULL; }
     | label exp                                { $$ = $2; }
-    | label TIMES expr_no_fltstr exp   { $$ = $4; SetBCMultiple($$, $3); }
+    | label TIMES expr exp             { $$ = $4; SetBCMultiple($$, $3); }
     | label_id EQU expr                        {
        symrec_define_equ($1, $3);
        $$ = (bytecode *)NULL;
@@ -166,7 +166,7 @@ lineexp: exp
 
 exp: instr
     | DECLARE_DATA datavals        { $$ = bytecode_new_data(&$2, $1); }
-    | RESERVE_SPACE expr_no_fltstr  { $$ = bytecode_new_reserve($2, $1); }
+    | RESERVE_SPACE expr           { $$ = bytecode_new_reserve($2, $1); }
 ;
 
 datavals: dataval          {
@@ -265,10 +265,10 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-memexp: expr   { $$ = effaddr_new_expr($1); }
+memexpr: expr
 ;
 
-memaddr: memexp                    { $$ = $1; SetEASegment($$, 0); }
+memaddr: memexpr           { $$ = effaddr_new_expr($1); SetEASegment($$, 0); }
     | REG_CS ':' memaddr    { $$ = $3; SetEASegment($$, 0x2E); }
     | REG_SS ':' memaddr    { $$ = $3; SetEASegment($$, 0x36); }
     | REG_DS ':' memaddr    { $$ = $3; SetEASegment($$, 0x3E); }
@@ -387,17 +387,14 @@ imm32: imm
 ;
 
 /* jump targets */
-target: expr_no_fltstr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
+target: expr           { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
     | SHORT target     { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
     | NEAR target      { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
 ;
 
 /* expression trees */
-expr_no_string: expr_no_fltstr
+expr_no_string: INTNUM         { $$ = expr_new_ident(ExprInt($1)); }
     | FLTNUM                   { $$ = expr_new_ident(ExprFloat($1)); }
-;
-
-expr_no_fltstr: INTNUM         { $$ = expr_new_ident(ExprInt($1)); }
     | explabel                 { $$ = expr_new_ident(ExprSym($1)); }
     /*| expr '||' expr         { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
     | expr '|' expr            { $$ = expr_new_tree($1, EXPR_OR, $3); }
index d246fe04854b30862718ec7af3afc52e9ac739a2..32ebf299881fab9f231914fb6823a0ef00d2d938 100644 (file)
@@ -111,13 +111,13 @@ static bytecode *nasm_parser_temp_bc;
 %type <bc> line lineexp exp instr instrbase
 
 %type <int_info> fpureg reg32 reg16 reg8 segreg
-%type <ea> mem memaddr memexp memfar
+%type <ea> mem memaddr memfar
 %type <ea> mem8x mem16x mem32x mem64x mem80x mem128x
 %type <ea> mem8 mem16 mem32 mem64 mem80 mem128 mem1632
 %type <ea> rm8x rm16x rm32x /*rm64x rm128x*/
 %type <ea> rm8 rm16 rm32 rm64 rm128
 %type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> expr expr_no_string expr_no_fltstr
+%type <exp> expr expr_no_string memexpr
 %type <sym> explabel
 %type <str_val> label_id
 %type <tgt_val> target
@@ -154,10 +154,10 @@ line: '\n'                { $$ = (bytecode *)NULL; }
 ;
 
 lineexp: exp
-    | TIMES expr_no_fltstr exp         { $$ = $3; SetBCMultiple($$, $2); }
+    | TIMES expr exp                   { $$ = $3; SetBCMultiple($$, $2); }
     | label                            { $$ = (bytecode *)NULL; }
     | label exp                                { $$ = $2; }
-    | label TIMES expr_no_fltstr exp   { $$ = $4; SetBCMultiple($$, $3); }
+    | label TIMES expr exp             { $$ = $4; SetBCMultiple($$, $3); }
     | label_id EQU expr                        {
        symrec_define_equ($1, $3);
        $$ = (bytecode *)NULL;
@@ -166,7 +166,7 @@ lineexp: exp
 
 exp: instr
     | DECLARE_DATA datavals        { $$ = bytecode_new_data(&$2, $1); }
-    | RESERVE_SPACE expr_no_fltstr  { $$ = bytecode_new_reserve($2, $1); }
+    | RESERVE_SPACE expr           { $$ = bytecode_new_reserve($2, $1); }
 ;
 
 datavals: dataval          {
@@ -265,10 +265,10 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-memexp: expr   { $$ = effaddr_new_expr($1); }
+memexpr: expr
 ;
 
-memaddr: memexp                    { $$ = $1; SetEASegment($$, 0); }
+memaddr: memexpr           { $$ = effaddr_new_expr($1); SetEASegment($$, 0); }
     | REG_CS ':' memaddr    { $$ = $3; SetEASegment($$, 0x2E); }
     | REG_SS ':' memaddr    { $$ = $3; SetEASegment($$, 0x36); }
     | REG_DS ':' memaddr    { $$ = $3; SetEASegment($$, 0x3E); }
@@ -387,17 +387,14 @@ imm32: imm
 ;
 
 /* jump targets */
-target: expr_no_fltstr { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
+target: expr           { $$.val = $1; SetOpcodeSel(&$$.op_sel, JR_NONE); }
     | SHORT target     { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_SHORT_FORCED); }
     | NEAR target      { $$ = $2; SetOpcodeSel(&$$.op_sel, JR_NEAR_FORCED); }
 ;
 
 /* expression trees */
-expr_no_string: expr_no_fltstr
+expr_no_string: INTNUM         { $$ = expr_new_ident(ExprInt($1)); }
     | FLTNUM                   { $$ = expr_new_ident(ExprFloat($1)); }
-;
-
-expr_no_fltstr: INTNUM         { $$ = expr_new_ident(ExprInt($1)); }
     | explabel                 { $$ = expr_new_ident(ExprSym($1)); }
     /*| expr '||' expr         { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
     | expr '|' expr            { $$ = expr_new_tree($1, EXPR_OR, $3); }
index d18f352e93eb2c6cdd3ba3c46abee3b15c04c551..1f800b2c0de18747be2db7b7b71652a4714ed587 100644 (file)
@@ -229,6 +229,14 @@ symrec_get_name(const symrec *sym)
     return sym->name;
 }
 
+const expr *
+symrec_get_equ(const symrec *sym)
+{
+    if (sym->type == SYM_EQU)
+       return sym->value.expn;
+    return (const expr *)NULL;
+}
+
 void
 symrec_print(const symrec *sym)
 {
index 2f136021e5f7ed1aadb744b1cc3f67a71880c878..de22e6fcf4f03851139b54010adc38d63f18e3d8 100644 (file)
@@ -67,6 +67,8 @@ int symrec_get_int_value(const symrec *sym, unsigned long *ret_val,
 
 const char *symrec_get_name(const symrec *sym);
 
+const expr *symrec_get_equ(const symrec *sym);
+
 int symrec_foreach(int (*func) (symrec *sym));
 
 void symrec_print(const symrec *sym);