]> granicus.if.org Git - yasm/commitdiff
Handle EQU. Handle BITS directive. Move directive handling out to separate
authorPeter Johnson <peter@tortall.net>
Thu, 11 Oct 2001 17:33:30 +0000 (17:33 -0000)
committerPeter Johnson <peter@tortall.net>
Thu, 11 Oct 2001 17:33:30 +0000 (17:33 -0000)
function.

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

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

index e44fcf456b57adf1390ff2a82ce62df8ff12afb9..7848ae8a5594af58900e82367558ecf0169d268f 100644 (file)
@@ -55,6 +55,7 @@ RCSID("$IdPath$");
 void init_table(void);
 extern int nasm_parser_lex(void);
 void nasm_parser_error(const char *);
+static void nasm_parser_directive(const char *name, const char *val);
 
 extern objfmt *nasm_parser_objfmt;
 extern sectionhead nasm_parser_sections;
@@ -144,6 +145,12 @@ input: /* empty */
 
 line: '\n'             { $$ = (bytecode *)NULL; }
     | exp '\n'
+    | label            { $$ = (bytecode *)NULL; }
+    | label exp                { $$ = $2; }
+    | label_id EQU expr        {
+       symrec_define_equ($1, $3);
+       $$ = (bytecode *)NULL;
+    }
     | directive '\n'   { $$ = (bytecode *)NULL; }
     | error '\n'       {
        Error(_("label or instruction expected at start of line"));
@@ -155,8 +162,6 @@ line: '\n'          { $$ = (bytecode *)NULL; }
 exp: instr
     | DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
     | RESERVE_SPACE expr    { $$ = bytecode_new_reserve($2, $1); }
-    | label exp                    { $$ = $2; }
-    | label                { $$ = (bytecode *)NULL; }
 ;
 
 datavals: dataval          {
@@ -197,15 +202,7 @@ label_id: ID           {
 
 /* directives */
 directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']'        {
-       if (strcasecmp($2, "section") == 0) {
-           nasm_parser_cur_section = sections_switch(&nasm_parser_sections,
-                                                     nasm_parser_objfmt, $3);
-           nasm_parser_prev_bc = (bytecode *)NULL;
-           symrec_define_label($3, nasm_parser_cur_section, (bytecode *)NULL,
-                               1);
-       } else {
-           printf("Directive: Name='%s' Value='%s'\n", $2, $3);
-       }
+       nasm_parser_directive($2, $3);
     }
     | '[' DIRECTIVE_NAME DIRECTIVE_VAL error   {
        Error(_("missing `%c'"), ']');
@@ -459,6 +456,28 @@ instr: instrbase
 
 %%
 
+static void
+nasm_parser_directive(const char *name, const char *val)
+{
+    long lval;
+    char *end;
+
+    if (strcasecmp(name, "section") == 0) {
+       nasm_parser_cur_section = sections_switch(&nasm_parser_sections,
+                                                 nasm_parser_objfmt, val);
+       nasm_parser_prev_bc = (bytecode *)NULL;
+       symrec_define_label(val, nasm_parser_cur_section, (bytecode *)NULL, 1);
+    } else if (strcasecmp(name, "bits") == 0) {
+       lval = strtol(val, &end, 10);
+       if (*val == '\0' || *end != '\0' || (lval != 16 && lval != 32))
+           Error(_("`%s' is not a valid argument to [BITS]"), val);
+       else
+           mode_bits = (unsigned char)lval;
+    } else {
+       printf("Directive: Name=`%s' Value=`%s'\n", name, val);
+    }
+}
+
 void
 nasm_parser_error(const char *s)
 {
index e44fcf456b57adf1390ff2a82ce62df8ff12afb9..7848ae8a5594af58900e82367558ecf0169d268f 100644 (file)
@@ -55,6 +55,7 @@ RCSID("$IdPath$");
 void init_table(void);
 extern int nasm_parser_lex(void);
 void nasm_parser_error(const char *);
+static void nasm_parser_directive(const char *name, const char *val);
 
 extern objfmt *nasm_parser_objfmt;
 extern sectionhead nasm_parser_sections;
@@ -144,6 +145,12 @@ input: /* empty */
 
 line: '\n'             { $$ = (bytecode *)NULL; }
     | exp '\n'
+    | label            { $$ = (bytecode *)NULL; }
+    | label exp                { $$ = $2; }
+    | label_id EQU expr        {
+       symrec_define_equ($1, $3);
+       $$ = (bytecode *)NULL;
+    }
     | directive '\n'   { $$ = (bytecode *)NULL; }
     | error '\n'       {
        Error(_("label or instruction expected at start of line"));
@@ -155,8 +162,6 @@ line: '\n'          { $$ = (bytecode *)NULL; }
 exp: instr
     | DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
     | RESERVE_SPACE expr    { $$ = bytecode_new_reserve($2, $1); }
-    | label exp                    { $$ = $2; }
-    | label                { $$ = (bytecode *)NULL; }
 ;
 
 datavals: dataval          {
@@ -197,15 +202,7 @@ label_id: ID           {
 
 /* directives */
 directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']'        {
-       if (strcasecmp($2, "section") == 0) {
-           nasm_parser_cur_section = sections_switch(&nasm_parser_sections,
-                                                     nasm_parser_objfmt, $3);
-           nasm_parser_prev_bc = (bytecode *)NULL;
-           symrec_define_label($3, nasm_parser_cur_section, (bytecode *)NULL,
-                               1);
-       } else {
-           printf("Directive: Name='%s' Value='%s'\n", $2, $3);
-       }
+       nasm_parser_directive($2, $3);
     }
     | '[' DIRECTIVE_NAME DIRECTIVE_VAL error   {
        Error(_("missing `%c'"), ']');
@@ -459,6 +456,28 @@ instr: instrbase
 
 %%
 
+static void
+nasm_parser_directive(const char *name, const char *val)
+{
+    long lval;
+    char *end;
+
+    if (strcasecmp(name, "section") == 0) {
+       nasm_parser_cur_section = sections_switch(&nasm_parser_sections,
+                                                 nasm_parser_objfmt, val);
+       nasm_parser_prev_bc = (bytecode *)NULL;
+       symrec_define_label(val, nasm_parser_cur_section, (bytecode *)NULL, 1);
+    } else if (strcasecmp(name, "bits") == 0) {
+       lval = strtol(val, &end, 10);
+       if (*val == '\0' || *end != '\0' || (lval != 16 && lval != 32))
+           Error(_("`%s' is not a valid argument to [BITS]"), val);
+       else
+           mode_bits = (unsigned char)lval;
+    } else {
+       printf("Directive: Name=`%s' Value=`%s'\n", name, val);
+    }
+}
+
 void
 nasm_parser_error(const char *s)
 {
index e44fcf456b57adf1390ff2a82ce62df8ff12afb9..7848ae8a5594af58900e82367558ecf0169d268f 100644 (file)
@@ -55,6 +55,7 @@ RCSID("$IdPath$");
 void init_table(void);
 extern int nasm_parser_lex(void);
 void nasm_parser_error(const char *);
+static void nasm_parser_directive(const char *name, const char *val);
 
 extern objfmt *nasm_parser_objfmt;
 extern sectionhead nasm_parser_sections;
@@ -144,6 +145,12 @@ input: /* empty */
 
 line: '\n'             { $$ = (bytecode *)NULL; }
     | exp '\n'
+    | label            { $$ = (bytecode *)NULL; }
+    | label exp                { $$ = $2; }
+    | label_id EQU expr        {
+       symrec_define_equ($1, $3);
+       $$ = (bytecode *)NULL;
+    }
     | directive '\n'   { $$ = (bytecode *)NULL; }
     | error '\n'       {
        Error(_("label or instruction expected at start of line"));
@@ -155,8 +162,6 @@ line: '\n'          { $$ = (bytecode *)NULL; }
 exp: instr
     | DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
     | RESERVE_SPACE expr    { $$ = bytecode_new_reserve($2, $1); }
-    | label exp                    { $$ = $2; }
-    | label                { $$ = (bytecode *)NULL; }
 ;
 
 datavals: dataval          {
@@ -197,15 +202,7 @@ label_id: ID           {
 
 /* directives */
 directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']'        {
-       if (strcasecmp($2, "section") == 0) {
-           nasm_parser_cur_section = sections_switch(&nasm_parser_sections,
-                                                     nasm_parser_objfmt, $3);
-           nasm_parser_prev_bc = (bytecode *)NULL;
-           symrec_define_label($3, nasm_parser_cur_section, (bytecode *)NULL,
-                               1);
-       } else {
-           printf("Directive: Name='%s' Value='%s'\n", $2, $3);
-       }
+       nasm_parser_directive($2, $3);
     }
     | '[' DIRECTIVE_NAME DIRECTIVE_VAL error   {
        Error(_("missing `%c'"), ']');
@@ -459,6 +456,28 @@ instr: instrbase
 
 %%
 
+static void
+nasm_parser_directive(const char *name, const char *val)
+{
+    long lval;
+    char *end;
+
+    if (strcasecmp(name, "section") == 0) {
+       nasm_parser_cur_section = sections_switch(&nasm_parser_sections,
+                                                 nasm_parser_objfmt, val);
+       nasm_parser_prev_bc = (bytecode *)NULL;
+       symrec_define_label(val, nasm_parser_cur_section, (bytecode *)NULL, 1);
+    } else if (strcasecmp(name, "bits") == 0) {
+       lval = strtol(val, &end, 10);
+       if (*val == '\0' || *end != '\0' || (lval != 16 && lval != 32))
+           Error(_("`%s' is not a valid argument to [BITS]"), val);
+       else
+           mode_bits = (unsigned char)lval;
+    } else {
+       printf("Directive: Name=`%s' Value=`%s'\n", name, val);
+    }
+}
+
 void
 nasm_parser_error(const char *s)
 {
index e44fcf456b57adf1390ff2a82ce62df8ff12afb9..7848ae8a5594af58900e82367558ecf0169d268f 100644 (file)
@@ -55,6 +55,7 @@ RCSID("$IdPath$");
 void init_table(void);
 extern int nasm_parser_lex(void);
 void nasm_parser_error(const char *);
+static void nasm_parser_directive(const char *name, const char *val);
 
 extern objfmt *nasm_parser_objfmt;
 extern sectionhead nasm_parser_sections;
@@ -144,6 +145,12 @@ input: /* empty */
 
 line: '\n'             { $$ = (bytecode *)NULL; }
     | exp '\n'
+    | label            { $$ = (bytecode *)NULL; }
+    | label exp                { $$ = $2; }
+    | label_id EQU expr        {
+       symrec_define_equ($1, $3);
+       $$ = (bytecode *)NULL;
+    }
     | directive '\n'   { $$ = (bytecode *)NULL; }
     | error '\n'       {
        Error(_("label or instruction expected at start of line"));
@@ -155,8 +162,6 @@ line: '\n'          { $$ = (bytecode *)NULL; }
 exp: instr
     | DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
     | RESERVE_SPACE expr    { $$ = bytecode_new_reserve($2, $1); }
-    | label exp                    { $$ = $2; }
-    | label                { $$ = (bytecode *)NULL; }
 ;
 
 datavals: dataval          {
@@ -197,15 +202,7 @@ label_id: ID           {
 
 /* directives */
 directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']'        {
-       if (strcasecmp($2, "section") == 0) {
-           nasm_parser_cur_section = sections_switch(&nasm_parser_sections,
-                                                     nasm_parser_objfmt, $3);
-           nasm_parser_prev_bc = (bytecode *)NULL;
-           symrec_define_label($3, nasm_parser_cur_section, (bytecode *)NULL,
-                               1);
-       } else {
-           printf("Directive: Name='%s' Value='%s'\n", $2, $3);
-       }
+       nasm_parser_directive($2, $3);
     }
     | '[' DIRECTIVE_NAME DIRECTIVE_VAL error   {
        Error(_("missing `%c'"), ']');
@@ -459,6 +456,28 @@ instr: instrbase
 
 %%
 
+static void
+nasm_parser_directive(const char *name, const char *val)
+{
+    long lval;
+    char *end;
+
+    if (strcasecmp(name, "section") == 0) {
+       nasm_parser_cur_section = sections_switch(&nasm_parser_sections,
+                                                 nasm_parser_objfmt, val);
+       nasm_parser_prev_bc = (bytecode *)NULL;
+       symrec_define_label(val, nasm_parser_cur_section, (bytecode *)NULL, 1);
+    } else if (strcasecmp(name, "bits") == 0) {
+       lval = strtol(val, &end, 10);
+       if (*val == '\0' || *end != '\0' || (lval != 16 && lval != 32))
+           Error(_("`%s' is not a valid argument to [BITS]"), val);
+       else
+           mode_bits = (unsigned char)lval;
+    } else {
+       printf("Directive: Name=`%s' Value=`%s'\n", name, val);
+    }
+}
+
 void
 nasm_parser_error(const char *s)
 {