|
- //
- // Created by red on 03/12/19.
- //
-
- #include <stdio.h>
- #include <editline/readline.h>
- #include <editline/history.h>
- #include <stdlib.h>
- #include "mpc.h"
- #include "eval.h"
-
- #pragma clang diagnostic ignored "-Wmissing-noreturn"
-
- int main(int argc, char** argv) {
-
- mpc_parser_t* Number = mpc_new("number");
- mpc_parser_t* Operator = mpc_new("operator");
- mpc_parser_t* Expr = mpc_new("expr");
- mpc_parser_t* Crisp = mpc_new("crisp");
-
- mpca_lang(MPCA_LANG_DEFAULT,
- " number : /-?[0-9]+/ ;"
- " operator : '+' | '-' | '*' | '/' ;"
- " expr : <number> | '(' <operator> <expr>+ ')' ;"
- " crisp : /^/ <operator> <expr>+ /$/ ;",
- Number, Operator, Expr, Crisp);
-
- puts("Crisp v.0.0.1");
- puts("Press Ctrl-C to exit\n");
-
- for (;;) {
-
- char* input = readline("crisp> ");
- add_history(input);
-
- // attempt to parse input
- mpc_result_t r;
- if (mpc_parse("<stdin>", input, Crisp, &r)) {
-
- cval result = eval(r.output);
- cval_println(result);
- mpc_ast_delete(r.output);
-
- } else {
- mpc_err_print(r.error);
- mpc_err_delete(r.error);
- }
-
- free(input);
- }
-
- mpc_cleanup(4, Number, Operator, Expr, Crisp);
- return EXIT_SUCCESS;
- }
|