Improves assembler: Now has support for modifiers.

This commit is contained in:
Felix Queißner 2016-06-30 17:35:01 +02:00
parent 099e9da694
commit fef46ee8af
3 changed files with 153 additions and 54 deletions

View file

@ -57,17 +57,23 @@ int listSymbols = 0;
// current token // current token
int tok; int tok;
void apply_modifier(instruction_t *i, const char *mod);
void apply_modifiers(instruction_t *i) void apply_modifiers(instruction_t *i)
{ {
while(tok == TOK_MOD) while(tok == TOK_MOD)
{ {
printf("modifier, "); char *s = yytext + 1;
int len = strlen(s);
s[len - 1] = 0;
apply_modifier(i, s);
tok = yylex(); tok = yylex();
} }
} }
// line format: // line format:
// TOK_LABEL? TOK_MOD* TOK_MNEMONIC TOK_MOD* ()? TOK_MOD* TOK_NEWLINE // TOK_LABEL? TOK_MOD* TOK_MNEMONIC TOK_MOD* (TOK_INT|TOK_HEX|TOK_CHAR|TOK_REF)? TOK_MOD* TOK_NEWLINE
void assemble() void assemble()
{ {
uint32_t index = 0; uint32_t index = 0;
@ -156,7 +162,6 @@ void assemble()
// Increase command index by one // Increase command index by one
index += 1; index += 1;
} }
printf("NEXT\n");
} }
if(listSymbols) if(listSymbols)
@ -168,7 +173,7 @@ void assemble()
} }
} }
printf("Patches:\n"); // printf("Patches:\n");
for(llist_t *it = patches; it != NULL; it = it->next) for(llist_t *it = patches; it != NULL; it = it->next)
{ {
uint32_t target = list_find(&labels, it->name); uint32_t target = list_find(&labels, it->name);
@ -177,7 +182,7 @@ void assemble()
fseek(output, sizeof(instruction_t) * it->value + 4, SEEK_SET); fseek(output, sizeof(instruction_t) * it->value + 4, SEEK_SET);
fwrite(&target, 1, sizeof(uint32_t), output); fwrite(&target, 1, sizeof(uint32_t), output);
printf("%d -> %d (%s)\n", it->value, target, it->name); // printf("%d -> %d (%s)\n", it->value, target, it->name);
} }
} }
@ -239,3 +244,97 @@ int main(int argc, char **argv)
return 0; return 0;
} }
void apply_modifier(instruction_t *i, const char *mod)
{
// printf("[%s]\n", mod);
if(strncmp("ci:", mod, 3) == 0)
{
i->cmdinfo = atoi(mod + 3);
return;
}
if(strncmp("cmd:", mod, 4) == 0)
{
fprintf(stderr, "Command specification %s not supported yet.\n");
exit(1);
}
if(strcmp("f:yes", mod) == 0)
{
i->flags = 1;
}
else if(strcmp("f:no", mod) == 0)
{
i->flags = 0;
}
else if(strcmp("r:discard", mod) == 0)
{
i->output = VM_OUTPUT_DISCARD;
}
else if(strcmp("r:push", mod) == 0)
{
i->output = VM_OUTPUT_PUSH;
}
else if(strcmp("r:jump", mod) == 0)
{
i->output = VM_OUTPUT_JUMP;
}
else if(strcmp("r:jumpr", mod) == 0)
{
i->output = VM_OUTPUT_JUMPR;
}
else if(strcmp("i0:zero", mod) == 0)
{
i->input0 = VM_INPUT_ZERO;
}
else if(strcmp("i0:pop", mod) == 0)
{
i->input0 = VM_INPUT_POP;
}
else if(strcmp("i0:peek", mod) == 0)
{
i->input0 = VM_INPUT_PEEK;
}
else if(strcmp("i0:arg", mod) == 0)
{
i->input0 = VM_INPUT_ARG;
}
else if(strcmp("i1:zero", mod) == 0)
{
i->input1 = VM_INPUT_ZERO;
}
else if(strcmp("i1:pop", mod) == 0)
{
i->input1 = VM_INPUT_POP;
}
else if(strcmp("ex(z)=x", mod) == 0)
{
i->execZ = VM_EXEC_X;
}
else if(strcmp("ex(z)=0", mod) == 0)
{
i->execZ = VM_EXEC_0;
}
else if(strcmp("ex(z)=1", mod) == 0)
{
i->execZ = VM_EXEC_1;
}
else if(strcmp("ex(n)=x", mod) == 0)
{
i->execN = VM_EXEC_X;
}
else if(strcmp("ex(n)=0", mod) == 0)
{
i->execN = VM_EXEC_0;
}
else if(strcmp("ex(n)=1", mod) == 0)
{
i->execN = VM_EXEC_1;
}
else
{
fprintf(stderr, "Unknown modifier: [%s]\n", mod);
exit(1);
}
}

View file

@ -385,11 +385,11 @@ struct yy_trans_info
flex_int32_t yy_verify; flex_int32_t yy_verify;
flex_int32_t yy_nxt; flex_int32_t yy_nxt;
}; };
static yyconst flex_int16_t yy_accept[28] = static yyconst flex_int16_t yy_accept[30] =
{ 0, { 0,
0, 0, 13, 11, 4, 10, 11, 3, 3, 1, 0, 0, 13, 11, 4, 10, 11, 11, 3, 3,
11, 5, 11, 11, 0, 3, 6, 0, 0, 1, 1, 11, 5, 11, 11, 0, 3, 3, 6, 0,
9, 5, 0, 8, 2, 7, 0 0, 1, 9, 5, 0, 8, 2, 7, 0
} ; } ;
static yyconst YY_CHAR yy_ec[256] = static yyconst YY_CHAR yy_ec[256] =
@ -398,16 +398,16 @@ static yyconst YY_CHAR yy_ec[256] =
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 1, 4, 1,
1, 1, 1, 1, 1, 1, 1, 5, 6, 6, 1, 1, 1, 1, 5, 1, 1, 6, 7, 7,
6, 6, 6, 6, 6, 6, 6, 7, 8, 1, 7, 7, 7, 7, 7, 7, 7, 8, 9, 1,
1, 1, 1, 9, 10, 10, 10, 10, 10, 10, 1, 1, 1, 10, 11, 11, 11, 11, 11, 11,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 1, 13, 1, 14, 1, 10, 10, 10, 10, 13, 1, 14, 1, 15, 1, 11, 11, 11, 11,
10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12,
11, 11, 11, 11, 11, 11, 11, 11, 11, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16,
11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@ -424,50 +424,50 @@ static yyconst YY_CHAR yy_ec[256] =
1, 1, 1, 1, 1 1, 1, 1, 1, 1
} ; } ;
static yyconst YY_CHAR yy_meta[16] = static yyconst YY_CHAR yy_meta[17] =
{ 0, { 0,
1, 1, 2, 1, 3, 3, 1, 1, 1, 3, 1, 1, 2, 1, 1, 3, 3, 1, 1, 1,
3, 1, 4, 3, 3 3, 3, 1, 4, 3, 3
} ; } ;
static yyconst flex_uint16_t yy_base[32] = static yyconst flex_uint16_t yy_base[34] =
{ 0, { 0,
0, 0, 31, 61, 61, 61, 0, 11, 15, 0, 0, 0, 38, 64, 64, 64, 0, 11, 13, 21,
0, 22, 0, 28, 20, 8, 61, 0, 39, 0, 0, 0, 24, 0, 30, 30, 16, 17, 64, 0,
0, 0, 7, 61, 0, 61, 61, 49, 53, 16, 41, 0, 0, 0, 13, 64, 0, 64, 64, 52,
57 56, 23, 60
} ; } ;
static yyconst flex_int16_t yy_def[32] = static yyconst flex_int16_t yy_def[34] =
{ 0, { 0,
27, 1, 27, 27, 27, 27, 28, 27, 8, 29, 29, 1, 29, 29, 29, 29, 30, 29, 29, 9,
30, 27, 31, 12, 27, 8, 27, 14, 14, 29, 31, 32, 29, 33, 13, 29, 29, 9, 29, 15,
30, 12, 31, 27, 19, 27, 0, 27, 27, 27, 15, 31, 32, 13, 33, 29, 21, 29, 0, 29,
27 29, 29, 29
} ; } ;
static yyconst flex_uint16_t yy_nxt[77] = static yyconst flex_uint16_t yy_nxt[81] =
{ 0, { 0,
4, 5, 6, 7, 8, 9, 4, 10, 11, 12, 4, 5, 6, 7, 8, 9, 10, 4, 11, 12,
12, 13, 4, 14, 12, 16, 16, 17, 21, 26, 13, 13, 14, 4, 15, 13, 17, 17, 18, 18,
18, 18, 18, 24, 18, 19, 18, 18, 17, 18, 19, 17, 17, 20, 20, 23, 28, 20, 21, 20,
27, 22, 22, 27, 27, 18, 22, 18, 18, 27, 20, 19, 20, 26, 24, 24, 20, 29, 20, 24,
27, 27, 18, 25, 25, 27, 27, 27, 25, 15, 20, 20, 29, 29, 29, 20, 27, 27, 29, 29,
27, 15, 15, 20, 27, 20, 20, 23, 23, 23, 29, 27, 16, 29, 16, 16, 22, 29, 22, 22,
3, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 25, 3, 29, 29, 29, 29, 29, 29,
27, 27, 27, 27, 27, 27 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
} ; } ;
static yyconst flex_int16_t yy_chk[77] = static yyconst flex_int16_t yy_chk[81] =
{ 0, { 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 8, 8, 8, 30, 23, 1, 1, 1, 1, 1, 1, 8, 8, 9, 9,
8, 8, 16, 15, 8, 8, 12, 12, 12, 9, 9, 17, 17, 9, 9, 32, 25, 9, 9, 13,
3, 12, 12, 0, 0, 12, 12, 14, 14, 0, 13, 13, 18, 16, 13, 13, 10, 3, 13, 13,
0, 0, 14, 19, 19, 0, 0, 0, 19, 28, 15, 15, 0, 0, 0, 15, 21, 21, 0, 0,
0, 28, 28, 29, 0, 29, 29, 31, 31, 31, 0, 21, 30, 0, 30, 30, 31, 0, 31, 31,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 33, 33, 33, 29, 29, 29, 29, 29, 29, 29,
27, 27, 27, 27, 27, 27 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
} ; } ;
static yy_state_type yy_last_accepting_state; static yy_state_type yy_last_accepting_state;
@ -735,13 +735,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{ {
yy_current_state = (int) yy_def[yy_current_state]; yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 28 ) if ( yy_current_state >= 30 )
yy_c = yy_meta[(unsigned int) yy_c]; yy_c = yy_meta[(unsigned int) yy_c];
} }
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp; ++yy_cp;
} }
while ( yy_base[yy_current_state] != 61 ); while ( yy_base[yy_current_state] != 64 );
yy_find_action: yy_find_action:
yy_act = yy_accept[yy_current_state]; yy_act = yy_accept[yy_current_state];
@ -1120,7 +1120,7 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{ {
yy_current_state = (int) yy_def[yy_current_state]; yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 28 ) if ( yy_current_state >= 30 )
yy_c = yy_meta[(unsigned int) yy_c]; yy_c = yy_meta[(unsigned int) yy_c];
} }
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@ -1148,11 +1148,11 @@ static int yy_get_next_buffer (void)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{ {
yy_current_state = (int) yy_def[yy_current_state]; yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 28 ) if ( yy_current_state >= 30 )
yy_c = yy_meta[(unsigned int) yy_c]; yy_c = yy_meta[(unsigned int) yy_c];
} }
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
yy_is_jam = (yy_current_state == 27); yy_is_jam = (yy_current_state == 29);
return yy_is_jam ? 0 : yy_current_state; return yy_is_jam ? 0 : yy_current_state;
} }

View file

@ -7,7 +7,7 @@ whitespace [ \t]
newline [\n] newline [\n]
digit [0-9] digit [0-9]
hexdigit [0-9a-fA-F] hexdigit [0-9a-fA-F]
intnum {digit}+ intnum -?{digit}+
hexnum "0x"{hexdigit}+ hexnum "0x"{hexdigit}+
mnemonic [a-zA-Z]+ mnemonic [a-zA-Z]+
labelname [a-zA-Z0-9_]+ labelname [a-zA-Z0-9_]+