%%
-line : /* empty */
- | line statement {
+line : line_terminator {
+ /* empty */
+ }
+ | line statement line_terminator {
struct statement *s = $2;
if (section != SECTION_TEXT)
yyerror("Microcode text instruction in non .text section");
memcpy(&s->info, &cur_lineinfo, sizeof(struct lineinfo));
list_add_tail(&s->list, &infile.sl);
}
- | line section_switch {
+ | line section_switch line_terminator {
}
- | line ivals_write {
+ | line ivals_write line_terminator {
struct initval_op *io = $2;
if (section != SECTION_IVALS)
yyerror("InitVals write in non .initvals section");
}
;
+/* Allow terminating lines with the "|" char */
+line_terminator : /* Nothing */
+ | BITW_OR line_terminator
+ ;
+
section_switch : SECTION_TEXT {
section = SECTION_TEXT;
}
}
;
-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;