#include #include #include "../mpc/mpc.h" /* If we are on Windows compile these functions */ #ifdef _WIN32 #include #include static char buffer[2048]; /* Fake readline function */ char* readline(char* prompt) { fputs(prompt, stdout); fgets(buffer, 2048, stdin); char* cpy = malloc(strlen(buffer)+1); assert(cpy != NULL) strcpy(cpy, buffer); cpy[strlen(cpy)-1] = '\0'; return cpy; } /* Fake add_history function */ void add_history(char* unused) {} /* Otherwise include the editline headers could use __APPLE__ for detection of OSX */ #else #include #endif int main(int argc, char const *argv[]) { /* Create some parsers */ mpc_parser_t* Number = mpc_new("number"); mpc_parser_t* Operator = mpc_new("operator"); mpc_parser_t* Expr = mpc_new("expr"); mpc_parser_t* Lispy = mpc_new("lispy"); /* Define them with the following language */ mpca_lang(MPCA_LANG_DEFAULT, " \ number : /-?[0-9]([.][0-9]+)*/ ; \ operator : '+' | '-' | '*' | '/' | '%' ; \ expr : | '(' + ')' ; \ lispy : /^/ + /$/ ; \ ", Number, Operator, Expr, Lispy); /* Print version and exit information */ puts("Lispy version 0.0.0.0.2"); puts("Press Ctrl+c to exit\n"); /* In a never ending loop */ while (1) { /* Output our prompt and get input */ char* input = readline("lispy> "); /* Add input to history */ add_history(input); /* Attempt to parse the user input */ mpc_result_t r; if (mpc_parse("", input, Lispy, &r)) { /* On success print the AST */ mpc_ast_print(r.output); mpc_ast_delete(r.output); } else { /* Otherwise print the error */ mpc_err_print(r.error); mpc_err_delete(r.error); } /* Free retrieved input */ free(input); } /* Undefine and delete our parsers */ mpc_cleanup(4, Number, Operator, Expr, Lispy); return 0; }