%include { #include } %include { #include } %include { #include "private.h" } %token_type { lreg_t } %type sexpr { lreg_t } %extra_argument { struct parse_cb *cb } %syntax_error { raise_exception("syntax error", NIL); } input ::= sexprlist ENDPARSE. input ::= error. sexprlist ::= sexprlist sexpr(A). { if (cb != NULL) { cb->res = cb->fn(A, cb->opq); } } sexprlist ::= . { /* */ } sexpr(A) ::= atom(B). { A = B; } sexpr(A) ::= QUOTE sexpr(B). { A = cons(sym_quote, cons(B, NIL)); } sexpr(A) ::= QUASI sexpr(B). { A = cons(sym_quasiquote, cons(B, NIL)); } sexpr(A) ::= COMMA_AT sexpr(B). { A = cons(sym_splice, cons(B, NIL)); } sexpr(A) ::= COMMA sexpr(B). { A = cons(sym_unquote, cons(B, NIL)); } sexpr(A) ::= OPAREN sexpr(B) DOT sexpr(C) CPAREN. { A = cons(B,C); } sexpr(A) ::= OPAREN CPAREN. { A = NIL; } sexpr(A) ::= list(B). { A = B; } list(A) ::= OPAREN sexpr(B) listelem(C) CPAREN. { A = cons(B,C); } listelem(A) ::= sexpr(B) listelem(C). { A = cons(B, C); } listelem(A) ::= . { A = NIL; } atom(A) ::= SYMBOL(B). { A = B; } atom(A) ::= STRING(B). { A = B; } atom(A) ::= INTEGER(B). { A = B; } atom(A) ::= NIHIL(B). { A = B; }