%token SECTION_TEXT SECTION_IVALS
-%token ASM_ARCH ASM_START SPR GPR OFFR LR COMMA BRACK_OPEN BRACK_CLOSE PAREN_OPEN PAREN_CLOSE HEXNUM DECNUM ARCH_NEWWORLD ARCH_OLDWORLD LABEL IDENT LABELREF
+%token ASM_ARCH ASM_START SPR GPR OFFR LR COMMA SEMICOLON BRACK_OPEN BRACK_CLOSE PAREN_OPEN PAREN_CLOSE HEXNUM DECNUM ARCH_NEWWORLD ARCH_OLDWORLD LABEL IDENT LABELREF
%token PLUS MINUS MULTIPLY DIVIDE BITW_OR BITW_AND BITW_XOR BITW_NOT LEFTSHIFT RIGHTSHIFT
}
;
-/* Allow terminating lines with the "|" char */
+/* Allow terminating lines with the ";" char */
line_terminator : /* Nothing */
- | BITW_OR line_terminator
+ | SEMICOLON line_terminator
+ ;
section_switch : SECTION_TEXT {
section = SECTION_TEXT;
}
;
-external_jump_operands : imm COMMA operand COMMA operand COMMA labelref {
+external_jump_operands : imm COMMA labelref {
struct operlist *ol = xmalloc(sizeof(struct operlist));
struct operand *cond = xmalloc(sizeof(struct operand));
cond->type = OPER_IMM;
cond->u.imm = $1;
ol->oper[0] = cond;
ol->oper[1] = $3;
- ol->oper[2] = $5;
- ol->oper[3] = $7;
$$ = ol;
}
;
}
;
-mem : BRACK_OPEN hexnum_decnum BRACK_CLOSE {
+mem : BRACK_OPEN imm BRACK_CLOSE {
struct memory *mem = xmalloc(sizeof(struct memory));
+ struct immediate *offset_imm = $2;
mem->type = MEM_DIRECT;
- mem->offset = (unsigned long)$2;
+ mem->offset = offset_imm->imm;
+ free(offset_imm);
$$ = mem;
}
- | BRACK_OPEN hexnum_decnum COMMA OFFR regnr BRACK_CLOSE {
+ | BRACK_OPEN imm COMMA OFFR regnr BRACK_CLOSE {
struct memory *mem = xmalloc(sizeof(struct memory));
+ struct immediate *offset_imm = $2;
mem->type = MEM_INDIRECT;
- mem->offset = (unsigned long)$2;
+ mem->offset = offset_imm->imm;
+ free(offset_imm);
mem->offr_nr = (unsigned long)$5;
$$ = mem;
}
;
-imm : hexnum {
- struct immediate *imm = xmalloc(sizeof(struct immediate));
- imm->imm = (unsigned long)$1;
- $$ = imm;
- }
- | decnum {
+imm : hexnum_decnum {
struct immediate *imm = xmalloc(sizeof(struct immediate));
imm->imm = (unsigned long)$1;
$$ = imm;