X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=assembler%2Fparser.y;h=4bdb9ec6dc8516b2335961057a3a61decdd1760d;hb=e882e360ba16d2eed103adffdd1809076ee98017;hp=f00b2da4dec31266d2e64b6e6599514525ace4e8;hpb=be06ecf2322ad87005e2d3f18eb6dbb08da7e92c;p=b43-tools.git diff --git a/assembler/parser.y b/assembler/parser.y index f00b2da..4bdb9ec 100644 --- a/assembler/parser.y +++ b/assembler/parser.y @@ -38,7 +38,7 @@ extern struct initvals_sect *cur_initvals_sect; %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 @@ -72,9 +72,10 @@ line : line_terminator { } ; -/* 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; @@ -1003,15 +1004,13 @@ extended_operlist : decnum COMMA decnum COMMA operand COMMA operand COMMA operan } ; -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; } ; @@ -1083,27 +1082,26 @@ reg : GPR regnr { } ; -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;