我正在编写自己的语言编译器,我想使用宏将AST描述为S表达式。
以下是不起作用的最小示例代码。
#[derive(Debug, PartialEq)]
pub enum Expression {
BinOP(Box<Expression>, OP, Box<Expression>),
Number(f64),
}
#[derive(Debug, PartialEq)]
pub enum OP {
Add,
}
macro_rules! ast {
(+ $left:tt $right:tt) => {
Expression::BinOP(Box::new(ast!($left)), OP::Add, Box::new(ast!($right)))
};
($other:tt) => {
Expression::from($other)
};
}
impl From<usize> for Expression {
fn from(u: usize) -> Self {
Expression::Number(u as f64)
}
}
fn main() {
dbg!(ast!(+ 1 2)); // this works.
dbg!(ast!(+ (+ 3 4) 2)); // error: expected expression, found `+`
// ^ expected expression
}
( ( $e:tt ) ) => (ast!($e));
,这一行是必要的吗?看起来没有也可以。 - knium_