#include #include #include #include "ast.h" #include "eval.h" #include "lexer.h" #define VERSION "0.1.0" extern struct Node* program_root; int yyparse(void); static int run_program(void) { int status = yyparse(); if (status != 0 || lexer_failed()) status = 1; else { struct Machine machine; machine_init(&machine); status = execute(&machine, program_root) == RUN_FAILED; } node_free(program_root); program_root = NULL; return status; } static void print_usage(FILE* stream) { (void)fprintf(stream, "usage: sfinae \n" " sfinae [-v | -h]\n"); } static void print_help(void) { (void)printf("sfinae " VERSION " - substitution failure is not an error\n\n" "a toy language inspired by c++ template meta programming\n\n"); print_usage(stdout); (void)printf("\noptions:\n" " -v, --version print version\n" " -h, --help print this\n\n" "by hachem \n"); } static bool is_flag(const char* argument, const char* brief, const char* full) { return strcmp(argument, brief) == 0 || strcmp(argument, full) == 0; } int main(int argc, char** argv) { if (argc != 2) { print_usage(stderr); return 2; } if (is_flag(argv[1], "-h", "--help")) { print_help(); return 0; } if (is_flag(argv[1], "-v", "--version")) { (void)printf("sfinae " VERSION "\n"); return 0; } yyin = fopen(argv[1], "r"); if (yyin == NULL) { (void)fprintf(stderr, "cannot open %s\n", argv[1]); return 1; } int status = run_program(); (void)fclose(yyin); return status; }