Redesigning the way the Symbol's represent string declaration (the .db msg 'Hello World' type of declarations).

This commit is contained in:
2022-10-06 21:33:29 -05:00
parent f38da9cc74
commit d3d2b06dbd
4 changed files with 101 additions and 12 deletions
+72 -2
View File
@@ -4,7 +4,12 @@ const List* TokensList;
int CurrentToken = 0;
void PrintSymbols(void);
<<<<<<< Updated upstream
void HandleOperation(void);
=======
SymbolString* ParseIdentifierParameter(void);
Instruction* HandleOperation(void);
>>>>>>> Stashed changes
void HandleAssemblerDirective(void);
void AdvanceParser(void);
void IgnoreParserLine(void);
@@ -31,9 +36,34 @@ IRState* ParseTokens(List* tokens) {
HandleOperation();
break;
case LabelClass:
<<<<<<< Updated upstream
AdvanceParser();
AddSymbolToTable(t->Lemexe, NULL, strlen(t->Lemexe), MachineState.SymbolsTable)->Resolved = 1;
AdvanceParser(); //Consume the NewLine
=======
{
Symbol* symbol = TryGetSymbol(t->Lemexe, MachineState.SymbolsTable);
if (symbol && symbol->Resolved) {
fprintf(stderr, "[Error] Line %d: Redefinition of symbol '%s'\n", t->LineNumber, t->Lemexe);
exit(1);
}
AdvanceParser(); //Consume the label token
if (!symbol) AddSymbolToTable(t->Lemexe, MachineState.SymbolsTable)->Resolved = 1;
else symbol->Resolved = 1;
AdvanceParser(); //Consume the NewLine
// Instruction* ins = HandleOperation();
// if (!ins) continue;
// symbol->Value.Instruction = ins;
// symbol->InstructionPointer = 1;
}
>>>>>>> Stashed changes
break;
default:
fprintf(stderr, "[Warning] Line %d: Syntax error, expected start of expression, got '%c' [%d].\n", t->LineNumber, t->Value.Punctuation, t->Class);
@@ -58,6 +88,43 @@ IRState* ParseTokens(List* tokens) {
return &MachineState;
}
SymbolString* ParseIdentifierParameter(void) {
Token* token = PeekToken();
if (token->Class != IdentifierClass) {
fprintf(stderr, "[Error] Line %d: Expected identifier\n", token->LineNumber);
IgnoreParserLine();
return NULL;
}
SymbolString* string = CreateSymbolString(token->Lemexe);
AdvanceParser();
if (token->Class == PunctuationClass && token->Value.Punctuation == NewLine) {
return string;
}
else if (token->Class == PunctuationClass && token->Value.Punctuation == Comma) {
AdvanceParser(); // Comsume the comma
token = PeekToken();
if (token->Class != NumberClass) {
fprintf(stderr, "[Error] Line %d: Expected string termination number.\n", token->LineNumber);
IgnoreParserLine();
free(string);
return NULL;
}
string->HasTerminatorByte = 1;
string->TerminatorByte = token->Value.Number;
return string;
}
return NULL;
}
Parameter* GetParameterType() {
Token* token = PeekToken();
Symbol* symbol = NULL;
@@ -73,14 +140,17 @@ Parameter* GetParameterType() {
AdvanceParser();
return param;
<<<<<<< Updated upstream
case LabelClass:
=======
>>>>>>> Stashed changes
case IdentifierClass:
param->ParameterType = AddressParameter;
param->InterpretedAs = AddressParameter;
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, token->Lemexe, strlen(token->Lemexe), MachineState.SymbolsTable);
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, MachineState.SymbolsTable);
param->Value.Symbol = symbol;
@@ -113,7 +183,7 @@ Parameter* GetParameterType() {
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, NULL, strlen(token->Lemexe), MachineState.SymbolsTable);
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, MachineState.SymbolsTable);
param->Value.Symbol = symbol;
}