2023-11-19 16:33:19 -05:00
|
|
|
use std::str::FromStr;
|
|
|
|
|
use std::rc::Rc;
|
2023-11-24 20:35:57 -05:00
|
|
|
use std::cell::RefCell;
|
2023-11-19 16:33:19 -05:00
|
|
|
use sl::Form;
|
|
|
|
|
|
|
|
|
|
grammar;
|
|
|
|
|
|
|
|
|
|
pub Term: Rc<Form> = {
|
|
|
|
|
NUM => Rc::new(Form::Int(i32::from_str(<>).unwrap())),
|
2023-12-26 01:03:56 -05:00
|
|
|
SYM => Rc::new(Form::Symbol(<>.to_owned())),
|
2023-11-19 16:33:19 -05:00
|
|
|
"(" <ListInside?> ")" => <>.unwrap_or(Rc::new(Form::Nil)),
|
2023-12-26 01:03:56 -05:00
|
|
|
"'" <Term> => Rc::new(Form::Pair(Rc::new(Form::Symbol("quote".to_owned())), Rc::new(Form::Pair(<>, Rc::new(Form::Nil))))),
|
2023-11-19 16:33:19 -05:00
|
|
|
"!" <h: Term> <t: Term> => {
|
|
|
|
|
h.append(t).unwrap()
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
ListInside: Rc<Form> = {
|
2023-12-26 01:03:56 -05:00
|
|
|
<Term> => Rc::new(Form::Pair(<>, Rc::new(Form::Nil))),
|
|
|
|
|
<h: Term> <t: ListInside> => Rc::new(Form::Pair(h, t)),
|
|
|
|
|
<a: Term> "." <d: Term> => Rc::new(Form::Pair(a, d)),
|
2023-11-19 16:33:19 -05:00
|
|
|
}
|
|
|
|
|
match {
|
|
|
|
|
"(",
|
|
|
|
|
")",
|
|
|
|
|
".",
|
|
|
|
|
"'",
|
|
|
|
|
"!",
|
|
|
|
|
r"[0-9]+" => NUM,
|
|
|
|
|
r"[a-zA-Z+*/_=?%&|^<>-][\w+*/=_?%&|^<>-]*" => SYM,
|
|
|
|
|
r"(;[^\n]*\n)|\s+" => { }
|
|
|
|
|
}
|
|
|
|
|
|