]> granicus.if.org Git - yasm/commitdiff
Reindent to match other code for the most part.
authorPeter Johnson <peter@tortall.net>
Sun, 16 Sep 2001 20:17:51 +0000 (20:17 -0000)
committerPeter Johnson <peter@tortall.net>
Sun, 16 Sep 2001 20:17:51 +0000 (20:17 -0000)
svn path=/trunk/yasm/; revision=167

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

index 2aca2981f51519e4b6b444d34e2db08ac3ce4d17..48f1433da623a72fee67396135a97b3d8a367cef 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.31 2001/09/16 19:47:21 peter Exp $
+/* $Id: bison.y.in,v 1.32 2001/09/16 20:17:51 peter Exp $
  * NASM-compatible bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -42,7 +42,7 @@
 #include "bytecode.h"
 #include "section.h"
 
-RCSID("$Id: bison.y.in,v 1.31 2001/09/16 19:47:21 peter Exp $");
+RCSID("$Id: bison.y.in,v 1.32 2001/09/16 20:17:51 peter Exp $");
 
 #define YYDEBUG 1
 
@@ -124,7 +124,7 @@ extern section *nasm_parser_cur_section;
 
 %%
 input: /* empty */
-    | input line {
+    | input line    {
        OutputError();
        OutputWarning();
        if ($2) {
@@ -138,10 +138,10 @@ input: /* empty */
     }
 ;
 
-line: '\n'     { $$ = (bytecode *)NULL; }
+line: '\n'             { $$ = (bytecode *)NULL; }
     | exp '\n'
-    | directive '\n' { $$ = (bytecode *)NULL; }
-    | error '\n' {
+    | directive '\n'   { $$ = (bytecode *)NULL; }
+    | error '\n'       {
        Error(_("label or instruction expected at start of line"));
        $$ = (bytecode *)NULL;
        yyerrok;
@@ -149,48 +149,48 @@ 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; }
+    | DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
+    | RESERVE_SPACE expr    { $$ = bytecode_new_reserve($2, $1); }
+    | label exp                    { $$ = $2; }
+    | label                { $$ = (bytecode *)NULL; }
 ;
 
-datavals: dataval              {
+datavals: dataval          {
        STAILQ_INIT(&$$);
        STAILQ_INSERT_TAIL(&$$, $1, link);
     }
-    | datavals ',' dataval     {
+    | datavals ',' dataval  {
        STAILQ_INSERT_TAIL(&$1, $3, link);
        $$ = $1;
     }
 ;
 
-dataval: expr_no_string                { $$ = dataval_new_expr($1); }
-    | FLTNUM                   { $$ = dataval_new_float($1); }
-    | STRING                   { $$ = dataval_new_string($1); }
-    | error                    {
+dataval: expr_no_string        { $$ = dataval_new_expr($1); }
+    | FLTNUM           { $$ = dataval_new_float($1); }
+    | STRING           { $$ = dataval_new_string($1); }
+    | error            {
        Error(_("expression syntax error"));
        $$ = (dataval *)NULL;
     }
 ;
 
-label: label_id { $1->value = 0; } /* TODO: calculate offset */
-    | label_id ':' { $1->value = 0; } /* TODO: calculate offset */
+label: label_id            { $1->value = 0; } /* TODO: add pointer to bytecode */
+    | label_id ':'  { $1->value = 0; } /* TODO: add pointer to bytecode */
 ;
 
-label_id: ID { $$ = locallabel_base = sym_def_get ($1.name, SYM_LABEL); }
-    | SPECIAL_ID { $$ = sym_def_get ($1.name, SYM_LABEL); }
-    | LOCAL_ID { $$ = sym_def_get ($1.name, SYM_LABEL); }
+label_id: ID       { $$ = locallabel_base = sym_def_get($1.name, SYM_LABEL); }
+    | SPECIAL_ID    { $$ = sym_def_get($1.name, SYM_LABEL); }
+    | LOCAL_ID     { $$ = sym_def_get($1.name, SYM_LABEL); }
 ;
 
 /* directives */
-directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']'        {
        printf("Directive: Name='%s' Value='%s'\n", $2, $3);
     }
-    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error   {
        Error(_("missing `%c'"), ']');
     }
-    | '[' DIRECTIVE_NAME error {
+    | '[' DIRECTIVE_NAME error                 {
        Error(_("missing argument to `%s'"), $2);
     }
 ;
@@ -243,22 +243,22 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-memexp: expr           { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
+memexp: expr   { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
 ;
 
-memaddr: memexp                        { $$ = $1; $$.segment = 0; }
-    | REG_CS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x2E); }
-    | REG_SS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x36); }
-    | REG_DS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x3E); }
-    | REG_ES ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x26); }
-    | REG_FS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x64); }
-    | REG_GS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x65); }
-    | BYTE memaddr             { $$ = $2; SetEALen(&$$, 1); }
-    | WORD memaddr             { $$ = $2; SetEALen(&$$, 2); }
-    | DWORD memaddr            { $$ = $2; SetEALen(&$$, 4); }
+memaddr: memexp                    { $$ = $1; $$.segment = 0; }
+    | REG_CS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x2E); }
+    | REG_SS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x36); }
+    | REG_DS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x3E); }
+    | REG_ES ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x26); }
+    | REG_FS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x64); }
+    | REG_GS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x65); }
+    | BYTE memaddr         { $$ = $2; SetEALen(&$$, 1); }
+    | WORD memaddr         { $$ = $2; SetEALen(&$$, 2); }
+    | DWORD memaddr        { $$ = $2; SetEALen(&$$, 4); }
 ;
 
-mem: '[' memaddr ']' { $$ = $2; }
+mem: '[' memaddr ']'   { $$ = $2; }
 ;
 
 /* explicit memory */
@@ -342,15 +342,15 @@ rm128: XMMREG     { (void)ConvertRegToEA(&$$, $1); }
 ;
 
 /* immediate values */
-imm: expr              { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
+imm: expr   { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
 ;
 
 /* explicit immediates */
-imm8x: BYTE imm        { $$ = $2; }
+imm8x: BYTE imm            { $$ = $2; }
 ;
-imm16x: WORD imm       { $$ = $2; }
+imm16x: WORD imm    { $$ = $2; }
 ;
-imm32x: DWORD imm      { $$ = $2; }
+imm32x: DWORD imm   { $$ = $2; }
 ;
 
 /* implicit immediates */
@@ -365,44 +365,52 @@ imm32: imm
 ;
 
 /* jump targets */
-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); }
+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); }
 ;
 
 /* expression trees */
-expr_no_string: INTNUM { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
-    | explabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
-    /*| expr '||' expr { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
-    | expr '|' expr    { $$ = expr_new_tree ($1, EXPR_OR, $3); }
-    | expr '^' expr    { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
-    /*| expr '&&' expr { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
-    | expr '&' expr    { $$ = expr_new_tree ($1, EXPR_AND, $3); }
-    /*| expr '==' expr { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
-    /*| expr '>' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| expr '<' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| expr '>=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| expr '<=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| expr '!=' expr { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
-    | expr LEFT_OP expr        { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
-    | expr RIGHT_OP expr       { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
-    | expr '+' expr    { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
-    | expr '-' expr    { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
-    | 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_no_string: INTNUM         { $$ = expr_new_ident(EXPR_NUM, ExprNum($1)); }
+    | explabel                 {
+       $$ = expr_new_ident(EXPR_SYM,
+                           ExprSym(sym_use_get($1.name, SYM_LABEL)));
+    }
+    /*| expr '||' expr         { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
+    | expr '|' expr            { $$ = expr_new_tree($1, EXPR_OR, $3); }
+    | expr '^' expr            { $$ = expr_new_tree($1, EXPR_XOR, $3); }
+    /*| expr '&&' expr         { $$ = expr_new_tree($1, EXPR_LAND, $3); }*/
+    | expr '&' expr            { $$ = expr_new_tree($1, EXPR_AND, $3); }
+    /*| expr '==' expr         { $$ = expr_new_tree($1, EXPR_EQUALS, $3); }*/
+    /*| expr '>' expr          { $$ = expr_new_tree($1, EXPR_GT, $3); }*/
+    /*| expr '<' expr          { $$ = expr_new_tree($1, EXPR_GT, $3); }*/
+    /*| expr '>=' expr         { $$ = expr_new_tree($1, EXPR_GE, $3); }*/
+    /*| expr '<=' expr         { $$ = expr_new_tree($1, EXPR_GE, $3); }*/
+    /*| expr '!=' expr         { $$ = expr_new_tree($1, EXPR_NE, $3); }*/
+    | expr LEFT_OP expr                { $$ = expr_new_tree($1, EXPR_SHL, $3); }
+    | expr RIGHT_OP expr       { $$ = expr_new_tree($1, EXPR_SHR, $3); }
+    | expr '+' expr            { $$ = expr_new_tree($1, EXPR_ADD, $3); }
+    | expr '-' expr            { $$ = expr_new_tree($1, EXPR_SUB, $3); }
+    | 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 %prec UNARYOP   { $$ = $2; }
-    | '-' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NEG, $2); }
-    /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NOT, $2); }
-    | '(' expr ')'     { $$ = $2; }
+    | '-' expr %prec UNARYOP   { $$ = expr_new_branch(EXPR_NEG, $2); }
+    /*| '!' expr               { $$ = expr_new_branch(EXPR_LNOT, $2); }*/
+    | '~' expr %prec UNARYOP   { $$ = expr_new_branch(EXPR_NOT, $2); }
+    | '(' expr ')'             { $$ = $2; }
 ;
 
 expr: expr_no_string
-    | STRING           { $$ = expr_new_ident (EXPR_NUM, ExprNum(ConvertCharConstToInt($1))); }
+    | STRING           {
+       $$ = expr_new_ident (EXPR_NUM, ExprNum(ConvertCharConstToInt($1)));
+    }
 ;
 
-explabel: ID | SPECIAL_ID | LOCAL_ID ;
+explabel: ID
+    | SPECIAL_ID
+    | LOCAL_ID
+;
 
 instr: instrbase
     | OPERSIZE instr   { $$ = $2; SetInsnOperSizeOverride($$, $1); }
@@ -430,10 +438,10 @@ ConvertCharConstToInt(char *cc)
     unsigned long retval = 0;
     size_t len = strlen(cc);
 
-    if(len > 4)
+    if (len > 4)
        Warning(_("character constant too large, ignoring trailing characters"));
 
-    switch(len) {
+    switch (len) {
        case 4:
            retval |= (unsigned long)cc[3];
            retval <<= 8;
index a232c1e80e34aa9f5d136fa83989308c98ab8a3a..490ec6bcd833e83486cf971e09cc617b1820f2d5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.31 2001/09/16 19:47:21 peter Exp $
+/* $Id: nasm-bison.y,v 1.32 2001/09/16 20:17:51 peter Exp $
  * NASM-compatible bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -42,7 +42,7 @@
 #include "bytecode.h"
 #include "section.h"
 
-RCSID("$Id: nasm-bison.y,v 1.31 2001/09/16 19:47:21 peter Exp $");
+RCSID("$Id: nasm-bison.y,v 1.32 2001/09/16 20:17:51 peter Exp $");
 
 #define YYDEBUG 1
 
@@ -124,7 +124,7 @@ extern section *nasm_parser_cur_section;
 
 %%
 input: /* empty */
-    | input line {
+    | input line    {
        OutputError();
        OutputWarning();
        if ($2) {
@@ -138,10 +138,10 @@ input: /* empty */
     }
 ;
 
-line: '\n'     { $$ = (bytecode *)NULL; }
+line: '\n'             { $$ = (bytecode *)NULL; }
     | exp '\n'
-    | directive '\n' { $$ = (bytecode *)NULL; }
-    | error '\n' {
+    | directive '\n'   { $$ = (bytecode *)NULL; }
+    | error '\n'       {
        Error(_("label or instruction expected at start of line"));
        $$ = (bytecode *)NULL;
        yyerrok;
@@ -149,48 +149,48 @@ 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; }
+    | DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
+    | RESERVE_SPACE expr    { $$ = bytecode_new_reserve($2, $1); }
+    | label exp                    { $$ = $2; }
+    | label                { $$ = (bytecode *)NULL; }
 ;
 
-datavals: dataval              {
+datavals: dataval          {
        STAILQ_INIT(&$$);
        STAILQ_INSERT_TAIL(&$$, $1, link);
     }
-    | datavals ',' dataval     {
+    | datavals ',' dataval  {
        STAILQ_INSERT_TAIL(&$1, $3, link);
        $$ = $1;
     }
 ;
 
-dataval: expr_no_string                { $$ = dataval_new_expr($1); }
-    | FLTNUM                   { $$ = dataval_new_float($1); }
-    | STRING                   { $$ = dataval_new_string($1); }
-    | error                    {
+dataval: expr_no_string        { $$ = dataval_new_expr($1); }
+    | FLTNUM           { $$ = dataval_new_float($1); }
+    | STRING           { $$ = dataval_new_string($1); }
+    | error            {
        Error(_("expression syntax error"));
        $$ = (dataval *)NULL;
     }
 ;
 
-label: label_id { $1->value = 0; } /* TODO: calculate offset */
-    | label_id ':' { $1->value = 0; } /* TODO: calculate offset */
+label: label_id            { $1->value = 0; } /* TODO: add pointer to bytecode */
+    | label_id ':'  { $1->value = 0; } /* TODO: add pointer to bytecode */
 ;
 
-label_id: ID { $$ = locallabel_base = sym_def_get ($1.name, SYM_LABEL); }
-    | SPECIAL_ID { $$ = sym_def_get ($1.name, SYM_LABEL); }
-    | LOCAL_ID { $$ = sym_def_get ($1.name, SYM_LABEL); }
+label_id: ID       { $$ = locallabel_base = sym_def_get($1.name, SYM_LABEL); }
+    | SPECIAL_ID    { $$ = sym_def_get($1.name, SYM_LABEL); }
+    | LOCAL_ID     { $$ = sym_def_get($1.name, SYM_LABEL); }
 ;
 
 /* directives */
-directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']'        {
        printf("Directive: Name='%s' Value='%s'\n", $2, $3);
     }
-    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error   {
        Error(_("missing `%c'"), ']');
     }
-    | '[' DIRECTIVE_NAME error {
+    | '[' DIRECTIVE_NAME error                 {
        Error(_("missing argument to `%s'"), $2);
     }
 ;
@@ -243,22 +243,22 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-memexp: expr           { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
+memexp: expr   { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
 ;
 
-memaddr: memexp                        { $$ = $1; $$.segment = 0; }
-    | REG_CS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x2E); }
-    | REG_SS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x36); }
-    | REG_DS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x3E); }
-    | REG_ES ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x26); }
-    | REG_FS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x64); }
-    | REG_GS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x65); }
-    | BYTE memaddr             { $$ = $2; SetEALen(&$$, 1); }
-    | WORD memaddr             { $$ = $2; SetEALen(&$$, 2); }
-    | DWORD memaddr            { $$ = $2; SetEALen(&$$, 4); }
+memaddr: memexp                    { $$ = $1; $$.segment = 0; }
+    | REG_CS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x2E); }
+    | REG_SS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x36); }
+    | REG_DS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x3E); }
+    | REG_ES ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x26); }
+    | REG_FS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x64); }
+    | REG_GS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x65); }
+    | BYTE memaddr         { $$ = $2; SetEALen(&$$, 1); }
+    | WORD memaddr         { $$ = $2; SetEALen(&$$, 2); }
+    | DWORD memaddr        { $$ = $2; SetEALen(&$$, 4); }
 ;
 
-mem: '[' memaddr ']' { $$ = $2; }
+mem: '[' memaddr ']'   { $$ = $2; }
 ;
 
 /* explicit memory */
@@ -342,15 +342,15 @@ rm128: XMMREG     { (void)ConvertRegToEA(&$$, $1); }
 ;
 
 /* immediate values */
-imm: expr              { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
+imm: expr   { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
 ;
 
 /* explicit immediates */
-imm8x: BYTE imm        { $$ = $2; }
+imm8x: BYTE imm            { $$ = $2; }
 ;
-imm16x: WORD imm       { $$ = $2; }
+imm16x: WORD imm    { $$ = $2; }
 ;
-imm32x: DWORD imm      { $$ = $2; }
+imm32x: DWORD imm   { $$ = $2; }
 ;
 
 /* implicit immediates */
@@ -365,44 +365,52 @@ imm32: imm
 ;
 
 /* jump targets */
-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); }
+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); }
 ;
 
 /* expression trees */
-expr_no_string: INTNUM { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
-    | explabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
-    /*| expr '||' expr { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
-    | expr '|' expr    { $$ = expr_new_tree ($1, EXPR_OR, $3); }
-    | expr '^' expr    { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
-    /*| expr '&&' expr { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
-    | expr '&' expr    { $$ = expr_new_tree ($1, EXPR_AND, $3); }
-    /*| expr '==' expr { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
-    /*| expr '>' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| expr '<' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| expr '>=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| expr '<=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| expr '!=' expr { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
-    | expr LEFT_OP expr        { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
-    | expr RIGHT_OP expr       { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
-    | expr '+' expr    { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
-    | expr '-' expr    { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
-    | 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_no_string: INTNUM         { $$ = expr_new_ident(EXPR_NUM, ExprNum($1)); }
+    | explabel                 {
+       $$ = expr_new_ident(EXPR_SYM,
+                           ExprSym(sym_use_get($1.name, SYM_LABEL)));
+    }
+    /*| expr '||' expr         { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
+    | expr '|' expr            { $$ = expr_new_tree($1, EXPR_OR, $3); }
+    | expr '^' expr            { $$ = expr_new_tree($1, EXPR_XOR, $3); }
+    /*| expr '&&' expr         { $$ = expr_new_tree($1, EXPR_LAND, $3); }*/
+    | expr '&' expr            { $$ = expr_new_tree($1, EXPR_AND, $3); }
+    /*| expr '==' expr         { $$ = expr_new_tree($1, EXPR_EQUALS, $3); }*/
+    /*| expr '>' expr          { $$ = expr_new_tree($1, EXPR_GT, $3); }*/
+    /*| expr '<' expr          { $$ = expr_new_tree($1, EXPR_GT, $3); }*/
+    /*| expr '>=' expr         { $$ = expr_new_tree($1, EXPR_GE, $3); }*/
+    /*| expr '<=' expr         { $$ = expr_new_tree($1, EXPR_GE, $3); }*/
+    /*| expr '!=' expr         { $$ = expr_new_tree($1, EXPR_NE, $3); }*/
+    | expr LEFT_OP expr                { $$ = expr_new_tree($1, EXPR_SHL, $3); }
+    | expr RIGHT_OP expr       { $$ = expr_new_tree($1, EXPR_SHR, $3); }
+    | expr '+' expr            { $$ = expr_new_tree($1, EXPR_ADD, $3); }
+    | expr '-' expr            { $$ = expr_new_tree($1, EXPR_SUB, $3); }
+    | 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 %prec UNARYOP   { $$ = $2; }
-    | '-' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NEG, $2); }
-    /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NOT, $2); }
-    | '(' expr ')'     { $$ = $2; }
+    | '-' expr %prec UNARYOP   { $$ = expr_new_branch(EXPR_NEG, $2); }
+    /*| '!' expr               { $$ = expr_new_branch(EXPR_LNOT, $2); }*/
+    | '~' expr %prec UNARYOP   { $$ = expr_new_branch(EXPR_NOT, $2); }
+    | '(' expr ')'             { $$ = $2; }
 ;
 
 expr: expr_no_string
-    | STRING           { $$ = expr_new_ident (EXPR_NUM, ExprNum(ConvertCharConstToInt($1))); }
+    | STRING           {
+       $$ = expr_new_ident (EXPR_NUM, ExprNum(ConvertCharConstToInt($1)));
+    }
 ;
 
-explabel: ID | SPECIAL_ID | LOCAL_ID ;
+explabel: ID
+    | SPECIAL_ID
+    | LOCAL_ID
+;
 
 instr: instrbase
     | OPERSIZE instr   { $$ = $2; SetInsnOperSizeOverride($$, $1); }
@@ -430,10 +438,10 @@ ConvertCharConstToInt(char *cc)
     unsigned long retval = 0;
     size_t len = strlen(cc);
 
-    if(len > 4)
+    if (len > 4)
        Warning(_("character constant too large, ignoring trailing characters"));
 
-    switch(len) {
+    switch (len) {
        case 4:
            retval |= (unsigned long)cc[3];
            retval <<= 8;
index 907ec60c81c6103dc9a44f108ff1520b6026da32..3327a6276a0037f9761a99d94857849f37dbb48d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: token.l.in,v 1.18 2001/09/16 19:47:21 peter Exp $
+/* $Id: token.l.in,v 1.19 2001/09/16 20:17:51 peter Exp $
  * NASM-compatible lex lexer
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -42,7 +42,7 @@
 
 #include "bison.h"
 
-RCSID("$Id: token.l.in,v 1.18 2001/09/16 19:47:21 peter Exp $");
+RCSID("$Id: token.l.in,v 1.19 2001/09/16 20:17:51 peter Exp $");
 
 #define yylval nasm_parser_lval
 
@@ -59,12 +59,16 @@ static char *strbuf = (char *)NULL;
 /* length of strbuf (including terminating NULL character) */
 static size_t strbuf_size = 0;
 
+/* last "base" label for local (.) labels */
+symrec *locallabel_base = (symrec *)NULL;
+
+/* current line number */
+int line_number;
+
 %}
 %option noyywrap
 %option nounput
 %option case-insensitive
-    symrec *locallabel_base = (symrec *)NULL;
-    int line_number;
 
 %x DIRECTIVE DIRECTIVE2
 
@@ -118,26 +122,26 @@ WS       [ \t\r]
     char endch = yytext[0];
 
     strbuf = malloc(STRBUF_ALLOC_SIZE);
-    if(!strbuf)
+    if (!strbuf)
        Fatal(FATAL_NOMEM);
 
     strbuf_size = STRBUF_ALLOC_SIZE;
     inch = input();
     count = 0;
-    while(inch != EOF && inch != endch && inch != '\n') {
+    while (inch != EOF && inch != endch && inch != '\n') {
        strbuf[count++] = inch;
-       if(count >= strbuf_size) {
+       if (count >= strbuf_size) {
            strbuf = realloc(strbuf, strbuf_size + STRBUF_ALLOC_SIZE);
-           if(!strbuf)
+           if (!strbuf)
                Fatal(FATAL_NOMEM);
            strbuf_size += STRBUF_ALLOC_SIZE;
        }
        inch = input();
     }
 
-    if(inch == '\n')
+    if (inch == '\n')
        Error(_("unterminated string"));
-    else if(inch == EOF)
+    else if (inch == EOF)
        Error(_("unexpected end of file in string"));
 
     strbuf[count] = '\0';
@@ -154,17 +158,18 @@ WS       [ \t\r]
 <DIRECTIVE2>\n     { BEGIN INITIAL; return '\n'; }
 <DIRECTIVE>{WS}+    ;
 <DIRECTIVE2>{WS}+   ;
+
 <DIRECTIVE>[a-z]+   {
     BEGIN DIRECTIVE2;
     yylval.str_val = strdup(yytext);
-    if(!yylval.str_val)
+    if (!yylval.str_val)
        Fatal(FATAL_NOMEM);
     return DIRECTIVE_NAME;
 }
     /* everything printable except for ' ', '[' and ']'. */
 <DIRECTIVE2>[!-@a-z\\^-`{|}~]+ {
     yylval.str_val = strdup(yytext);
-    if(!yylval.str_val)
+    if (!yylval.str_val)
        Fatal(FATAL_NOMEM);
     return DIRECTIVE_VAL;
 }
@@ -238,10 +243,10 @@ dr[0-367] { yylval.int_val = yytext[2]-'0'; return DRREG; }
 tr[3-7]                { yylval.int_val = yytext[2]-'0'; return TRREG; }
 
     /* floating point, MMX, and SSE registers */
-st0    { yylval.int_val = 0; return ST0; }
-st[1-7]        { yylval.int_val = yytext[2]-'0'; return FPUREG_NOTST0; }
-mm[0-7]        { yylval.int_val = yytext[2]-'0'; return MMXREG; }
-xmm[0-7]       { yylval.int_val = yytext[3]-'0'; return XMMREG; }
+st0        { yylval.int_val = 0; return ST0; }
+st[1-7]            { yylval.int_val = yytext[2]-'0'; return FPUREG_NOTST0; }
+mm[0-7]            { yylval.int_val = yytext[2]-'0'; return MMXREG; }
+xmm[0-7]    { yylval.int_val = yytext[3]-'0'; return XMMREG; }
 
     /* integer registers */
 eax    { yylval.int_val = 0; return REG_EAX; }
@@ -279,16 +284,18 @@ ds        { yylval.int_val = 3; return REG_DS; }
 fs     { yylval.int_val = 4; return REG_FS; }
 gs     { yylval.int_val = 5; return REG_GS; }
 
-"<<"   { return LEFT_OP; }
-">>"   { return RIGHT_OP; }
-"//"   { return SIGNDIV; }
-"%%"   { return SIGNMOD; }
+    /* operators */
+"<<"                   { return LEFT_OP; }
+">>"                   { return RIGHT_OP; }
+"//"                   { return SIGNDIV; }
+"%%"                   { return SIGNMOD; }
 [-+|^&*/%~():[\],]     { return yytext[0]; }
 
     /* special non-local ..@label and labels like ..start */
 $$|$|\.\.[a-z0-9_$#@~.?]+ {
-    yylval.syminfo.name = strdup (yytext);
-    if (yylval.syminfo.name == NULL) Fatal (FATAL_NOMEM);
+    yylval.syminfo.name = strdup(yytext);
+    if (!yylval.syminfo.name)
+       Fatal(FATAL_NOMEM);
     yylval.syminfo.line = line_number;
 
     return SPECIAL_ID;
@@ -296,20 +303,18 @@ $$|$|\.\.[a-z0-9_$#@~.?]+ {
 
     /* local label (.label) */
 \.[a-z0-9_$#@~?][a-z0-9_$#@~.?]* {
-    if (locallabel_base == NULL) 
-    {
-       Warning (_("no non-local label before `%s'"), yytext);
-       yylval.syminfo.name = strdup (yytext);
-       if (yylval.syminfo.name == NULL) Fatal (FATAL_NOMEM);
-    }
-    else
-    {
-       yylval.syminfo.name = malloc (strlen (yytext)
-                                 + strlen (locallabel_base->name)
-                                 + 1);
-       if (yylval.syminfo.name == NULL) Fatal (FATAL_NOMEM);
-       strcpy (yylval.syminfo.name, locallabel_base->name);
-       strcat (yylval.syminfo.name, yytext);
+    if (!locallabel_base) {
+       Warning(_("no non-local label before `%s'"), yytext);
+       yylval.syminfo.name = strdup(yytext);
+       if (!yylval.syminfo.name)
+           Fatal(FATAL_NOMEM);
+    } else {
+       yylval.syminfo.name = malloc(strlen(yytext) +
+                                    strlen(locallabel_base->name) + 1);
+       if (!yylval.syminfo.name)
+           Fatal(FATAL_NOMEM);
+       strcpy(yylval.syminfo.name, locallabel_base->name);
+       strcat(yylval.syminfo.name, yytext);
     }
     yylval.syminfo.line = line_number;
 
@@ -321,8 +326,9 @@ $$|$|\.\.[a-z0-9_$#@~.?]+ {
 
     /* label */
 [a-z_?][a-z0-9_$#@~.?]* {
-    yylval.syminfo.name = strdup (yytext);
-    if (yylval.syminfo.name == NULL) Fatal (FATAL_NOMEM);
+    yylval.syminfo.name = strdup(yytext);
+    if (!yylval.syminfo.name)
+       Fatal(FATAL_NOMEM);
     yylval.syminfo.line = line_number;
 
     return ID;
index 2aca2981f51519e4b6b444d34e2db08ac3ce4d17..48f1433da623a72fee67396135a97b3d8a367cef 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.31 2001/09/16 19:47:21 peter Exp $
+/* $Id: bison.y.in,v 1.32 2001/09/16 20:17:51 peter Exp $
  * NASM-compatible bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -42,7 +42,7 @@
 #include "bytecode.h"
 #include "section.h"
 
-RCSID("$Id: bison.y.in,v 1.31 2001/09/16 19:47:21 peter Exp $");
+RCSID("$Id: bison.y.in,v 1.32 2001/09/16 20:17:51 peter Exp $");
 
 #define YYDEBUG 1
 
@@ -124,7 +124,7 @@ extern section *nasm_parser_cur_section;
 
 %%
 input: /* empty */
-    | input line {
+    | input line    {
        OutputError();
        OutputWarning();
        if ($2) {
@@ -138,10 +138,10 @@ input: /* empty */
     }
 ;
 
-line: '\n'     { $$ = (bytecode *)NULL; }
+line: '\n'             { $$ = (bytecode *)NULL; }
     | exp '\n'
-    | directive '\n' { $$ = (bytecode *)NULL; }
-    | error '\n' {
+    | directive '\n'   { $$ = (bytecode *)NULL; }
+    | error '\n'       {
        Error(_("label or instruction expected at start of line"));
        $$ = (bytecode *)NULL;
        yyerrok;
@@ -149,48 +149,48 @@ 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; }
+    | DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
+    | RESERVE_SPACE expr    { $$ = bytecode_new_reserve($2, $1); }
+    | label exp                    { $$ = $2; }
+    | label                { $$ = (bytecode *)NULL; }
 ;
 
-datavals: dataval              {
+datavals: dataval          {
        STAILQ_INIT(&$$);
        STAILQ_INSERT_TAIL(&$$, $1, link);
     }
-    | datavals ',' dataval     {
+    | datavals ',' dataval  {
        STAILQ_INSERT_TAIL(&$1, $3, link);
        $$ = $1;
     }
 ;
 
-dataval: expr_no_string                { $$ = dataval_new_expr($1); }
-    | FLTNUM                   { $$ = dataval_new_float($1); }
-    | STRING                   { $$ = dataval_new_string($1); }
-    | error                    {
+dataval: expr_no_string        { $$ = dataval_new_expr($1); }
+    | FLTNUM           { $$ = dataval_new_float($1); }
+    | STRING           { $$ = dataval_new_string($1); }
+    | error            {
        Error(_("expression syntax error"));
        $$ = (dataval *)NULL;
     }
 ;
 
-label: label_id { $1->value = 0; } /* TODO: calculate offset */
-    | label_id ':' { $1->value = 0; } /* TODO: calculate offset */
+label: label_id            { $1->value = 0; } /* TODO: add pointer to bytecode */
+    | label_id ':'  { $1->value = 0; } /* TODO: add pointer to bytecode */
 ;
 
-label_id: ID { $$ = locallabel_base = sym_def_get ($1.name, SYM_LABEL); }
-    | SPECIAL_ID { $$ = sym_def_get ($1.name, SYM_LABEL); }
-    | LOCAL_ID { $$ = sym_def_get ($1.name, SYM_LABEL); }
+label_id: ID       { $$ = locallabel_base = sym_def_get($1.name, SYM_LABEL); }
+    | SPECIAL_ID    { $$ = sym_def_get($1.name, SYM_LABEL); }
+    | LOCAL_ID     { $$ = sym_def_get($1.name, SYM_LABEL); }
 ;
 
 /* directives */
-directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']'        {
        printf("Directive: Name='%s' Value='%s'\n", $2, $3);
     }
-    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error   {
        Error(_("missing `%c'"), ']');
     }
-    | '[' DIRECTIVE_NAME error {
+    | '[' DIRECTIVE_NAME error                 {
        Error(_("missing argument to `%s'"), $2);
     }
 ;
@@ -243,22 +243,22 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-memexp: expr           { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
+memexp: expr   { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
 ;
 
-memaddr: memexp                        { $$ = $1; $$.segment = 0; }
-    | REG_CS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x2E); }
-    | REG_SS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x36); }
-    | REG_DS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x3E); }
-    | REG_ES ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x26); }
-    | REG_FS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x64); }
-    | REG_GS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x65); }
-    | BYTE memaddr             { $$ = $2; SetEALen(&$$, 1); }
-    | WORD memaddr             { $$ = $2; SetEALen(&$$, 2); }
-    | DWORD memaddr            { $$ = $2; SetEALen(&$$, 4); }
+memaddr: memexp                    { $$ = $1; $$.segment = 0; }
+    | REG_CS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x2E); }
+    | REG_SS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x36); }
+    | REG_DS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x3E); }
+    | REG_ES ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x26); }
+    | REG_FS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x64); }
+    | REG_GS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x65); }
+    | BYTE memaddr         { $$ = $2; SetEALen(&$$, 1); }
+    | WORD memaddr         { $$ = $2; SetEALen(&$$, 2); }
+    | DWORD memaddr        { $$ = $2; SetEALen(&$$, 4); }
 ;
 
-mem: '[' memaddr ']' { $$ = $2; }
+mem: '[' memaddr ']'   { $$ = $2; }
 ;
 
 /* explicit memory */
@@ -342,15 +342,15 @@ rm128: XMMREG     { (void)ConvertRegToEA(&$$, $1); }
 ;
 
 /* immediate values */
-imm: expr              { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
+imm: expr   { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
 ;
 
 /* explicit immediates */
-imm8x: BYTE imm        { $$ = $2; }
+imm8x: BYTE imm            { $$ = $2; }
 ;
-imm16x: WORD imm       { $$ = $2; }
+imm16x: WORD imm    { $$ = $2; }
 ;
-imm32x: DWORD imm      { $$ = $2; }
+imm32x: DWORD imm   { $$ = $2; }
 ;
 
 /* implicit immediates */
@@ -365,44 +365,52 @@ imm32: imm
 ;
 
 /* jump targets */
-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); }
+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); }
 ;
 
 /* expression trees */
-expr_no_string: INTNUM { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
-    | explabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
-    /*| expr '||' expr { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
-    | expr '|' expr    { $$ = expr_new_tree ($1, EXPR_OR, $3); }
-    | expr '^' expr    { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
-    /*| expr '&&' expr { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
-    | expr '&' expr    { $$ = expr_new_tree ($1, EXPR_AND, $3); }
-    /*| expr '==' expr { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
-    /*| expr '>' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| expr '<' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| expr '>=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| expr '<=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| expr '!=' expr { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
-    | expr LEFT_OP expr        { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
-    | expr RIGHT_OP expr       { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
-    | expr '+' expr    { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
-    | expr '-' expr    { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
-    | 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_no_string: INTNUM         { $$ = expr_new_ident(EXPR_NUM, ExprNum($1)); }
+    | explabel                 {
+       $$ = expr_new_ident(EXPR_SYM,
+                           ExprSym(sym_use_get($1.name, SYM_LABEL)));
+    }
+    /*| expr '||' expr         { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
+    | expr '|' expr            { $$ = expr_new_tree($1, EXPR_OR, $3); }
+    | expr '^' expr            { $$ = expr_new_tree($1, EXPR_XOR, $3); }
+    /*| expr '&&' expr         { $$ = expr_new_tree($1, EXPR_LAND, $3); }*/
+    | expr '&' expr            { $$ = expr_new_tree($1, EXPR_AND, $3); }
+    /*| expr '==' expr         { $$ = expr_new_tree($1, EXPR_EQUALS, $3); }*/
+    /*| expr '>' expr          { $$ = expr_new_tree($1, EXPR_GT, $3); }*/
+    /*| expr '<' expr          { $$ = expr_new_tree($1, EXPR_GT, $3); }*/
+    /*| expr '>=' expr         { $$ = expr_new_tree($1, EXPR_GE, $3); }*/
+    /*| expr '<=' expr         { $$ = expr_new_tree($1, EXPR_GE, $3); }*/
+    /*| expr '!=' expr         { $$ = expr_new_tree($1, EXPR_NE, $3); }*/
+    | expr LEFT_OP expr                { $$ = expr_new_tree($1, EXPR_SHL, $3); }
+    | expr RIGHT_OP expr       { $$ = expr_new_tree($1, EXPR_SHR, $3); }
+    | expr '+' expr            { $$ = expr_new_tree($1, EXPR_ADD, $3); }
+    | expr '-' expr            { $$ = expr_new_tree($1, EXPR_SUB, $3); }
+    | 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 %prec UNARYOP   { $$ = $2; }
-    | '-' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NEG, $2); }
-    /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NOT, $2); }
-    | '(' expr ')'     { $$ = $2; }
+    | '-' expr %prec UNARYOP   { $$ = expr_new_branch(EXPR_NEG, $2); }
+    /*| '!' expr               { $$ = expr_new_branch(EXPR_LNOT, $2); }*/
+    | '~' expr %prec UNARYOP   { $$ = expr_new_branch(EXPR_NOT, $2); }
+    | '(' expr ')'             { $$ = $2; }
 ;
 
 expr: expr_no_string
-    | STRING           { $$ = expr_new_ident (EXPR_NUM, ExprNum(ConvertCharConstToInt($1))); }
+    | STRING           {
+       $$ = expr_new_ident (EXPR_NUM, ExprNum(ConvertCharConstToInt($1)));
+    }
 ;
 
-explabel: ID | SPECIAL_ID | LOCAL_ID ;
+explabel: ID
+    | SPECIAL_ID
+    | LOCAL_ID
+;
 
 instr: instrbase
     | OPERSIZE instr   { $$ = $2; SetInsnOperSizeOverride($$, $1); }
@@ -430,10 +438,10 @@ ConvertCharConstToInt(char *cc)
     unsigned long retval = 0;
     size_t len = strlen(cc);
 
-    if(len > 4)
+    if (len > 4)
        Warning(_("character constant too large, ignoring trailing characters"));
 
-    switch(len) {
+    switch (len) {
        case 4:
            retval |= (unsigned long)cc[3];
            retval <<= 8;
index a232c1e80e34aa9f5d136fa83989308c98ab8a3a..490ec6bcd833e83486cf971e09cc617b1820f2d5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.31 2001/09/16 19:47:21 peter Exp $
+/* $Id: nasm-bison.y,v 1.32 2001/09/16 20:17:51 peter Exp $
  * NASM-compatible bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -42,7 +42,7 @@
 #include "bytecode.h"
 #include "section.h"
 
-RCSID("$Id: nasm-bison.y,v 1.31 2001/09/16 19:47:21 peter Exp $");
+RCSID("$Id: nasm-bison.y,v 1.32 2001/09/16 20:17:51 peter Exp $");
 
 #define YYDEBUG 1
 
@@ -124,7 +124,7 @@ extern section *nasm_parser_cur_section;
 
 %%
 input: /* empty */
-    | input line {
+    | input line    {
        OutputError();
        OutputWarning();
        if ($2) {
@@ -138,10 +138,10 @@ input: /* empty */
     }
 ;
 
-line: '\n'     { $$ = (bytecode *)NULL; }
+line: '\n'             { $$ = (bytecode *)NULL; }
     | exp '\n'
-    | directive '\n' { $$ = (bytecode *)NULL; }
-    | error '\n' {
+    | directive '\n'   { $$ = (bytecode *)NULL; }
+    | error '\n'       {
        Error(_("label or instruction expected at start of line"));
        $$ = (bytecode *)NULL;
        yyerrok;
@@ -149,48 +149,48 @@ 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; }
+    | DECLARE_DATA datavals { $$ = bytecode_new_data(&$2, $1); }
+    | RESERVE_SPACE expr    { $$ = bytecode_new_reserve($2, $1); }
+    | label exp                    { $$ = $2; }
+    | label                { $$ = (bytecode *)NULL; }
 ;
 
-datavals: dataval              {
+datavals: dataval          {
        STAILQ_INIT(&$$);
        STAILQ_INSERT_TAIL(&$$, $1, link);
     }
-    | datavals ',' dataval     {
+    | datavals ',' dataval  {
        STAILQ_INSERT_TAIL(&$1, $3, link);
        $$ = $1;
     }
 ;
 
-dataval: expr_no_string                { $$ = dataval_new_expr($1); }
-    | FLTNUM                   { $$ = dataval_new_float($1); }
-    | STRING                   { $$ = dataval_new_string($1); }
-    | error                    {
+dataval: expr_no_string        { $$ = dataval_new_expr($1); }
+    | FLTNUM           { $$ = dataval_new_float($1); }
+    | STRING           { $$ = dataval_new_string($1); }
+    | error            {
        Error(_("expression syntax error"));
        $$ = (dataval *)NULL;
     }
 ;
 
-label: label_id { $1->value = 0; } /* TODO: calculate offset */
-    | label_id ':' { $1->value = 0; } /* TODO: calculate offset */
+label: label_id            { $1->value = 0; } /* TODO: add pointer to bytecode */
+    | label_id ':'  { $1->value = 0; } /* TODO: add pointer to bytecode */
 ;
 
-label_id: ID { $$ = locallabel_base = sym_def_get ($1.name, SYM_LABEL); }
-    | SPECIAL_ID { $$ = sym_def_get ($1.name, SYM_LABEL); }
-    | LOCAL_ID { $$ = sym_def_get ($1.name, SYM_LABEL); }
+label_id: ID       { $$ = locallabel_base = sym_def_get($1.name, SYM_LABEL); }
+    | SPECIAL_ID    { $$ = sym_def_get($1.name, SYM_LABEL); }
+    | LOCAL_ID     { $$ = sym_def_get($1.name, SYM_LABEL); }
 ;
 
 /* directives */
-directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']' {
+directive: '[' DIRECTIVE_NAME DIRECTIVE_VAL ']'        {
        printf("Directive: Name='%s' Value='%s'\n", $2, $3);
     }
-    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error {
+    | '[' DIRECTIVE_NAME DIRECTIVE_VAL error   {
        Error(_("missing `%c'"), ']');
     }
-    | '[' DIRECTIVE_NAME error {
+    | '[' DIRECTIVE_NAME error                 {
        Error(_("missing argument to `%s'"), $2);
     }
 ;
@@ -243,22 +243,22 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-memexp: expr           { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
+memexp: expr   { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
 ;
 
-memaddr: memexp                        { $$ = $1; $$.segment = 0; }
-    | REG_CS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x2E); }
-    | REG_SS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x36); }
-    | REG_DS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x3E); }
-    | REG_ES ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x26); }
-    | REG_FS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x64); }
-    | REG_GS ':' memaddr       { $$ = $3; SetEASegment(&$$, 0x65); }
-    | BYTE memaddr             { $$ = $2; SetEALen(&$$, 1); }
-    | WORD memaddr             { $$ = $2; SetEALen(&$$, 2); }
-    | DWORD memaddr            { $$ = $2; SetEALen(&$$, 4); }
+memaddr: memexp                    { $$ = $1; $$.segment = 0; }
+    | REG_CS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x2E); }
+    | REG_SS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x36); }
+    | REG_DS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x3E); }
+    | REG_ES ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x26); }
+    | REG_FS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x64); }
+    | REG_GS ':' memaddr    { $$ = $3; SetEASegment(&$$, 0x65); }
+    | BYTE memaddr         { $$ = $2; SetEALen(&$$, 1); }
+    | WORD memaddr         { $$ = $2; SetEALen(&$$, 2); }
+    | DWORD memaddr        { $$ = $2; SetEALen(&$$, 4); }
 ;
 
-mem: '[' memaddr ']' { $$ = $2; }
+mem: '[' memaddr ']'   { $$ = $2; }
 ;
 
 /* explicit memory */
@@ -342,15 +342,15 @@ rm128: XMMREG     { (void)ConvertRegToEA(&$$, $1); }
 ;
 
 /* immediate values */
-imm: expr              { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
+imm: expr   { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
 ;
 
 /* explicit immediates */
-imm8x: BYTE imm        { $$ = $2; }
+imm8x: BYTE imm            { $$ = $2; }
 ;
-imm16x: WORD imm       { $$ = $2; }
+imm16x: WORD imm    { $$ = $2; }
 ;
-imm32x: DWORD imm      { $$ = $2; }
+imm32x: DWORD imm   { $$ = $2; }
 ;
 
 /* implicit immediates */
@@ -365,44 +365,52 @@ imm32: imm
 ;
 
 /* jump targets */
-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); }
+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); }
 ;
 
 /* expression trees */
-expr_no_string: INTNUM { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
-    | explabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
-    /*| expr '||' expr { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
-    | expr '|' expr    { $$ = expr_new_tree ($1, EXPR_OR, $3); }
-    | expr '^' expr    { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
-    /*| expr '&&' expr { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
-    | expr '&' expr    { $$ = expr_new_tree ($1, EXPR_AND, $3); }
-    /*| expr '==' expr { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
-    /*| expr '>' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| expr '<' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| expr '>=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| expr '<=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| expr '!=' expr { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
-    | expr LEFT_OP expr        { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
-    | expr RIGHT_OP expr       { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
-    | expr '+' expr    { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
-    | expr '-' expr    { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
-    | 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_no_string: INTNUM         { $$ = expr_new_ident(EXPR_NUM, ExprNum($1)); }
+    | explabel                 {
+       $$ = expr_new_ident(EXPR_SYM,
+                           ExprSym(sym_use_get($1.name, SYM_LABEL)));
+    }
+    /*| expr '||' expr         { $$ = expr_new_tree($1, EXPR_LOR, $3); }*/
+    | expr '|' expr            { $$ = expr_new_tree($1, EXPR_OR, $3); }
+    | expr '^' expr            { $$ = expr_new_tree($1, EXPR_XOR, $3); }
+    /*| expr '&&' expr         { $$ = expr_new_tree($1, EXPR_LAND, $3); }*/
+    | expr '&' expr            { $$ = expr_new_tree($1, EXPR_AND, $3); }
+    /*| expr '==' expr         { $$ = expr_new_tree($1, EXPR_EQUALS, $3); }*/
+    /*| expr '>' expr          { $$ = expr_new_tree($1, EXPR_GT, $3); }*/
+    /*| expr '<' expr          { $$ = expr_new_tree($1, EXPR_GT, $3); }*/
+    /*| expr '>=' expr         { $$ = expr_new_tree($1, EXPR_GE, $3); }*/
+    /*| expr '<=' expr         { $$ = expr_new_tree($1, EXPR_GE, $3); }*/
+    /*| expr '!=' expr         { $$ = expr_new_tree($1, EXPR_NE, $3); }*/
+    | expr LEFT_OP expr                { $$ = expr_new_tree($1, EXPR_SHL, $3); }
+    | expr RIGHT_OP expr       { $$ = expr_new_tree($1, EXPR_SHR, $3); }
+    | expr '+' expr            { $$ = expr_new_tree($1, EXPR_ADD, $3); }
+    | expr '-' expr            { $$ = expr_new_tree($1, EXPR_SUB, $3); }
+    | 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 %prec UNARYOP   { $$ = $2; }
-    | '-' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NEG, $2); }
-    /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' expr %prec UNARYOP   { $$ = expr_new_branch (EXPR_NOT, $2); }
-    | '(' expr ')'     { $$ = $2; }
+    | '-' expr %prec UNARYOP   { $$ = expr_new_branch(EXPR_NEG, $2); }
+    /*| '!' expr               { $$ = expr_new_branch(EXPR_LNOT, $2); }*/
+    | '~' expr %prec UNARYOP   { $$ = expr_new_branch(EXPR_NOT, $2); }
+    | '(' expr ')'             { $$ = $2; }
 ;
 
 expr: expr_no_string
-    | STRING           { $$ = expr_new_ident (EXPR_NUM, ExprNum(ConvertCharConstToInt($1))); }
+    | STRING           {
+       $$ = expr_new_ident (EXPR_NUM, ExprNum(ConvertCharConstToInt($1)));
+    }
 ;
 
-explabel: ID | SPECIAL_ID | LOCAL_ID ;
+explabel: ID
+    | SPECIAL_ID
+    | LOCAL_ID
+;
 
 instr: instrbase
     | OPERSIZE instr   { $$ = $2; SetInsnOperSizeOverride($$, $1); }
@@ -430,10 +438,10 @@ ConvertCharConstToInt(char *cc)
     unsigned long retval = 0;
     size_t len = strlen(cc);
 
-    if(len > 4)
+    if (len > 4)
        Warning(_("character constant too large, ignoring trailing characters"));
 
-    switch(len) {
+    switch (len) {
        case 4:
            retval |= (unsigned long)cc[3];
            retval <<= 8;
index 907ec60c81c6103dc9a44f108ff1520b6026da32..3327a6276a0037f9761a99d94857849f37dbb48d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: token.l.in,v 1.18 2001/09/16 19:47:21 peter Exp $
+/* $Id: token.l.in,v 1.19 2001/09/16 20:17:51 peter Exp $
  * NASM-compatible lex lexer
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -42,7 +42,7 @@
 
 #include "bison.h"
 
-RCSID("$Id: token.l.in,v 1.18 2001/09/16 19:47:21 peter Exp $");
+RCSID("$Id: token.l.in,v 1.19 2001/09/16 20:17:51 peter Exp $");
 
 #define yylval nasm_parser_lval
 
@@ -59,12 +59,16 @@ static char *strbuf = (char *)NULL;
 /* length of strbuf (including terminating NULL character) */
 static size_t strbuf_size = 0;
 
+/* last "base" label for local (.) labels */
+symrec *locallabel_base = (symrec *)NULL;
+
+/* current line number */
+int line_number;
+
 %}
 %option noyywrap
 %option nounput
 %option case-insensitive
-    symrec *locallabel_base = (symrec *)NULL;
-    int line_number;
 
 %x DIRECTIVE DIRECTIVE2
 
@@ -118,26 +122,26 @@ WS       [ \t\r]
     char endch = yytext[0];
 
     strbuf = malloc(STRBUF_ALLOC_SIZE);
-    if(!strbuf)
+    if (!strbuf)
        Fatal(FATAL_NOMEM);
 
     strbuf_size = STRBUF_ALLOC_SIZE;
     inch = input();
     count = 0;
-    while(inch != EOF && inch != endch && inch != '\n') {
+    while (inch != EOF && inch != endch && inch != '\n') {
        strbuf[count++] = inch;
-       if(count >= strbuf_size) {
+       if (count >= strbuf_size) {
            strbuf = realloc(strbuf, strbuf_size + STRBUF_ALLOC_SIZE);
-           if(!strbuf)
+           if (!strbuf)
                Fatal(FATAL_NOMEM);
            strbuf_size += STRBUF_ALLOC_SIZE;
        }
        inch = input();
     }
 
-    if(inch == '\n')
+    if (inch == '\n')
        Error(_("unterminated string"));
-    else if(inch == EOF)
+    else if (inch == EOF)
        Error(_("unexpected end of file in string"));
 
     strbuf[count] = '\0';
@@ -154,17 +158,18 @@ WS       [ \t\r]
 <DIRECTIVE2>\n     { BEGIN INITIAL; return '\n'; }
 <DIRECTIVE>{WS}+    ;
 <DIRECTIVE2>{WS}+   ;
+
 <DIRECTIVE>[a-z]+   {
     BEGIN DIRECTIVE2;
     yylval.str_val = strdup(yytext);
-    if(!yylval.str_val)
+    if (!yylval.str_val)
        Fatal(FATAL_NOMEM);
     return DIRECTIVE_NAME;
 }
     /* everything printable except for ' ', '[' and ']'. */
 <DIRECTIVE2>[!-@a-z\\^-`{|}~]+ {
     yylval.str_val = strdup(yytext);
-    if(!yylval.str_val)
+    if (!yylval.str_val)
        Fatal(FATAL_NOMEM);
     return DIRECTIVE_VAL;
 }
@@ -238,10 +243,10 @@ dr[0-367] { yylval.int_val = yytext[2]-'0'; return DRREG; }
 tr[3-7]                { yylval.int_val = yytext[2]-'0'; return TRREG; }
 
     /* floating point, MMX, and SSE registers */
-st0    { yylval.int_val = 0; return ST0; }
-st[1-7]        { yylval.int_val = yytext[2]-'0'; return FPUREG_NOTST0; }
-mm[0-7]        { yylval.int_val = yytext[2]-'0'; return MMXREG; }
-xmm[0-7]       { yylval.int_val = yytext[3]-'0'; return XMMREG; }
+st0        { yylval.int_val = 0; return ST0; }
+st[1-7]            { yylval.int_val = yytext[2]-'0'; return FPUREG_NOTST0; }
+mm[0-7]            { yylval.int_val = yytext[2]-'0'; return MMXREG; }
+xmm[0-7]    { yylval.int_val = yytext[3]-'0'; return XMMREG; }
 
     /* integer registers */
 eax    { yylval.int_val = 0; return REG_EAX; }
@@ -279,16 +284,18 @@ ds        { yylval.int_val = 3; return REG_DS; }
 fs     { yylval.int_val = 4; return REG_FS; }
 gs     { yylval.int_val = 5; return REG_GS; }
 
-"<<"   { return LEFT_OP; }
-">>"   { return RIGHT_OP; }
-"//"   { return SIGNDIV; }
-"%%"   { return SIGNMOD; }
+    /* operators */
+"<<"                   { return LEFT_OP; }
+">>"                   { return RIGHT_OP; }
+"//"                   { return SIGNDIV; }
+"%%"                   { return SIGNMOD; }
 [-+|^&*/%~():[\],]     { return yytext[0]; }
 
     /* special non-local ..@label and labels like ..start */
 $$|$|\.\.[a-z0-9_$#@~.?]+ {
-    yylval.syminfo.name = strdup (yytext);
-    if (yylval.syminfo.name == NULL) Fatal (FATAL_NOMEM);
+    yylval.syminfo.name = strdup(yytext);
+    if (!yylval.syminfo.name)
+       Fatal(FATAL_NOMEM);
     yylval.syminfo.line = line_number;
 
     return SPECIAL_ID;
@@ -296,20 +303,18 @@ $$|$|\.\.[a-z0-9_$#@~.?]+ {
 
     /* local label (.label) */
 \.[a-z0-9_$#@~?][a-z0-9_$#@~.?]* {
-    if (locallabel_base == NULL) 
-    {
-       Warning (_("no non-local label before `%s'"), yytext);
-       yylval.syminfo.name = strdup (yytext);
-       if (yylval.syminfo.name == NULL) Fatal (FATAL_NOMEM);
-    }
-    else
-    {
-       yylval.syminfo.name = malloc (strlen (yytext)
-                                 + strlen (locallabel_base->name)
-                                 + 1);
-       if (yylval.syminfo.name == NULL) Fatal (FATAL_NOMEM);
-       strcpy (yylval.syminfo.name, locallabel_base->name);
-       strcat (yylval.syminfo.name, yytext);
+    if (!locallabel_base) {
+       Warning(_("no non-local label before `%s'"), yytext);
+       yylval.syminfo.name = strdup(yytext);
+       if (!yylval.syminfo.name)
+           Fatal(FATAL_NOMEM);
+    } else {
+       yylval.syminfo.name = malloc(strlen(yytext) +
+                                    strlen(locallabel_base->name) + 1);
+       if (!yylval.syminfo.name)
+           Fatal(FATAL_NOMEM);
+       strcpy(yylval.syminfo.name, locallabel_base->name);
+       strcat(yylval.syminfo.name, yytext);
     }
     yylval.syminfo.line = line_number;
 
@@ -321,8 +326,9 @@ $$|$|\.\.[a-z0-9_$#@~.?]+ {
 
     /* label */
 [a-z_?][a-z0-9_$#@~.?]* {
-    yylval.syminfo.name = strdup (yytext);
-    if (yylval.syminfo.name == NULL) Fatal (FATAL_NOMEM);
+    yylval.syminfo.name = strdup(yytext);
+    if (!yylval.syminfo.name)
+       Fatal(FATAL_NOMEM);
     yylval.syminfo.line = line_number;
 
     return ID;