1个不稳定版本
0.1.0 | 2020年5月2日 |
---|
#1977 in 过程宏
16KB
448 行
nys
基于 syn
和 quote
的声明式(正则表达式类似)解析器生成库。
基本语法
# '?' tells that this construct doesn't have to capture something no matter what
# It is implicitly enabled in SEQ constructs
raw_receptacle = var ( '|' var )* '?'?
# '@' means that result will be pushed to a vec on success
var = '@'? var_name
# Note that var_name should point to a struct field of type
# `dyn syn::parse::Parse`
# or `Option<dyn syn::parse::Parse>`
# or `Vec<dyn syn::parse::Parse>`
# depending on the context
var_name = <syn::Ident>
receptacle = '#' '<' raw_receptacle '>'
# Tells the struct to implement `syn::parse::Parse` trait for
for_data = <syn::Ident>
for_construct = '#' '<' 'FOR' ':' for_data '>'
# Tries to match its raw_receptacle as long as it can
seq_construct = '#' '<' 'SEQ' ':' raw_receptacle '>'
construct = for_construct | seq_construct
# token is literally any token other than receptacle or construct
template = token* (( receptacle | construct )+ token*)*
用法
首先,定义一个结构体,你将把解析数据放入其中。
pub struct ThingDef {
// optional `pub` token
pub pub_token: Option<syn::Token![pub]>,
// Name of our thing
pub thing_name: syn::Ident,
}
现在让我们使用 nys
库帮助实现它的 syn::parse::Parse
。
nys::quote_template! {
#<FOR: ThingDef>
#<pub_token?> thing #<thing_name>;
}
现在你可以在需要 syn::parse::Parse-实现结构体的任何地方使用
ThingDef
。
甚至在其他 nys::quote_template
中。
此外,ThingDef
现在有一个 nys_parse_stream(s: ::proc_macro::TokenStream) -> ThingDef
函数。注意,它会在出错时引发panic。
依赖项
~1.5MB
~35K SLoC