首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何接受过程宏中语法无效的输入?

如何接受过程宏中语法无效的输入?
EN

Stack Overflow用户
提问于 2021-07-27 18:23:43
回答 1查看 250关注 0票数 4

我认为过程宏只需要有词汇上有效的输入,但似乎所有的输入都必须解析为Rust代码,除非我做错了什么。

RFC说:

通过对令牌进行操作,传递给过程宏的代码不需要满足Rust解析器,只需要满足lexer。

一旦输入涉及无效的Rust语法,我就会得到解析错误。

考虑以下过程宏:

代码语言:javascript
复制
#[proc_macro_attribute]
pub fn my_macro(_: TokenStream, _: TokenStream) -> TokenStream {
    TokenStream::from(quote! {})
}

当运行时:

代码语言:javascript
复制
#[my_macro]
fn test() { * } // lexically valid but syntactically invalid

我知道错误:

代码语言:javascript
复制
error: expected expression, found `}`
  --> blah.rs:38:2
   |
33 | #[logic] fn omg () { * }
   |                        ^ expected expression

cargo-expand显示宏正确地删除了函数。因此,它不应该停止任何解析错误吗?

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-07-27 21:31:06

通过仔细阅读proc宏RFC,我注意到这是类似属性的proc宏的一种有文档记录的行为:

第二个参数是放置属性的AST节点的令牌。注意,为了计算要在这里传递的标记,编译器必须能够解析应用属性的代码。

要解决这个问题,似乎唯一的选择是使用一个类似函数的宏,它没有这个限制,它稍微改变了语法,这对我来说太糟糕了,但不是世界末日。

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

https://stackoverflow.com/questions/68550037

复制
相关文章

相似问题

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