Updated the Instruction's structure and updated the Parser accordingly.
This commit is contained in:
+14
-16
@@ -20,31 +20,29 @@ typedef enum {
|
|||||||
RegisterParameter
|
RegisterParameter
|
||||||
} OpcodeParameter;
|
} OpcodeParameter;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
OpcodeParameter ParameterType;
|
||||||
|
OpcodeParameter InterpretedAs;
|
||||||
|
|
||||||
|
union {
|
||||||
|
int Number; //ConstanrParam
|
||||||
|
Registers Register; //Register param
|
||||||
|
Symbol* Symbol; //Address param
|
||||||
|
} Value;
|
||||||
|
} Parameter;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Mnemonic Mnemonic;
|
Mnemonic Mnemonic;
|
||||||
OpcodeParameter ParameterOneType;
|
Parameter* ParameterOne;
|
||||||
OpcodeParameter ParameterTwoType;
|
Parameter* ParameterTwo;
|
||||||
int LineNumber;
|
|
||||||
|
|
||||||
union {
|
|
||||||
int Constant;
|
|
||||||
Symbol* Symbol;
|
|
||||||
} ParameterOne;
|
|
||||||
|
|
||||||
union {
|
|
||||||
int Constant;
|
|
||||||
Symbol* Symbol;
|
|
||||||
} ParameterTwo;
|
|
||||||
} Instruction;
|
} Instruction;
|
||||||
|
|
||||||
//extern Instruction instructions[OPCODECOUNT];
|
|
||||||
|
|
||||||
Instruction* CreateInstruction(Mnemonic mnemonic);
|
Instruction* CreateInstruction(Mnemonic mnemonic);
|
||||||
|
Parameter* CreateParameter(OpcodeParameter parameterType);
|
||||||
void FreeInstruction(Instruction* instruction);
|
void FreeInstruction(Instruction* instruction);
|
||||||
int IsOpcode(const char*, Mnemonic*);
|
int IsOpcode(const char*, Mnemonic*);
|
||||||
int IsRegister(const char*, Registers*);
|
int IsRegister(const char*, Registers*);
|
||||||
void GetMnemonicText(Mnemonic mnemonic, char buffer[12]);
|
void GetMnemonicText(Mnemonic mnemonic, char buffer[12]);
|
||||||
//const Instruction* GetOpcodeDetails(Mnemonic);
|
|
||||||
unsigned char GetInstructionMask(Mnemonic type);
|
unsigned char GetInstructionMask(Mnemonic type);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+16
-2
@@ -37,12 +37,26 @@ Instruction* CreateInstruction(Mnemonic mnemonic) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
instruction->Mnemonic = mnemonic;
|
instruction->Mnemonic = mnemonic;
|
||||||
instruction->ParameterOneType = NoParameter;
|
// instruction->ParameterOne = CreateParameter(NoParameter);
|
||||||
instruction->ParameterTwoType = NoParameter;
|
// instruction->ParameterTwo = CreateParameter(NoParameter);
|
||||||
|
|
||||||
return instruction;
|
return instruction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Parameter* CreateParameter(OpcodeParameter parameterType) {
|
||||||
|
Parameter* param = calloc(1, sizeof(Parameter));
|
||||||
|
|
||||||
|
if (!param) {
|
||||||
|
fprintf(stderr, "Failed to calloc room for a Parameter. %s,\n", strerror(errno));
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
param->ParameterType = parameterType;
|
||||||
|
|
||||||
|
return param;
|
||||||
|
}
|
||||||
|
|
||||||
void FreeInstruction(Instruction* instruction) {
|
void FreeInstruction(Instruction* instruction) {
|
||||||
if (!instruction) return;
|
if (!instruction) return;
|
||||||
|
|
||||||
|
|||||||
+66
-17
@@ -32,7 +32,6 @@ 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.
|
||||||
IgnoreParserLine();
|
IgnoreParserLine();
|
||||||
AdvanceParser();
|
|
||||||
break;
|
break;
|
||||||
case MnemonicClass:
|
case MnemonicClass:
|
||||||
HandleOperation();
|
HandleOperation();
|
||||||
@@ -46,7 +45,6 @@ IRState* ParseTokens(List* tokens) {
|
|||||||
fprintf(stderr, "[Warning] Line %d: Syntax error, expected start of expression, got '%c' [%d].\n", t->LineNumber, t->Value.Punctuation, t->Class);
|
fprintf(stderr, "[Warning] Line %d: Syntax error, expected start of expression, got '%c' [%d].\n", t->LineNumber, t->Value.Punctuation, t->Class);
|
||||||
//exit(1);
|
//exit(1);
|
||||||
IgnoreParserLine();
|
IgnoreParserLine();
|
||||||
AdvanceParser(); //Consume the new line
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,22 +64,35 @@ IRState* ParseTokens(List* tokens) {
|
|||||||
return &MachineState;
|
return &MachineState;
|
||||||
}
|
}
|
||||||
|
|
||||||
OpcodeParameter GetParameterType(Token** sourceToken) {
|
Parameter* GetParameterType() {
|
||||||
Token* token = PeekToken();
|
Token* token = PeekToken();
|
||||||
OpcodeParameter parameterType;
|
Symbol* symbol = NULL;
|
||||||
|
Parameter* param = CreateParameter(NoParameter);
|
||||||
|
|
||||||
switch(token->Class) {
|
switch(token->Class) {
|
||||||
case RegisterClass:
|
case RegisterClass:
|
||||||
*sourceToken = token;
|
param->ParameterType = RegisterParameter;
|
||||||
|
param->InterpretedAs = RegisterParameter;
|
||||||
|
|
||||||
|
param->Value.Register = token->Value.Register;
|
||||||
|
|
||||||
AdvanceParser();
|
AdvanceParser();
|
||||||
|
|
||||||
return RegisterParameter;
|
return param;
|
||||||
case LabelClass:
|
case LabelClass:
|
||||||
case IdentifierClass:
|
case IdentifierClass:
|
||||||
*sourceToken = token;
|
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);
|
||||||
|
|
||||||
|
param->Value.Symbol = symbol;
|
||||||
|
|
||||||
AdvanceParser();
|
AdvanceParser();
|
||||||
return AddressParameter;
|
|
||||||
|
return param;
|
||||||
case PunctuationClass:
|
case PunctuationClass:
|
||||||
if (token->Value.Punctuation != LBracket) {
|
if (token->Value.Punctuation != LBracket) {
|
||||||
fprintf(stderr, "[Error] Line %d: Expected opening bracket\n", token->LineNumber);
|
fprintf(stderr, "[Error] Line %d: Expected opening bracket\n", token->LineNumber);
|
||||||
@@ -90,7 +101,37 @@ OpcodeParameter GetParameterType(Token** sourceToken) {
|
|||||||
|
|
||||||
AdvanceParser(); // [
|
AdvanceParser(); // [
|
||||||
|
|
||||||
parameterType = GetParameterType(sourceToken);
|
token = PeekToken();
|
||||||
|
|
||||||
|
if (token->Class == NumberClass) {
|
||||||
|
param->ParameterType = ConstantParameter;
|
||||||
|
param->InterpretedAs = AddressParameter;
|
||||||
|
param->Value.Number = token->Value.Number;
|
||||||
|
}
|
||||||
|
else if (token->Class == RegisterClass) {
|
||||||
|
param->ParameterType = RegisterParameter;
|
||||||
|
param->InterpretedAs = AddressParameter;
|
||||||
|
param->Value.Register = token->Value.Register;
|
||||||
|
}
|
||||||
|
else if (token->Class & AddressClass) {
|
||||||
|
param->ParameterType = AddressParameter;
|
||||||
|
param->ParameterType = AddressParameter;
|
||||||
|
|
||||||
|
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
|
||||||
|
|
||||||
|
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, NULL, strlen(token->Lemexe), MachineState.SymbolsTable);
|
||||||
|
|
||||||
|
param->Value.Symbol = symbol;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "[Error] Line %d: Expected identifier, constant number or register.\n", token->LineNumber);
|
||||||
|
IgnoreParserLine();
|
||||||
|
AdvanceParser(); //Consume NewLine
|
||||||
|
//return NULL;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
AdvanceParser(); //Consume the parameter it self.
|
||||||
|
|
||||||
token = PeekToken();
|
token = PeekToken();
|
||||||
|
|
||||||
@@ -101,18 +142,21 @@ OpcodeParameter GetParameterType(Token** sourceToken) {
|
|||||||
|
|
||||||
AdvanceParser(); // ]
|
AdvanceParser(); // ]
|
||||||
|
|
||||||
return AddressParameter;
|
return param;
|
||||||
case NumberClass:
|
case NumberClass:
|
||||||
*sourceToken = token;
|
param->ParameterType = ConstantParameter;
|
||||||
|
param->InterpretedAs = ConstantParameter;
|
||||||
|
|
||||||
|
param->Value.Number = token->Value.Number;
|
||||||
|
|
||||||
AdvanceParser();
|
AdvanceParser();
|
||||||
|
|
||||||
return ConstantParameter;
|
return param;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NoParameter;
|
return param;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleOperation() {
|
void HandleOperation() {
|
||||||
@@ -130,9 +174,10 @@ void HandleOperation() {
|
|||||||
goto InsertInstruction;
|
goto InsertInstruction;
|
||||||
}
|
}
|
||||||
|
|
||||||
ins->ParameterOneType = GetParameterType(&token);
|
//ins->ParameterOne->ParameterType = GetParameterType(&token);
|
||||||
|
ins->ParameterOne = GetParameterType();
|
||||||
|
|
||||||
if (ins->ParameterOneType == NoParameter) {
|
if (ins->ParameterOne->ParameterType == NoParameter) {
|
||||||
//This would be an error if the next token isn't a line break.
|
//This would be an error if the next token isn't a line break.
|
||||||
if (PeekToken()->Class != PunctuationClass || PeekToken()->Value.Punctuation != NewLine) {
|
if (PeekToken()->Class != PunctuationClass || PeekToken()->Value.Punctuation != NewLine) {
|
||||||
fprintf(stderr, "[Error] Line %d: Syntax error, expected line break but got %s.\n", token->LineNumber, token->Lemexe);
|
fprintf(stderr, "[Error] Line %d: Syntax error, expected line break but got %s.\n", token->LineNumber, token->Lemexe);
|
||||||
@@ -154,7 +199,8 @@ void HandleOperation() {
|
|||||||
|
|
||||||
AdvanceParser(); //Consume the comma
|
AdvanceParser(); //Consume the comma
|
||||||
|
|
||||||
ins->ParameterTwoType = GetParameterType(&token);
|
//ins->ParameterTwo->ParameterType = GetParameterType(&token);
|
||||||
|
ins->ParameterTwo = GetParameterType();
|
||||||
|
|
||||||
InsertInstruction:
|
InsertInstruction:
|
||||||
|
|
||||||
@@ -212,7 +258,10 @@ Token* PeekToken(void) {
|
|||||||
|
|
||||||
void IgnoreParserLine(void) {
|
void IgnoreParserLine(void) {
|
||||||
while(!ParserAtEnd()) {
|
while(!ParserAtEnd()) {
|
||||||
if (PeekToken()->Class == PunctuationClass && PeekToken()->Value.Punctuation == NewLine) break;
|
if (PeekToken()->Class == PunctuationClass && PeekToken()->Value.Punctuation == NewLine) {
|
||||||
|
AdvanceParser();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (PeekToken()->EndOfFile) break;
|
if (PeekToken()->EndOfFile) break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user