#include #include #include #include "common.h" #include "lexer.h" #include "parser.h" #include "eval.h" // TODO: the lexer, parser, and eval functions should return -1 on fatal, and 1 on non fatal error #define READ_BUF_CAP 512 #define DEFAULT_TOKENS_CAP 8192 // make it a command line arg lexer_t lexer = NULL; parser_t parser = NULL; // evaluator_t eval = NULL; int main(void) { int ret = 1; char *filename = "files/test1.lisp"; lexer = lexer_create(DEFAULT_TOKENS_CAP); if(!lexer) { err("lexer_create: failed"); goto fail; } FILE *fp = fopen(filename, "r"); if(!fp) { err("fopen: %s: %s", filename, strerror(errno)); goto fail; } // tokenize input char buf[READ_BUF_CAP]; size_t bytes = 0; while((bytes = fread(buf, sizeof(char), READ_BUF_CAP, fp))) { if(lexer_tokenize(lexer, buf, bytes)) { fclose(fp); goto fail; } if(bytes < READ_BUF_CAP) break; } lexer_print_tokens(lexer); fclose(fp); parser = parser_create(); if(!parser) { err("parser_create: failed"); goto fail; } if(parser_parse_lexer(parser, lexer)) { err("parser_parse_lexer: failed"); goto fail; } parser_print_ast(parser); // evaluator = eval_create(); // if(!evaluator) { // err("eval_create: failed"); // goto fail; // } // if(eval_ast(eval, ast)) { // err("eval_ast: failed"); // goto fail; // } ret = 0; fail: // eval_destroy(eval); parser_destroy(parser); lexer_destroy(lexer); return ret; }