int main(int argc, char *argv[]) { /* Create types */ mpc_parser_t *Number = mpc_new("number"); mpc_parser_t *Bool = mpc_new("bool"); mpc_parser_t *Symbol = mpc_new("symbol"); mpc_parser_t *Sexp = mpc_new("sexp"); mpc_parser_t *Qexp = mpc_new("qexp"); mpc_parser_t *Expr = mpc_new("expr"); mpc_parser_t *Smallisp = mpc_new("Smallisp"); /* Definintions */ mpca_lang(MPC_LANG_DEFAULT, "number : /-?[0-9]+/ ; " "bool : \"true\" | \"false\" ; " "symbol : /[a-zA-Z0-9_+\\-*\\/=<>!&]+/; " "sexp : '(' <expr>* ')'; " "qexp : '{' <expr>* '}'; " "expr : <number> | <bool> | <char> | <symbol> | <sexp> | <qexp>; " "Smallisp : /^/ <sexp>* /$/ ; ", Number, Bool, Symbol, Sexp, Qexp, Expr, Smallisp, NULL); puts("Lispy version 0.0.0.7\n"); puts("Press Ctrl-C to exit\n"); lenv *env = lenv_new(); lenv_add_builtins(env); while(1) { char *input = readline("slisp> "); add_history(input); mpc_result_t r; if (mpc_parse("<stdin>", input, Smallisp, &r)) { /* On success print AST */ lval *result = lval_eval(env, lval_read(r.output)); lval_println(result); lval_del(result); mpc_ast_print(r.output); mpc_ast_delete(r.output); } else { /* Print error */ mpc_err_print(r.error); mpc_err_print(r.error); } free(input); } lenv_del(env); mpc_cleanup(7, Number, Bool, Symbol, Sexp, Qexp, Expr, Smallisp); return 0; }
int main(int argc, char **argv) { mpc_parser_t* Number = mpc_new("number"); mpc_parser_t* Symbol = mpc_new("symbol"); mpc_parser_t* String = mpc_new("string"); mpc_parser_t* Comment = mpc_new("comment"); mpc_parser_t* Sexpr = mpc_new("sexpr"); mpc_parser_t* Qexpr = mpc_new("qexpr"); mpc_parser_t* Expr = mpc_new("expr"); mpc_parser_t* Lispy = mpc_new("lispy"); mpca_lang(MPCA_LANG_PREDICTIVE, " number \"number\" : /[0-9]+/ ; " " symbol \"symbol\" : /[a-zA-Z0-9_+\\-*\\/\\\\=<>!&]+/ ; " " string \"string\" : /\"(\\\\.|[^\"])*\"/ ; " " comment : /;[^\\r\\n]*/ ; " " sexpr : '(' <expr>* ')' ; " " qexpr : '{' <expr>* '}' ; " " expr : <number> | <symbol> | <string> " " | <comment> | <sexpr> | <qexpr> ; " " lispy : /^/ <expr>* /$/ ; ", Number, Symbol, String, Comment, Sexpr, Qexpr, Expr, Lispy); if (argc > 1) { mpc_result_t r; if (mpc_parse_contents(argv[1], Lispy, &r)) { mpc_ast_print(r.output); mpc_ast_delete(r.output); } else { mpc_err_print(r.error); mpc_err_delete(r.error); } } else { mpc_result_t r; if (mpc_parse_pipe("<stdin>", stdin, Lispy, &r)) { mpc_ast_print(r.output); mpc_ast_delete(r.output); } else { mpc_err_print(r.error); mpc_err_delete(r.error); } } mpc_cleanup(8, Number, Symbol, String, Comment, Sexpr, Qexpr, Expr, Lispy); return 0; }
int main(int argc, char **argv) { mpc_parser_t *Expr = mpc_new("expression"); mpc_parser_t *Prod = mpc_new("product"); mpc_parser_t *Value = mpc_new("value"); mpc_parser_t *Maths = mpc_new("maths"); mpca_lang(MPCA_LANG_PREDICTIVE, " expression : <product> (('+' | '-') <product>)*; " " product : <value> (('*' | '/') <value>)*; " " value : /[0-9]+/ | '(' <expression> ')'; " " maths : /^/ <expression> /$/; ", Expr, Prod, Value, Maths, NULL); mpc_print(Expr); mpc_print(Prod); mpc_print(Value); mpc_print(Maths); if (argc > 1) { mpc_result_t r; if (mpc_parse_contents(argv[1], Maths, &r)) { mpc_ast_print(r.output); mpc_ast_delete(r.output); } else { mpc_err_print(r.error); mpc_err_delete(r.error); } } else { mpc_result_t r; if (mpc_parse_pipe("<stdin>", stdin, Maths, &r)) { mpc_ast_print(r.output); mpc_ast_delete(r.output); } else { mpc_err_print(r.error); mpc_err_delete(r.error); } } mpc_cleanup(4, Expr, Prod, Value, Maths); return 0; }
int main(int argc, char **argv) { mpc_parser_t* Adjective = mpc_new("adjective"); mpc_parser_t* Noun = mpc_new("noun"); mpc_parser_t* Phrase = mpc_new("phrase"); mpc_parser_t* Doge = mpc_new("doge"); mpca_lang(MPCA_LANG_DEFAULT, " adjective : \"wow\" | \"many\" | \"so\" | \"such\"; " " noun : \"lisp\" | \"language\" | \"c\" | \"book\" | \"build\"; " " phrase : <adjective> <noun>; " " doge : /^/ <phrase>* /$/; ", Adjective, Noun, Phrase, Doge, NULL); if (argc > 1) { mpc_result_t r; if (mpc_parse_contents(argv[1], Doge, &r)) { mpc_ast_print(r.output); mpc_ast_delete(r.output); } else { mpc_err_print(r.error); mpc_err_delete(r.error); } } else { mpc_result_t r; if (mpc_parse_pipe("<stdin>", stdin, Doge, &r)) { mpc_ast_print(r.output); mpc_ast_delete(r.output); } else { mpc_err_print(r.error); mpc_err_delete(r.error); } } mpc_cleanup(4, Adjective, Noun, Phrase, Doge); return 0; }
int main(int argc, char** argv) { /* Create parsers */ mpc_parser_t* Number = mpc_new("number"); mpc_parser_t* Operator = mpc_new("operator"); mpc_parser_t* Expression = mpc_new("expression"); mpc_parser_t* Lispy = mpc_new("lispy"); linenoiseClearScreen(); /* Define them with the language as follows */ mpca_lang(MPCA_LANG_DEFAULT, " number : /-?[0-9]+/ ; " " operator : '+' | '/' | '*' | '-' ; " " expression : <number> | '(' <operator> <expression>+ ')' ; " " lispy : /^/ <operator>* <expression> /$/ ; ", Number, Operator, Expression, Lispy); char *line = NULL; while((line = linenoise("Lispy> ")) != NULL ) { mpc_result_t result; if (mpc_parse("<stdin>" , line, Lispy, &result)) { mpc_ast_print(result.output); mpc_ast_delete(result.output); } else { mpc_err_print(result.output); mpc_err_delete(result.output); } free(line); } mpc_cleanup(4, Number, Operator, Expression, Lispy); return 0; }
int main(int argc, char** argv) { // {{{ // Create Parsers. mpc_parser_t* Number = mpc_new("number"); mpc_parser_t* OperatorSymbol = mpc_new("operator_symbol"); mpc_parser_t* OperatorText = mpc_new("operator_text"); mpc_parser_t* Operator = mpc_new("operator"); mpc_parser_t* Sexpr = mpc_new("sexpr"); mpc_parser_t* Expr = mpc_new("expr"); mpc_parser_t* Lispy = mpc_new("lispy"); // Define polish notation language rules. mpca_lang(MPCA_LANG_DEFAULT, " number : /-?[0-9]+(\\.[0-9]+)?/ ;" " operator_symbol : '+' | '-' | '*' | '/' | '%' | '^' ;" " operator_text : \"add\" | \"sub\" | \"mul\" | \"div\" | \"mod\" " " | \"max\" | \"min\" ;" " operator : <operator_symbol> | <operator_text> ;" " sexpr : '(' <expr>* ')' ;" " expr : <number> | <operator> | <sexpr> ;" " lispy : /^/ <expr>* /$/ ;", Number, OperatorSymbol, OperatorText, Operator, Sexpr, Expr, Lispy ); // Print version and exit information. puts("Lispy Version 0.0.0.0.1"); puts("Press Ctrl+c to Exit\n"); // Never ending loop. while (1) { // Output our prompt to get input. // The function strips the trailing newline character char* input = readline("lispy> "); // Add input to history. add_history(input); // Attempt to parse the user input. mpc_result_t r; if (mpc_parse("<stdin>", input, Lispy, &r)) { lval* result = lval_eval(lval_read(r.output)); lval_println(result); lval_del(result); mpc_ast_delete(r.output); } else { // Print the error. mpc_err_print(r.error); mpc_err_delete(r.error); } // Imported from stdlib.h, free retrived input. free(input); } // Delete Parsers. mpc_cleanup( 7, Number, OperatorSymbol, OperatorText, Operator, Sexpr, Expr, Lispy ); return 0; } // }}}
int main(int argc, char** argv) { /* Create some parsers */ mpc_parser_t *Number = mpc_new("number"); mpc_parser_t *Symbol = mpc_new("symbol"); mpc_parser_t *Sexpr = mpc_new("sexpr"); mpc_parser_t *Qexpr = mpc_new("qexpr"); 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]+/ ;" "symbol : '+' | '-' | '*' | '/' | '%' | '^' " " | \"len\" | \"cons\"" " | \"list\" | \"head\" | \"tail\" | \"join\" | \"eval\" ;" "sexpr : '(' <expr>* ')' ;" "qexpr : '{' <expr>* '}' ;" "expr : <number> | <symbol> | <sexpr> | <qexpr> ;" "lispy : /^/ <expr>* /$/ ; " "", Number, Symbol, Sexpr, Qexpr, Expr, Lispy); /* Print Version and Exit Information */ puts("Lispy Version 0.0.0.0.1"); puts("Press Ctrl+c or Ctrl+d to Exit\n"); /* In a never ending loop */ while (1) { /* Output our prompt and get input */ char* input = readline("lispy> "); if (NULL == input) { /* quit with Ctrl-d */ break; } /* Add input to history */ add_history(input); /* Try to parse the user input */ mpc_result_t r; if (mpc_parse("<stdin>", input, Lispy, &r)) { /* On success evaluate AST */ lval *result = lval_eval(lval_read(r.output)); lval_println(result); lval_del(result); mpc_ast_delete(r.output); } else { mpc_err_print(r.error); mpc_err_delete(r.error); } /* Free retrieved input */ free(input); } /* Undefine and delete the parsers */ mpc_cleanup(6, Number, Symbol, Sexpr, Qexpr, Expr, Lispy); return 0; }