首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rust macro_rules中的S-表达式

Rust macro_rules中的S-表达式
EN

Stack Overflow用户
提问于 2020-05-08 10:19:56
回答 1查看 160关注 0票数 2

我正在编写自己的语言编译器,我想用我的宏将AST描述为S-expression。

以下是不起作用的最小示例代码。

代码语言:javascript
运行
复制
#[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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-08 15:29:33

你需要一个单独的宏来解析参数。尝试以下代码:

代码语言:javascript
运行
复制
#[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
}

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61670933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档