gpt4 book ai didi

rust - Rust macro_rules 中的 S 表达式

转载 作者:行者123 更新时间:2023-12-03 11:29:59 26 4
gpt4 key购买 nike

我正在编写我自己的语言编译器,我想用我的宏将 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
}

最佳答案

您需要一个单独的宏来解析参数。试试这个代码:

#[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_arg!($left)), OP::Add, Box::new(ast_arg!($right)))
};
}

#[macro_export]
macro_rules! ast_arg {
( ( $e:tt ) ) => (ast!($e));
( ( $($e:tt)* ) ) => ( ast!( $($e)* ) );
($e:expr) => (Expression::from($e));
}

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)); // also works now
}

Playground 链接:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e35fcd9aa7b126cd34aea6b33857e6c9

如果你想用宏创建类似 Lisp 的语言,请检查这个项目:https://github.com/JunSuzukiJapan/macro-lisp

关于rust - Rust macro_rules 中的 S 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61670933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com