Updated the Parser to handle the variable declaration directive.
This commit is contained in:
+55
-11
@@ -7,6 +7,7 @@ int CurrentToken = 0;
|
||||
void PrintSymbols(void);
|
||||
Instruction* HandleOperation(void);
|
||||
void HandleAssemblerDirective(void);
|
||||
void HandleAssemblerDirective(void);
|
||||
void AdvanceParser(void);
|
||||
void IgnoreParserLine(void);
|
||||
Token* PeekToken(void);
|
||||
@@ -26,7 +27,7 @@ IRState* ParseTokens(List* tokens) {
|
||||
|
||||
switch(t->Class) {
|
||||
case DirectiveClass: //Maybe these should be ignored, let another process handle that.
|
||||
IgnoreParserLine();
|
||||
HandleAssemblerDirective();
|
||||
break;
|
||||
case MnemonicClass:
|
||||
HandleOperation();
|
||||
@@ -54,12 +55,6 @@ IRState* ParseTokens(List* tokens) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char mn[12];
|
||||
|
||||
GetMnemonicText(ins->Mnemonic, mn);
|
||||
|
||||
printf("Found: %s\n", mn);
|
||||
|
||||
symbol->Value.Instruction = ins;
|
||||
}
|
||||
break;
|
||||
@@ -76,6 +71,44 @@ IRState* ParseTokens(List* tokens) {
|
||||
return &MachineState;
|
||||
}
|
||||
|
||||
void HandleAssemblerDirective() {
|
||||
Token* token = PeekToken();
|
||||
char* symbolname;
|
||||
|
||||
//ignore sanity checks
|
||||
AdvanceParser();
|
||||
|
||||
token = PeekToken();
|
||||
|
||||
if (token->Class != IdentifierClass) {
|
||||
fprintf(stderr, "[Error] Line %d: expected variable name.", token->LineNumber);
|
||||
IgnoreParserLine();
|
||||
return;
|
||||
}
|
||||
|
||||
symbolname = token->Lemexe;
|
||||
|
||||
AdvanceParser();
|
||||
|
||||
token = PeekToken();
|
||||
|
||||
if (token->Class == NumberClass) {
|
||||
//Delcaring a numeric value.
|
||||
Symbol* s = AddSymbolToTable(symbolname, NumericSymbol, MachineState.SymbolsTable);
|
||||
|
||||
s->Value.Number = token->Value.Number;
|
||||
}
|
||||
else if (token->Class == CharacterClass) {
|
||||
Symbol* s = AddSymbolToTable(symbolname, StringSymbol, MachineState.SymbolsTable);
|
||||
|
||||
s->Value.Text = token->Lemexe;
|
||||
|
||||
IgnoreParserLine();
|
||||
}
|
||||
else IgnoreParserLine();
|
||||
|
||||
}
|
||||
|
||||
Parameter* GetParameterType() {
|
||||
Token* token = PeekToken();
|
||||
Symbol* symbol = NULL;
|
||||
@@ -232,11 +265,22 @@ void PrintSymbols(void) {
|
||||
for(int i = 0; i < MachineState.SymbolsTable->Size; i++) {
|
||||
Symbol* symbol = MachineState.SymbolsTable->Symbols[i];
|
||||
|
||||
printf("[%s] %s", symbol->Type == UnresolvedSymbol ? "Unresolved" : "Resolved", symbol->Name);
|
||||
printf("[%s] ", symbol->Type == UnresolvedSymbol ? "Unresolved" : "Resolved");
|
||||
|
||||
if (symbol->Type == InstructionPointerSymbol) {
|
||||
GetMnemonicText(symbol->Value.Instruction->Mnemonic, mn);
|
||||
printf(" -> %s", mn);
|
||||
switch(symbol->Type) {
|
||||
case InstructionPointerSymbol:
|
||||
GetMnemonicText(symbol->Value.Instruction->Mnemonic, mn);
|
||||
printf("%s -> %s", symbol->Name, mn);
|
||||
break;
|
||||
case NumericSymbol:
|
||||
printf("[N] %s", symbol->Name);
|
||||
break;
|
||||
case StringSymbol:
|
||||
printf("[S] %s", symbol->Name);
|
||||
break;
|
||||
case UnresolvedSymbol:
|
||||
printf("[U] %s", symbol->Name);
|
||||
break;
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
Reference in New Issue
Block a user