Added grammar checking for DB declarations.

This commit is contained in:
2023-03-08 21:38:33 -06:00
parent 4f9f4202b2
commit f96e1c6380
2 changed files with 45 additions and 21 deletions
+5 -5
View File
@@ -20,9 +20,6 @@ int main(int argc, char* args[]) {
if (!ReadAllString(args[1], &source_code, &bytes_read)) return EX_IOERR; if (!ReadAllString(args[1], &source_code, &bytes_read)) return EX_IOERR;
List* list = GenerateTokenList(source_code); List* list = GenerateTokenList(source_code);
ParseTokens(list);
char mnemonic[12]; char mnemonic[12];
for(int i = 0; i < list->size; i++) { for(int i = 0; i < list->size; i++) {
@@ -39,7 +36,7 @@ int main(int argc, char* args[]) {
continue; continue;
} }
printf(" %c ", t->Value.Punctuation); printf("[P]%c", t->Value.Punctuation);
continue; continue;
} }
@@ -75,8 +72,11 @@ int main(int argc, char* args[]) {
} }
if (t->Class == CharacterClass) { if (t->Class == CharacterClass) {
printf("%s ", t->Lemexe); printf("[C]'%s'", t->Lemexe);
} }
} }
ParseTokens(list);
free(source_code); free(source_code);
} }
+45 -21
View File
@@ -6,7 +6,7 @@ List* TokensList;
int CurrentToken = 0; int CurrentToken = 0;
void PrintSymbols(void); void PrintSymbols(void);
Instruction* HandleOperation(void); void HandleOperation(void);
void RemoveCurrentToken(void); void RemoveCurrentToken(void);
void HandleAssemblerDirective(void); void HandleAssemblerDirective(void);
void HandleAssemblerDirective(void); void HandleAssemblerDirective(void);
@@ -35,10 +35,9 @@ IRState* ParseTokens(List* tokens) {
switch(t->Class) { switch(t->Class) {
case DirectiveClass: //Maybe these should be ignored, let another process handle that. case DirectiveClass: //Maybe these should be ignored, let another process handle that.
HandleAssemblerDirective(); HandleAssemblerDirective();
RemoveCurrentToken(); // clear new line
break; break;
case MnemonicClass: case MnemonicClass:
//HandleOperation(); HandleOperation();
break; break;
case LabelClass: case LabelClass:
{ {
@@ -51,8 +50,6 @@ IRState* ParseTokens(List* tokens) {
if (!found) AddSymbolToTable(t->Lemexe, HeapSize, 1, MachineState.SymbolsTable); if (!found) AddSymbolToTable(t->Lemexe, HeapSize, 1, MachineState.SymbolsTable);
else tmp->Resolved = 1; else tmp->Resolved = 1;
AdvanceParser(); //Consume the NewLine
} }
break; break;
default: default:
@@ -89,24 +86,49 @@ void HandleAssemblerDirective() {
if (found) { if (found) {
symbol->Address = HeapSize; symbol->Address = HeapSize;
symbol->Resolved = 1; symbol->Resolved = 1;
}
else {
symbol = AddSymbolToTable(identifier->Lemexe, HeapSize, 1, MachineState.SymbolsTable);
}
RemoveCurrentToken(); //Remove the Idenifier name token.
Token* value = PeekToken();
if (value->Class == CharacterClass) {
symbol->Length = strlen(value->Lemexe);
RemoveCurrentToken(); //Remove the string declared by this DB command.
if (PeekToken()->Class == PunctuationClass && PeekToken()->Value.Punctuation == Comma) {
if (PeekToken()->Value.Punctuation != Comma) {
fprintf(stderr, "Syntax error line %d: Expected COMMA got %c.", PeekToken()->LineNumber, PeekToken()->Value.Punctuation);
exit(1);
}
RemoveCurrentToken(); //Remove COMMA
if (PeekToken()->Class != NumberClass) {
fprintf(stderr, "Syntax error line %d: Expected terminating byte.\n", PeekToken()->LineNumber);
exit(1);
}
RemoveCurrentToken(); //Remove terminating byte
symbol->Length++;
}
else if (PeekToken()->Class != PunctuationClass || PeekToken()->Value.Punctuation != NewLine) {
fprintf(stderr, "Syntax error line %d: Expected COMMA got %c.", PeekToken()->LineNumber, PeekToken()->Value.Punctuation);
exit(1);
}
}
else if (PeekToken()->Class == NumberClass) {
symbol->Length = 2;
RemoveCurrentToken(); //Clear the number token.
}
HeapSize += symbol->Length; HeapSize += symbol->Length;
} }
else {
AddSymbolToTable(identifier->Lemexe, HeapSize, 1, MachineState.SymbolsTable);
RemoveCurrentToken();
identifier = PeekToken();
if (identifier->Class == CharacterClass) {
HeapSize += strlen(identifier->Lemexe);
}
else {
HeapSize += 2;
}
}
}
break; break;
default: default:
fprintf(stderr, "Synatx error on line %d.\n", directive->LineNumber); fprintf(stderr, "Synatx error on line %d.\n", directive->LineNumber);
@@ -114,7 +136,9 @@ void HandleAssemblerDirective() {
} }
} }
void HandleOperation(void) {
}
void PrintSymbols(void) { void PrintSymbols(void) {
//char mn[12]; //char mn[12];
@@ -122,7 +146,7 @@ void PrintSymbols(void) {
for(int i = 0; i < MachineState.SymbolsTable->Size; i++) { for(int i = 0; i < MachineState.SymbolsTable->Size; i++) {
Symbol* symbol = MachineState.SymbolsTable->Symbols[i]; Symbol* symbol = MachineState.SymbolsTable->Symbols[i];
printf("[%s] %s [%d]", symbol->Resolved == 0 ? "Unresolved" : "Resolved", symbol->Name, symbol->Address); printf("[%s] %s [%d] [Width: %d]", symbol->Resolved == 0 ? "Unresolved" : "Resolved", symbol->Name, symbol->Address, symbol->Length);
// switch(symbol->Type) { // switch(symbol->Type) {
// case InstructionPointerSymbol: // case InstructionPointerSymbol: