45 lines
1023 B
Plaintext
45 lines
1023 B
Plaintext
use l2::ast::*;
|
|
|
|
use std::cell::Cell;
|
|
|
|
grammar;
|
|
|
|
pub TopLevel: TopLevel = {
|
|
"?-" <t:Term> "." => TopLevel::Query(t),
|
|
<r:Rule> "." => TopLevel::Rule(r),
|
|
<t:Term> "." => TopLevel::Fact(t),
|
|
};
|
|
|
|
Atom : Atom = {
|
|
r"[a-z][a-z0-9_]*" => <>.trim().to_string(),
|
|
};
|
|
|
|
BoxedTerm : Box<Term> = {
|
|
<t:Term> => Box::new(t),
|
|
};
|
|
|
|
Clause : Term = {
|
|
<a:Atom> "(" <ts: (<BoxedTerm> ",")*> <t:BoxedTerm> ")" => {
|
|
let mut ts = ts;
|
|
ts.push(t);
|
|
Term::Clause(Cell::new(RegType::Temp(0)), a, ts)
|
|
},
|
|
};
|
|
|
|
Rule : Rule = {
|
|
<c:Clause> ":-" <h:Term> <cs: ("," <Term>)*> =>
|
|
Rule { head: (c, h), clauses: cs },
|
|
<a:Atom> ":-" <h:Term> <cs: ("," <Term>)*> =>
|
|
Rule { head: (Term::Atom(Cell::new(RegType::Temp(0)), a), h),
|
|
clauses: cs }
|
|
};
|
|
|
|
Term : Term = {
|
|
<Clause> => <>,
|
|
<Atom> => Term::Atom(Cell::new(RegType::Temp(0)), <>),
|
|
<Var> => Term::Var(Cell::new(VarReg::Norm(RegType::Temp(0))), <>),
|
|
};
|
|
|
|
Var : Var = {
|
|
r"[A-Z][a-z0-9_]*" => <>.trim().to_string(),
|
|
}; |