35 lines
869 B
Plaintext
35 lines
869 B
Plaintext
use std::str::FromStr;
|
|
use sl::Form;
|
|
|
|
grammar;
|
|
|
|
pub Term: Form = {
|
|
"true" => Form::new_bool(true),
|
|
"false" => Form::new_bool(false),
|
|
NUM => Form::new_int(isize::from_str(<>).unwrap()),
|
|
SYM => Form::new_symbol(<>),
|
|
"(" <ListInside?> ")" => <>.unwrap_or(Form::new_nil()),
|
|
"'" <Term> => Form::new_pair(Form::new_symbol("quote"), Form::new_pair(<>, Form::new_nil())),
|
|
"!" <h: Term> <t: Term> => {
|
|
h.append(t).unwrap()
|
|
},
|
|
};
|
|
ListInside: Form = {
|
|
<Term> =>Form::new_pair(<>, Form::new_nil()),
|
|
<h: Term> <t: ListInside> => Form::new_pair(h, t),
|
|
<a: Term> "." <d: Term> => Form::new_pair(a, d),
|
|
}
|
|
match {
|
|
"true",
|
|
"false",
|
|
"(",
|
|
")",
|
|
".",
|
|
"'",
|
|
"!",
|
|
r"[0-9]+" => NUM,
|
|
r"[a-zA-Z+*/_=?%&|^<>-][\w+*/=_?%&|^<>-]*" => SYM,
|
|
r"(;[^\n]*\n)|\s+" => { }
|
|
}
|
|
|