]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
reworked grammar for nicer tags, broke it instead :(
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 19 Aug 2014 03:37:10 +0000 (23:37 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 19 Aug 2014 03:37:10 +0000 (23:37 -0400)
source/sclpl/grammar.c
source/sclpl/grammar.y
source/sclpl/main.c

index e5f55069a1a1f1efe4cb0ca44eebb87899f766fa..3b1f391c9aaa6796702362e31add0c7dfec4eb09 100644 (file)
@@ -2,25 +2,23 @@ const char Grammar[] =
 ""
 "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\")"
 "   | '\\\\' /./"
index 3358a2a5f2dc2744efc53a23456a0925de578a47..2d1bc6e547921e19569af4d750739ea174930e12 100644 (file)
@@ -1,25 +1,23 @@
 
 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")
    | '\\' /./
index 520001d718ed956a6cb1e5be1fc1e1c205d8aa5c..71535b80bc3270de8433bc3af81c75208c46f509 100644 (file)
@@ -47,6 +47,8 @@ ast_t* format_expr_ast(mpc_ast_t* expr) {
 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");
@@ -55,7 +57,7 @@ int main(int argc, char **argv) {
     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(":> ");
@@ -70,6 +72,6 @@ int main(int argc, char **argv) {
             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;
 }