forked from solstice/solstice
Friendship ended with C++, C is my new best friend
This commit is contained in:
49
src/codegen/SolsScope.c
Normal file
49
src/codegen/SolsScope.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include "SolsScope.h"
|
||||
|
||||
#include "../include/uthash.h"
|
||||
#include "../lexer/SolsType.h"
|
||||
|
||||
void addVariableToScope(SolsScope* scope, const char* name, SolsType type) {
|
||||
SolsVariable* s = malloc(sizeof(SolsVariable));
|
||||
|
||||
strncpy(s->id, name, sizeof(s->id) - 1);
|
||||
s->id[sizeof(s->id) - 1] = '\0';
|
||||
|
||||
s->typeinfo = type;
|
||||
|
||||
HASH_ADD_STR(scope->variables, id, s);
|
||||
}
|
||||
|
||||
SolsVariable* findSolsVariable(SolsScope* scope, const char* name) {
|
||||
if (scope == NULL || scope->variables == NULL || name == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
SolsVariable* s;
|
||||
HASH_FIND_STR(scope->variables, name, s);
|
||||
return s;
|
||||
}
|
||||
|
||||
SolsScope copySolsScope(SolsScope* scope) {
|
||||
SolsScope newScope = {
|
||||
.variables = NULL,
|
||||
.tmpCounter = scope->tmpCounter,
|
||||
.returnType = scope->returnType
|
||||
};
|
||||
|
||||
SolsVariable *var, *tmp;
|
||||
|
||||
HASH_ITER(hh, scope->variables, var, tmp) {
|
||||
addVariableToScope(&newScope, var->id, var->typeinfo);
|
||||
}
|
||||
|
||||
return newScope;
|
||||
}
|
||||
|
||||
void destroySolsScope(SolsScope* scope) {
|
||||
SolsVariable *var, *tmp;
|
||||
|
||||
HASH_ITER(hh, scope->variables, var, tmp) {
|
||||
HASH_DEL(scope->variables, var);
|
||||
free(var);
|
||||
}
|
||||
}
|
||||
32
src/codegen/SolsScope.h
Normal file
32
src/codegen/SolsScope.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef SOLSSCOPE_H
|
||||
#define SOLSSCOPE_H
|
||||
|
||||
#include "../include/uthash.h"
|
||||
#include "../lexer/SolsType.h"
|
||||
|
||||
// Stores type information for variables in a UTHash table.
|
||||
typedef struct SolsVariable {
|
||||
char id[256];
|
||||
UT_hash_handle hh;
|
||||
SolsType typeinfo;
|
||||
} SolsVariable;
|
||||
|
||||
typedef struct SolsScope {
|
||||
SolsVariable* variables;
|
||||
size_t tmpCounter;
|
||||
SolsType returnType;
|
||||
} SolsScope;
|
||||
|
||||
// Adds a variable to the SolsScope.
|
||||
void addVariableToScope(SolsScope* scope, const char* name, SolsType type);
|
||||
|
||||
// Finds a variable in the SolsScope.
|
||||
SolsVariable* findSolsVariable(SolsScope* scope, const char* name);
|
||||
|
||||
// Deep copies a SolsScope, usually for being inside a code block
|
||||
SolsScope copySolsScope(SolsScope* scope);
|
||||
|
||||
// Destroys everything in the SolsScope
|
||||
void destroySolsScope(SolsScope* scope);
|
||||
|
||||
#endif
|
||||
1036
src/codegen/codegen.c
Normal file
1036
src/codegen/codegen.c
Normal file
File diff suppressed because it is too large
Load Diff
34
src/codegen/codegen.h
Normal file
34
src/codegen/codegen.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#ifndef CODEGEN_H
|
||||
#define CODEGEN_H
|
||||
|
||||
#include <groundvm.h>
|
||||
|
||||
#include "SolsScope.h"
|
||||
|
||||
#include "../parser/SolsNode.h"
|
||||
|
||||
Result(GroundProgram, charptr);
|
||||
|
||||
// Generates a GroundProgram (from the Ground VM header) from
|
||||
// a provided SolsNode.
|
||||
// Returns:
|
||||
// Success: Generated GroundProgram
|
||||
// Failure: charptr detailing what happened
|
||||
ResultType(GroundProgram, charptr) generateCode(SolsNode* node, SolsScope* scope);
|
||||
|
||||
// Gets the type of a node generated by the parser for the type checker.
|
||||
ResultType(SolsType, charptr) getNodeType(SolsNode* node, SolsScope* scope);
|
||||
|
||||
// Macro to help with code generation (and soon error handling)
|
||||
#define generate(nodetype) {\
|
||||
ResultType(GroundProgram, charptr) __result = generate##nodetype##Node(node, scope);\
|
||||
if (__result.error) {\
|
||||
return Error(GroundProgram, charptr, __result.as.error);\
|
||||
}\
|
||||
for (size_t i = 0; i < __result.as.success.size; i++) {\
|
||||
groundAddInstructionToProgram(&program, __result.as.success.instructions[i]);\
|
||||
}\
|
||||
break;\
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user