Files
lt16lab/assembler/src/asm.l
Thomas Fehmel 657a54ba18 Initial Commit
2016-10-18 14:21:45 +02:00

106 lines
3.4 KiB
Plaintext

%option nodefault yylineno
%{
#include <string.h>
#include "../inc/msg.h"
#include "../inc/label.h"
#include "../inc/global.h"
#include "../inc/output.h"
#include "../obj/asm.tab.h"
void yyerror(char *s);
union yylval {
op_t op;
int i;
};
%}
LABELNAME [_a-zA-Z][_a-zA-Z0-9]*
%%
\n.* { strncpy(linebuf, yytext+1, sizeof(linebuf)); /* save the next line */
yyless(1); /* give back all but the \n to rescan */
output_line(linebuf); return EOL;
}
\r\n.* {
strncpy(linebuf, yytext+2, sizeof(linebuf)); /* save the next line */
yyless(2); /* give back all but the \r\n to rescan */
output_line(linebuf); return EOL;
}
<<EOF>> { yyterminate(); return EOL; }
[ \t] { /* ignore whitespace*/ }
[,] { return ','; }
"//".*$ { /* comment */ }
[r][0-9]+ { yylval.i = atoi(yytext+1); return REGISTER; }
(sp) { yylval.i = 12; return REGISTER; }
(lr) { yylval.i = 13; return REGISTER; }
(sr) { yylval.i = 14; return REGISTER; }
(pc) { yylval.i = 15; return REGISTER; }
[+-]?"0x"?[0-9A-F]+ { yylval.i = strtol(yytext, 0, 0); return IMMEDIATE; }
(add) { yylval.op = op_add; return MNEMONIC; }
(sub) { yylval.op = op_sub; return MNEMONIC; }
(and) { yylval.op = op_and; return MNEMONIC; }
(or) { yylval.op = op_or; return MNEMONIC; }
(xor) { yylval.op = op_xor; return MNEMONIC; }
(lsh) { yylval.op = op_lsh; return MNEMONIC; }
(rsh) { yylval.op = op_rsh; return MNEMONIC; }
(addi) { yylval.op = op_addi; return MNEMONIC; }
(cmp) { yylval.op = op_cmp; return MNEMONIC; }
(ssr) { yylval.op = op_ssr; return MNEMONIC; }
(ldr) { yylval.op = op_ldr; return MNEMONIC; }
(ld08) { yylval.op = op_ld08; return MNEMONIC; }
(ld16) { yylval.op = op_ld16; return MNEMONIC; }
(ld32) { yylval.op = op_ld32; return MNEMONIC; }
(st08) { yylval.op = op_st08; return MNEMONIC; }
(st16) { yylval.op = op_st16; return MNEMONIC; }
(st32) { yylval.op = op_st32; return MNEMONIC; }
(brt) { yylval.op = op_brt; return MNEMONIC; }
(br) { yylval.op = op_br; return MNEMONIC; }
(call) { yylval.op = op_call; return MNEMONIC; }
(trap) { yylval.op = op_trap; return MNEMONIC; }
(reti) { yylval.op = op_reti; return MNEMONIC; }
(tst) { yylval.op = op_tst; return MNEMONIC; }
(mov) { yylval.op = op_mov; return MNEMONIC; }
(nop) { yylval.op = op_nop; return MNEMONIC; }
(ret) { yylval.op = op_ret; return MNEMONIC; }
(clr) { yylval.op = op_clr; return MNEMONIC; }
(\.word) { yylval.op = op_word; return MNEMONIC; }
(\.address) { yylval.op = op_addr; return MNEMONIC; }
(\.align) { yylval.m = op_align; return MNEMONIC; }
(eq) { yylval.m = mode_eq; return MODE; }
(neq) { yylval.m = mode_neq; return MODE; }
(gg) { yylval.m = mode_gg; return MODE; }
(ge) { yylval.m = mode_ge; return MODE; }
(ll) { yylval.m = mode_ll; return MODE; }
(le) { yylval.m = mode_le; return MODE; }
(true) { yylval.m = mode_cond_true; return MODE; }
(always) { yylval.m = mode_cond_unconditional; return MODE; }
{LABELNAME} { strcpy(yylval.s, yytext); return LABEL; }
(\>{LABELNAME}) { yylval.i = label_relative(yytext+1); return IMMEDIATE; }
(\={LABELNAME}) { yylval.i = label_absolute(yytext+1); return IMMEDIATE; }
: { return ':'; }
. { yyerror("unexpected input"); }
%%
int yywrap() { return 1; }