Trait egg::FromOp [−][src]
pub trait FromOp: Language + Sized {
type Error: Debug;
fn from_op(op: &str, children: Vec<Id>) -> Result<Self, Self::Error>;
}
Expand description
A trait for parsing e-nodes. This is implemented automatically by
define_language!
.
If a Language
implements both Display
and FromOp
, the
Display
implementation should produce a string suitable for parsing by
from_op
:
fn from_op_display_compatible<T: FromOp + Display>(node: T) {
let op = node.to_string();
let mut children = Vec::new();
node.for_each(|id| children.push(id));
let parsed = T::from_op(&op, children).unwrap();
assert_eq!(node, parsed);
}
Examples
define_language!
implements FromOp
and Display
automatically:
define_language! {
enum Calc {
"+" = Add([Id; 2]),
Num(i32),
}
}
let add = Calc::Add([Id::from(0), Id::from(1)]);
let parsed = Calc::from_op("+", vec![Id::from(0), Id::from(1)]).unwrap();
assert_eq!(add.to_string(), "+");
assert_eq!(parsed, add);