smallc.c (4663B)
1 #include "../mpc.h" 2 3 int main(int argc, char **argv) { 4 5 mpc_parser_t* Ident = mpc_new("ident"); 6 mpc_parser_t* Number = mpc_new("number"); 7 mpc_parser_t* Character = mpc_new("character"); 8 mpc_parser_t* String = mpc_new("string"); 9 mpc_parser_t* Factor = mpc_new("factor"); 10 mpc_parser_t* Term = mpc_new("term"); 11 mpc_parser_t* Lexp = mpc_new("lexp"); 12 mpc_parser_t* Stmt = mpc_new("stmt"); 13 mpc_parser_t* Exp = mpc_new("exp"); 14 mpc_parser_t* Typeident = mpc_new("typeident"); 15 mpc_parser_t* Decls = mpc_new("decls"); 16 mpc_parser_t* Args = mpc_new("args"); 17 mpc_parser_t* Body = mpc_new("body"); 18 mpc_parser_t* Procedure = mpc_new("procedure"); 19 mpc_parser_t* Main = mpc_new("main"); 20 mpc_parser_t* Includes = mpc_new("includes"); 21 mpc_parser_t* Smallc = mpc_new("smallc"); 22 23 mpc_err_t* err = mpca_lang(MPCA_LANG_DEFAULT, 24 " ident : /[a-zA-Z_][a-zA-Z0-9_]*/ ; \n" 25 " number : /[0-9]+/ ; \n" 26 " character : /'.'/ ; \n" 27 " string : /\"(\\\\.|[^\"])*\"/ ; \n" 28 " \n" 29 " factor : '(' <lexp> ')' \n" 30 " | <number> \n" 31 " | <character> \n" 32 " | <string> \n" 33 " | <ident> '(' <lexp>? (',' <lexp>)* ')' \n" 34 " | <ident> ; \n" 35 " \n" 36 " term : <factor> (('*' | '/' | '%') <factor>)* ; \n" 37 " lexp : <term> (('+' | '-') <term>)* ; \n" 38 " \n" 39 " stmt : '{' <stmt>* '}' \n" 40 " | \"while\" '(' <exp> ')' <stmt> \n" 41 " | \"if\" '(' <exp> ')' <stmt> \n" 42 " | <ident> '=' <lexp> ';' \n" 43 " | \"print\" '(' <lexp>? ')' ';' \n" 44 " | \"return\" <lexp>? ';' \n" 45 " | <ident> '(' <ident>? (',' <ident>)* ')' ';' ; \n" 46 " \n" 47 " exp : <lexp> '>' <lexp> \n" 48 " | <lexp> '<' <lexp> \n" 49 " | <lexp> \">=\" <lexp> \n" 50 " | <lexp> \"<=\" <lexp> \n" 51 " | <lexp> \"!=\" <lexp> \n" 52 " | <lexp> \"==\" <lexp> ; \n" 53 " \n" 54 " typeident : (\"int\" | \"char\") <ident> ; \n" 55 " decls : (<typeident> ';')* ; \n" 56 " args : <typeident>? (',' <typeident>)* ; \n" 57 " body : '{' <decls> <stmt>* '}' ; \n" 58 " procedure : (\"int\" | \"char\") <ident> '(' <args> ')' <body> ; \n" 59 " main : \"main\" '(' ')' <body> ; \n" 60 " includes : (\"#include\" <string>)* ; \n" 61 " smallc : /^/ <includes> <decls> <procedure>* <main> /$/ ; \n", 62 Ident, Number, Character, String, Factor, Term, Lexp, Stmt, Exp, 63 Typeident, Decls, Args, Body, Procedure, Main, Includes, Smallc, NULL); 64 65 if (err != NULL) { 66 mpc_err_print(err); 67 mpc_err_delete(err); 68 exit(1); 69 } 70 71 if (argc > 1) { 72 73 mpc_result_t r; 74 if (mpc_parse_contents(argv[1], Smallc, &r)) { 75 mpc_ast_print(r.output); 76 mpc_ast_delete(r.output); 77 } else { 78 mpc_err_print(r.error); 79 mpc_err_delete(r.error); 80 } 81 82 } else { 83 84 mpc_result_t r; 85 if (mpc_parse_pipe("<stdin>", stdin, Smallc, &r)) { 86 mpc_ast_print(r.output); 87 mpc_ast_delete(r.output); 88 } else { 89 mpc_err_print(r.error); 90 mpc_err_delete(r.error); 91 } 92 93 } 94 95 mpc_cleanup(17, Ident, Number, Character, String, Factor, Term, Lexp, Stmt, Exp, 96 Typeident, Decls, Args, Body, Procedure, Main, Includes, Smallc); 97 98 return 0; 99 100 } 101