我正在try 编写一个proc宏block!
,它使用syn
机箱来解析隐约类似JSX/RSX的语法.
以下内容应被解析成具有两个子块"text_1"
和"text_2"
的块"wrapper"
:
let block = block! {
<"wrapper">
<"text_1">("hello")
<"text_2">("world")
};
在实现syn::parse
时使用input.parse::<syn::Token![]>()
,我可以很好地解析所有内容.
然而,有一件事我找不到解决方案:我想强制执行wrapper-children关系的代码样式,以便如果某个块是嵌套的,它必须在其前面有双倍空格或表格
// -- Good --
let block = block! {
<"text_1">("hello")
<"text_2">("world")
};
// -- Good --
let block = block! {
<"wrapper">
<"text_1">("hello")
<"text_2">("world")
};
// -- Bad --
// Need spaces/tabs before the children tags
let block = block! {
<"wrapper">
<"text_1">("hello")
<"text_2">("world")
};
通过Token![<]
、parse::<LitStr>()
、Token![>]
、parenthesized!
和bracketed!
来解析TokenStream
并不强制执行预期的规则,但我在syn
个文档中找不到任何与解析制表符/空格相关的内容.
从控制台上打印的TokenStream
来判断-它甚至没有第一个子元素的包装器>
到<
之间的任何东西
Input: TokenStream [
Punct {
ch: '<',
spacing: Alone,
span: #0 bytes(118..119),
},
Literal {
kind: Str,
symbol: "wrapper",
suffix: None,
span: #0 bytes(119..128),
},
Punct {
ch: '>',
spacing: Alone,
span: #0 bytes(128..129),
},
Punct {
ch: '<',
spacing: Alone,
span: #0 bytes(144..145),
},
Literal {
kind: Str,
symbol: "text_1",
suffix: None,
span: #0 bytes(145..153),
},
Punct {
ch: '>',
spacing: Alone,
span: #0 bytes(153..154),
},
有什么建议是可行的吗?如果可能的话