Updated the way Instructions keep track of symbols. Only their name is important but we need the Symbols to be able to track which Instruction they point to (if they do that is, i.e. a label symbol).
This commit is contained in:
+4
-2
@@ -2,7 +2,9 @@
|
|||||||
#define OPCODES_H
|
#define OPCODES_H
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "symbols_table.h"
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
//#include "symbols_table.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
R1, R2, R3, R4, R5, R6, R7, R8
|
R1, R2, R3, R4, R5, R6, R7, R8
|
||||||
@@ -27,7 +29,7 @@ typedef struct {
|
|||||||
union {
|
union {
|
||||||
int Number; //ConstanrParam
|
int Number; //ConstanrParam
|
||||||
Registers Register; //Register param
|
Registers Register; //Register param
|
||||||
Symbol* Symbol; //Address param
|
char* Symbol; //Symbol* Symbol; //Address param
|
||||||
} Value;
|
} Value;
|
||||||
} Parameter;
|
} Parameter;
|
||||||
|
|
||||||
|
|||||||
@@ -5,23 +5,20 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "opcodes.h"
|
||||||
|
|
||||||
#define SYMBOLSTABLE_DEFAULT_CAPACITY 128
|
#define SYMBOLSTABLE_DEFAULT_CAPACITY 128
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
ValueAt,
|
|
||||||
Address
|
|
||||||
} SymbolType;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char* Name;
|
char* Name;
|
||||||
int Length;
|
int Length;
|
||||||
int Resolved;
|
int Resolved;
|
||||||
|
int InstructionPointer;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
char* Text;
|
char* Text;
|
||||||
int Number;
|
int Number;
|
||||||
//Instruction Instruction;
|
Instruction* Instruction;
|
||||||
} Value;
|
} Value;
|
||||||
} Symbol;
|
} Symbol;
|
||||||
|
|
||||||
|
|||||||
+18
-20
@@ -96,25 +96,23 @@ int main(int argc, char* args[]) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ins->ParameterOne->ParameterType == RegisterParameter) {
|
switch(ins->ParameterOne->ParameterType) {
|
||||||
GetRegisterText(ins->ParameterOne->Value.Register, reg);
|
case RegisterParameter:
|
||||||
|
GetRegisterText(ins->ParameterOne->Value.Register, reg);
|
||||||
|
|
||||||
if (ins->ParameterOne->InterpretedAs == AddressParameter) {
|
if (ins->ParameterOne->InterpretedAs == AddressParameter) printf("[%s]", reg);
|
||||||
printf("[%s]", reg);
|
else printf("%s", reg);
|
||||||
}
|
break;
|
||||||
else {
|
case ConstantParameter:
|
||||||
printf("%s", reg);
|
if (ins->ParameterOne->InterpretedAs == AddressParameter) printf("[%d]", ins->ParameterOne->Value.Number);
|
||||||
}
|
else printf("%d", ins->ParameterOne->Value.Number);
|
||||||
}
|
break;
|
||||||
|
case AddressParameter:
|
||||||
if (ins->ParameterOne->ParameterType == ConstantParameter) {
|
if (ins->ParameterOne->InterpretedAs == AddressParameter) printf("[%s]", ins->ParameterOne->Value.Symbol);
|
||||||
if (ins->ParameterOne->InterpretedAs == AddressParameter) printf("[%d]", ins->ParameterOne->Value.Number);
|
else printf("%s", ins->ParameterOne->Value.Symbol);
|
||||||
else printf("%d", ins->ParameterOne->Value.Number);
|
break;
|
||||||
}
|
default:
|
||||||
|
printf("\n");
|
||||||
if (ins->ParameterOne->ParameterType == AddressParameter) {
|
|
||||||
if (ins->ParameterOne->InterpretedAs == AddressParameter) printf("[%s]", ins->ParameterOne->Value.Symbol->Name);
|
|
||||||
else printf("%s", ins->ParameterOne->Value.Symbol->Name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ins->ParameterTwo) {
|
if (!ins->ParameterTwo) {
|
||||||
@@ -134,8 +132,8 @@ int main(int argc, char* args[]) {
|
|||||||
else printf(", %d\n", ins->ParameterTwo->Value.Number);
|
else printf(", %d\n", ins->ParameterTwo->Value.Number);
|
||||||
break;
|
break;
|
||||||
case AddressParameter:
|
case AddressParameter:
|
||||||
if (ins->ParameterTwo->InterpretedAs == AddressParameter) printf(", [%s]\n", ins->ParameterTwo->Value.Symbol->Name);
|
if (ins->ParameterTwo->InterpretedAs == AddressParameter) printf(", [%s]\n", ins->ParameterTwo->Value.Symbol);
|
||||||
else printf(", %s\n", ins->ParameterTwo->Value.Symbol->Name);
|
else printf(", %s\n", ins->ParameterTwo->Value.Symbol);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|||||||
+22
-6
@@ -1,10 +1,11 @@
|
|||||||
#include "../includes/parser.h"
|
#include "../includes/parser.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
const List* TokensList;
|
const List* TokensList;
|
||||||
int CurrentToken = 0;
|
int CurrentToken = 0;
|
||||||
|
|
||||||
void PrintSymbols(void);
|
void PrintSymbols(void);
|
||||||
void HandleOperation(void);
|
Instruction* HandleOperation(void);
|
||||||
void HandleAssemblerDirective(void);
|
void HandleAssemblerDirective(void);
|
||||||
void AdvanceParser(void);
|
void AdvanceParser(void);
|
||||||
void IgnoreParserLine(void);
|
void IgnoreParserLine(void);
|
||||||
@@ -45,6 +46,13 @@ IRState* ParseTokens(List* tokens) {
|
|||||||
else symbol->Resolved = 1;
|
else symbol->Resolved = 1;
|
||||||
|
|
||||||
AdvanceParser(); //Consume the NewLine
|
AdvanceParser(); //Consume the NewLine
|
||||||
|
|
||||||
|
// Instruction* ins = HandleOperation();
|
||||||
|
|
||||||
|
// if (!ins) continue;
|
||||||
|
|
||||||
|
// symbol->Value.Instruction = ins;
|
||||||
|
// symbol->InstructionPointer = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -78,13 +86,13 @@ Parameter* GetParameterType() {
|
|||||||
//case LabelClass:
|
//case LabelClass:
|
||||||
case IdentifierClass:
|
case IdentifierClass:
|
||||||
param->ParameterType = AddressParameter;
|
param->ParameterType = AddressParameter;
|
||||||
param->InterpretedAs = ConstantParameter;
|
param->InterpretedAs = AddressParameter;
|
||||||
|
|
||||||
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
|
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, token->Lemexe, strlen(token->Lemexe), MachineState.SymbolsTable);
|
||||||
|
|
||||||
param->Value.Symbol = symbol;
|
param->Value.Symbol = symbol->Name;
|
||||||
|
|
||||||
AdvanceParser();
|
AdvanceParser();
|
||||||
|
|
||||||
@@ -111,13 +119,13 @@ Parameter* GetParameterType() {
|
|||||||
}
|
}
|
||||||
else if (token->Class & AddressClass) {
|
else if (token->Class & AddressClass) {
|
||||||
param->ParameterType = AddressParameter;
|
param->ParameterType = AddressParameter;
|
||||||
param->ParameterType = AddressParameter;
|
param->InterpretedAs = AddressParameter;
|
||||||
|
|
||||||
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
|
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
|
||||||
|
|
||||||
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, NULL, strlen(token->Lemexe), MachineState.SymbolsTable);
|
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, NULL, strlen(token->Lemexe), MachineState.SymbolsTable);
|
||||||
|
|
||||||
param->Value.Symbol = symbol;
|
param->Value.Symbol = symbol->Name;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fprintf(stderr, "[Error] Line %d: Expected identifier, constant number or register.\n", token->LineNumber);
|
fprintf(stderr, "[Error] Line %d: Expected identifier, constant number or register.\n", token->LineNumber);
|
||||||
@@ -154,10 +162,16 @@ Parameter* GetParameterType() {
|
|||||||
return param;
|
return param;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleOperation() {
|
Instruction* HandleOperation() {
|
||||||
Token* token = PeekToken();
|
Token* token = PeekToken();
|
||||||
char mn[12];
|
char mn[12];
|
||||||
|
|
||||||
|
if (token->Class != MnemonicClass) {
|
||||||
|
fprintf(stderr, "[Error] Line %d: Expected instruction mnemonic\n", token->LineNumber);
|
||||||
|
IgnoreParserLine();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
Instruction* ins = CreateInstruction(token->Value.Mnemonic);
|
Instruction* ins = CreateInstruction(token->Value.Mnemonic);
|
||||||
|
|
||||||
GetMnemonicText(ins->Mnemonic, mn);
|
GetMnemonicText(ins->Mnemonic, mn);
|
||||||
@@ -202,6 +216,8 @@ void HandleOperation() {
|
|||||||
AdvanceParser(); //Consume the line break
|
AdvanceParser(); //Consume the line break
|
||||||
|
|
||||||
free(ins);
|
free(ins);
|
||||||
|
|
||||||
|
return MachineState.Instructions->content[(MachineState.Instructions->size - 1) * sizeof(Instruction)];
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintSymbols(void) {
|
void PrintSymbols(void) {
|
||||||
|
|||||||
Reference in New Issue
Block a user