summaryrefslogtreecommitdiff
path: root/precedent.c
diff options
context:
space:
mode:
Diffstat (limited to 'precedent.c')
-rw-r--r--precedent.c140
1 files changed, 27 insertions, 113 deletions
diff --git a/precedent.c b/precedent.c
index 9d60bfd..38fc617 100644
--- a/precedent.c
+++ b/precedent.c
@@ -4,124 +4,38 @@
#include "precedent.h"
#include "hashtable.h"
#include "parse.h"
+#include "eval.h"
-hashtable_t* ht;
-const int trueVal = 1;
-sym_t trueSym = {LITERAL, INT, (void*)&trueVal, NULL, 0};
-const int falseVal = 0;
-sym_t falseSym = {LITERAL, INT, (void*)&falseVal, NULL, 0};
-
-int main() {
- sym_t* finalSymbol = parse_symbol_final("print(eq(0; 1;))");
+int main(int argc, char** argv) {
+ if (argc > 1) {
+ if (strcmp("--version", argv[1]) == 0) {
+ printf("precedent, version 0.1\n");
+ printf("Copyright 2023 Kai Stevenson\n");
+ printf("This software was licensed under the MIT license;\n");
+ printf("for more information, see the license file.\n");
+ return 0;
+ }
+ else if (strcmp("--help", argv[1]) == 0) {
+ printf("usage: precedent [--version] [--help] <file>\n");
+ return 0;
+ }
+ }
+ sym_t* finalSymbol = parse_symbol_final(read_file(argv[1]));
printf("drawing program:\n");
write_symbol_visual(finalSymbol, 0);
printf("\nexecuting program:\n");
- ht = init_hashtable(1000);
+ init_eval();
eval(finalSymbol);
return 0;
}
-/* TODO: read base hashtable from file to allow modularity
-pair value value? */
-void exec_all(symset_t symset) {
- for (int i = 0; i < symset.count; i++) {
- /* dispose of result */
- eval(symset.symbols[i]);
- }
-}
-sym_t* eval(sym_t* symbol) {
- if (symbol->province == LITERAL) {
- return(symbol);
- }
- else if (symbol->province == KEY_REF) {
- sym_t* ir = try_eval_internal(symbol);
- if (ir != NULL) {
- return ir;
- }
- else {
- /* not an internal function, search hashtable for
- next symbol */
- /* TODO: scope */
- pair_t* p = hashtable_get_pair(ht, (char*)symbol->name);
- if (p != NULL) {
- return eval((sym_t*)p->value);
- }
- else {
- return NULL;
- }
- }
- }
- else {
- return NULL;
- }
-}
-/* internal functions?
-this function has side-effects */
-sym_t* try_eval_internal(sym_t* symbol) {
- unsigned int hash = get_hash((char*)symbol->name);
- /* TODO: return last arg. that's the function return line */
- if (hash == get_hash("root")) {
- /* execute all args as roots */
- symset_t symset;
- symset.symbols = symbol->args;
- symset.count = symbol->argCount;
- exec_all(symset);
- return &trueSym;
- }
- else if (hash == get_hash("store")) {
- /* TODO: scope */
- /* first arg is value, remaining args are names */
- /* TODO: recursion for multiple pairs */
- sym_t* v = eval(symbol->args[0]);
- char* key = symtos(v);
- sym_t* value = symbol->args[0];
- pair_t* p = init_pair(key, (void*)value);
- hashtable_add_pair(ht, p);
- return &trueSym;
- }
- else if (hash == get_hash("eq")) {
- litType_t type = NO_TYPE;
- void* lastVal = NULL;
- for (int i = 0; i < symbol->argCount; i++) {
- sym_t* v = eval(symbol->args[i]);
- /* initialize */
- if (type == NO_TYPE) {
- type = v->litType;
- lastVal = v->name;
- }
- else {
- /* interpret type */
- if (type == INT) {
- if (symtoi(v) != *((int*)lastVal)) {
- return &falseSym;
- }
- }
- if (type == STRING) {
- if (strcmp(symtos(v), (char*)lastVal) != 0) {
- return &falseSym;
- }
- }
- /* TODO: float */
- }
- }
- return &trueSym;
- }
- else if (hash == get_hash("print")) {
- sym_t* v = eval(symbol->args[0]);
- switch (v->litType) {
- case NO_TYPE:
- break;
- case INT:
- printf("%d\n", symtoi(v));
- break;
- case FLOAT:
- break;
- case STRING:
- printf("%s\n", symtos(v));
- break;
- }
- return &trueSym;
- }
- else {
- return NULL;
- }
+char* read_file(char* path) {
+ FILE* file = fopen(path, "r");
+ fseek(file, 0, SEEK_END);
+ unsigned long int length = ftell(file);
+ fseek(file, 0, SEEK_SET);
+ char* out = malloc((length + 1) * sizeof(char));
+ fread(out, length, 1, file);
+ fclose(file);
+ out[length] = '\0';
+ return out;
}