3

我在 Rust 中使用synand构建一个小型 HTML 解析器proc_macro2。到目前为止,我已经做到了,我可以解析常规的 HTML 标签和它的属性所以例如

html!(
 <div>
   <image></image>
 </div>
)

作品

但我也想解析一些JSX样式代码,所以像这样

html!(
 <div>
     {
      (0..3).map(|| html!(<text value="new"></text>))
     } 
 </div>
)

这是我的问题,我不知道如何解析宏代码中括号之间的代码,我Vector只想使用<text></text>元素。

这是一个游乐场示例

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d0a899ee52772565d4043fea24d8f21d

4

1 回答 1

2

我终于找到了我的问题的答案,并决定分享给其他正在努力解决问题的人。

如果您了解表达式在宏中的含义的概念,那将非常容易。之间的整个代码{}是一个expression和返回宏结果时,您可以将其用作标记内的值。

小例子

impl ToTokens for Response {
fn to_tokens(&self, tokens: &mut TokenStream) {
    let expressions: Vec<Expr> = self.expressions.clone();
    let entries: Vec<u16> = self.values.clone();

    //We can now use our saved numbers and expressions in this quote! and return something totally new to the user.
    tokens.extend(quote! {
       {
            let mut data: Vec<u16> = vec!(#(#entries),*);
            let expressions: Vec<Vec<u16>> = vec!(#(#expressions),*);
            for expr in expressions {
                data.extend(expr);
            };
           data.iter().fold(0, |acc, len| acc + len )
       }
    });
}
于 2020-08-12T08:07:27.983 回答