<S-Expr> : s_expression;
<List> : s_expression;

%%

<S-Expr> ::= integer             { Integer(string_to_integer $1) }
           | true                { Boolean(true) }
           | false               { Boolean(false) }
           | bignum              { Bignum(string_to_bignum $1) }
           | float               { Float(string_to_float $1) }
           | string              { String($1) }
           | symbol              { Symbol($1) }
           | quote <S-Expr>      { Cons(Symbol("quote"), Cons($2, Nil)) }
           | quasiquote <S-Expr> { Cons(Symbol("quasiquote"), Cons($2, Nil)) }
           | unquote <S-Expr>    { Cons(Symbol("unquote"), Cons($2, Nil)) }
           | openpar <List>      { $2 }

<List>   ::= closepar              { Nil }
           | <S-Expr> <List>       { Cons($1, $2) }
           | dot <S-Expr> closepar { $2 }
