-/* $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
#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
%%
input: /* empty */
- | input line {
+ | input line {
OutputError();
OutputWarning();
if ($2) {
}
;
-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;
;
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);
}
;
;
/* 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 */
;
/* 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 */
;
/* 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); }
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;
-/* $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
#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
%%
input: /* empty */
- | input line {
+ | input line {
OutputError();
OutputWarning();
if ($2) {
}
;
-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;
;
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);
}
;
;
/* 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 */
;
/* 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 */
;
/* 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); }
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;
-/* $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
#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
/* 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
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';
<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;
}
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; }
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;
/* 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;
/* 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;
-/* $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
#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
%%
input: /* empty */
- | input line {
+ | input line {
OutputError();
OutputWarning();
if ($2) {
}
;
-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;
;
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);
}
;
;
/* 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 */
;
/* 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 */
;
/* 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); }
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;
-/* $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
#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
%%
input: /* empty */
- | input line {
+ | input line {
OutputError();
OutputWarning();
if ($2) {
}
;
-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;
;
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);
}
;
;
/* 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 */
;
/* 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 */
;
/* 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); }
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;
-/* $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
#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
/* 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
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';
<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;
}
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; }
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;
/* 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;
/* 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;