""
"replexpr : <ws> <expr> /[^\\n]*\\n/ ;"
""
-"expr : '(' <ws> \"quote\" <ws> <expr> <ws> ')'"
-" | '(' <ws> \"quasiquote\" <ws> <expr> <ws> ')'"
-" | '(' <ws> \"unquote\" <ws> <expr> <ws> ')'"
-" | '(' <ws> \"if\" <ws> <expr> <ws> <expr> <ws> (<expr> <ws>)?')'"
-" | '(' <ws> \"fn\" <ws> '(' (<ws> <var> <ws>)* ')' (<ws> <expr> <ws>)+ ')'"
-" | '(' <ws> \"def\" <ws> <var> <ws> <expr> <ws> ')'"
-" | '(' <ws> <expr> (<ws> <expr> <ws>)* ')'"
-" | /['`,]/ <expr>"
-" | <atom>"
-" ;"
-""
-"atom : <num> | <ch> | <str> | <bool> | <var> ;"
-""
-"num : \"0b\" /[0-1]+/"
-" | \"0o\" /[0-7]+/"
-" | \"0d\" /[0-9]+/"
-" | \"0x\" /[0-9a-fA-F]+/"
-" | /[-+]?[0-9]+(\\.[0-9]+)?/"
-" ;"
+"expr : <sexpr> | <qexpr> | <atom> ;"
+""
+"sexpr : '(' (<ws> <expr> <ws>)* ')' ;"
+""
+"qexpr : ('\\'' | '`' | ',') <expr> ;"
+""
+"atom : <float> | <int> | <radixnum> | <ch> | <str> | <bool> | <var> ;"
+""
+"int : /[-+]?[0-9]+/ ;"
+""
+"float : /[-+]?[0-9]+\\.[0-9]+/ ;"
+""
+"radixnum : \"0b\" /[0-1]+/"
+" | \"0o\" /[0-7]+/"
+" | \"0d\" /[0-9]+/"
+" | \"0x\" /[0-9a-fA-F]+/"
+" ;"
""
"ch : '\\\\' (\"space\"|\"newline\"|\"return\"|\"tab\"|\"vtab\")"
" | '\\\\' /./"
replexpr : <ws> <expr> /[^\n]*\n/ ;
-expr : '(' <ws> "quote" <ws> <expr> <ws> ')'
- | '(' <ws> "quasiquote" <ws> <expr> <ws> ')'
- | '(' <ws> "unquote" <ws> <expr> <ws> ')'
- | '(' <ws> "if" <ws> <expr> <ws> <expr> <ws> (<expr> <ws>)?')'
- | '(' <ws> "fn" <ws> '(' (<ws> <var> <ws>)* ')' (<ws> <expr> <ws>)+ ')'
- | '(' <ws> "def" <ws> <var> <ws> <expr> <ws> ')'
- | '(' <ws> <expr> (<ws> <expr> <ws>)* ')'
- | /['`,]/ <expr>
- | <atom>
- ;
-
-atom : <num> | <ch> | <str> | <bool> | <var> ;
-
-num : "0b" /[0-1]+/
- | "0o" /[0-7]+/
- | "0d" /[0-9]+/
- | "0x" /[0-9a-fA-F]+/
- | /[-+]?[0-9]+(\.[0-9]+)?/
- ;
+expr : <sexpr> | <qexpr> | <atom> ;
+
+sexpr : '(' (<ws> <expr> <ws>)* ')' ;
+
+qexpr : ('\'' | '`' | ',') <expr> ;
+
+atom : <float> | <int> | <radixnum> | <ch> | <str> | <bool> | <var> ;
+
+int : /[-+]?[0-9]+/ ;
+
+float : /[-+]?[0-9]+\.[0-9]+/ ;
+
+radixnum : "0b" /[0-1]+/
+ | "0o" /[0-7]+/
+ | "0d" /[0-9]+/
+ | "0x" /[0-9a-fA-F]+/
+ ;
ch : '\\' ("space"|"newline"|"return"|"tab"|"vtab")
| '\\' /./
int main(int argc, char **argv) {
mpc_parser_t* ReplExpr = mpc_new("replexpr");
mpc_parser_t* Expr = mpc_new("expr");
+ mpc_parser_t* SExpr = mpc_new("sexpr");
+ mpc_parser_t* QExpr = mpc_new("qexpr");
mpc_parser_t* Atom = mpc_new("atom");
mpc_parser_t* Num = mpc_new("num");
mpc_parser_t* Char = mpc_new("ch");
mpc_parser_t* Var = mpc_new("var");
mpc_parser_t* WS = mpc_new("ws");
mpca_lang(MPCA_LANG_WHITESPACE_SENSITIVE, Grammar,
- ReplExpr, Expr, Atom, Num, Char, String, Bool, Var, WS, NULL);
+ ReplExpr, Expr, SExpr, QExpr, Atom, Num, Char, String, Bool, Var, WS, NULL);
while(!feof(stdin)) {
mpc_result_t r;
printf(":> ");
while('\n' != fgetc(stdin)){}
}
}
- mpc_cleanup(9, ReplExpr, Expr, Atom, Num, Char, String, Bool, Var, WS);
+ mpc_cleanup(11, ReplExpr, Expr, SExpr, QExpr, Atom, Num, Char, String, Bool, Var, WS);
return 0;
}