Redesigning the way the Symbol's represent string declaration (the .db msg 'Hello World' type of declarations).
This commit is contained in:
+72
-2
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user