簡體   English   中英

解析 rust proc_macro 中括號的內容

[英]Parsing content of brackets in rust proc_macro

我正在使用synproc_macro2在 Rust 中構建一個小型 HTML 解析器。 到目前為止,我已經可以解析常規的 HTML 標簽及其屬性 例如

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

作品

但我也想解析一些JSX風格的代碼,所以像這樣

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

這是我的問題,我不知道如何解析宏代碼中括號之間的代碼,我想只使用<text></text>元素來獲取Vector

這是一個游樂場示例

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

我終於找到了我的問題的答案,並決定分享給其他正在努力解決問題的人。

如果您了解表達式在宏中的含義的概念,那將非常容易。 {}之間的整個代碼是一個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 )
       }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM