Updated the Parser to try and give 'AddressParameter's more meaning depending on the SymbolType.

This commit is contained in:
2022-10-08 18:21:11 -05:00
parent 48a77950be
commit fd44e03b1b
4 changed files with 48 additions and 8 deletions
+2 -1
View File
@@ -19,7 +19,8 @@ typedef enum {
NoParameter, NoParameter,
ConstantParameter, ConstantParameter,
AddressParameter, AddressParameter,
RegisterParameter RegisterParameter,
UnresolvedParameter
} OpcodeParameter; } OpcodeParameter;
typedef struct { typedef struct {
+3 -1
View File
@@ -1,5 +1,7 @@
.db video_start 0xF37F .db video_start 0xF37F
.db msg "Hello, world!", 0 .db msg "Hello, world!", 0
.db NOTERM "No terminating byte here"
.db null_byte 0
load r1, [msg] ; Because the lod* instructions can't load an address load r1, [msg] ; Because the lod* instructions can't load an address
; from anything but a register, this becomes laa r1, [msg] ; from anything but a register, this becomes laa r1, [msg]
@@ -11,7 +13,7 @@ load r1, [msg] ; Because the lod* instructions can't load an address
string_length: string_length:
loadb r3, [r1] ; Load the byte from the address in R1, into R3 loadb r3, [r1] ; Load the byte from the address in R1, into R3
load r2, 0 ; String length load r2, 0 ; String length
cmp r3, 0 ; Is R3 a null byte? cmp r3, null_byte ; Is R3 a null byte?
je end je end
inc r2 inc r2
+22 -2
View File
@@ -109,7 +109,17 @@ int main(int argc, char* args[]) {
break; break;
case AddressParameter: case AddressParameter:
if (ins->ParameterOne->InterpretedAs == AddressParameter) printf("[%s]", ins->ParameterOne->Value.Symbol); if (ins->ParameterOne->InterpretedAs == AddressParameter) printf("[%s]", ins->ParameterOne->Value.Symbol);
else printf("%s", ins->ParameterOne->Value.Symbol); else {
Symbol* s = TryGetSymbol(ins->ParameterOne->Value.Symbol, image->SymbolsTable);
switch(s->Type) {
case NumericSymbol:
printf("%s {%d}", s->Name, s->Value.Number);
break;
default:
printf("%s", ins->ParameterOne->Value.Symbol);
}
}
break; break;
default: default:
printf("\n"); printf("\n");
@@ -133,7 +143,17 @@ int main(int argc, char* args[]) {
break; break;
case AddressParameter: case AddressParameter:
if (ins->ParameterTwo->InterpretedAs == AddressParameter) printf(", [%s]\n", ins->ParameterTwo->Value.Symbol); if (ins->ParameterTwo->InterpretedAs == AddressParameter) printf(", [%s]\n", ins->ParameterTwo->Value.Symbol);
else printf(", %s\n", ins->ParameterTwo->Value.Symbol); else {
Symbol* s = TryGetSymbol(ins->ParameterTwo->Value.Symbol, image->SymbolsTable);
switch(s->Type) {
case NumericSymbol:
printf(", %s {%d}\n", s->Name, s->Value.Number);
break;
default:
printf(", %s\n", ins->ParameterTwo->Value.Symbol);
}
}
break; break;
default: default:
printf("\n"); printf("\n");
+21 -4
View File
@@ -148,11 +148,28 @@ Parameter* GetParameterType() {
//case LabelClass: //case LabelClass:
case IdentifierClass: case IdentifierClass:
param->ParameterType = AddressParameter; param->ParameterType = AddressParameter;
param->InterpretedAs = AddressParameter; //param->InterpretedAs = AddressParameter;
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable); symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, UnresolvedSymbol, MachineState.SymbolsTable); if (!symbol) {
symbol = AddSymbolToTable(token->Lemexe, UnresolvedSymbol, MachineState.SymbolsTable);
param->InterpretedAs = UnresolvedParameter;
}
else {
switch(symbol->Type) {
case InstructionPointerSymbol:
case StringSymbol:
param->InterpretedAs = AddressParameter;
break;
case NumericSymbol:
param->InterpretedAs = ConstantParameter;
break;
default:
param->InterpretedAs = UnresolvedParameter;
break;
}
}
param->Value.Symbol = symbol->Name; param->Value.Symbol = symbol->Name;
@@ -298,9 +315,9 @@ void PrintSymbols(void) {
break; break;
case StringSymbol: case StringSymbol:
if (symbol->Value.String->Terminated) if (symbol->Value.String->Terminated)
printf("[S] %s, %d", symbol->Name, symbol->Value.String->TerminatingByte); printf("[S] %s {%s}, %d", symbol->Name, symbol->Value.String->String, symbol->Value.String->TerminatingByte);
else else
printf("[S] %s", symbol->Value.String->String); printf("[S] %s {%s}", symbol->Name, symbol->Value.String->String);
break; break;
case UnresolvedSymbol: case UnresolvedSymbol:
printf("[U] %s", symbol->Name); printf("[U] %s", symbol->Name);