#枚举 #结构体 #解析 # #解析器

parse-macros

提供解析 Rust 构造(如枚举和结构体)的宏

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2016 年 5 月 1 日

#103 in #枚举

MIT/Apache

43KB
828

这个包提供了解析各种 Rust 构造的高层宏。

具体来说,这些宏专注于将 Rust 源代码构造重写为更易于由 macro_rules! 宏消费的格式。

<style type="text/css"> .link-block { font-family: "Fira Sans"; } .link-block > p { display: inline-block; } .link-block > p > strong { font-weight: 500; margin-right: 1em; } .link-block > ul { display: inline-block; padding: 0; list-style: none; } .link-block > ul > li { font-size: 0.8em; background-color: #eee; border: 1px solid #ccc; padding: 0.3em; display: inline-block; } </style>

目录

parse_enum!

macro_rules! parse_enum {
(
then $cb:ident!( $($cb_arg:tt)* ),
$($body:tt)*
) => { ... };
}

$body 解析为 枚举,使用结果调用宏 $cb。展开的一般形式是

$cb! {
$($cb_arg)*
enum {
attrs: $attrs:tt,
vis: $vis:tt,
name: $name:ident,
generics: $generics:tt,
where: $where_:tt,
variants: $variants:tt,
num_variants: $num_variants:tt,
}
}

回调

$cb_name$cb_arg 指定调用结果的宏。请注意,$cb_arg 可以包含在 ( .. )[ .. ]{ .. } 中的任何一种。

字段

展开包含以下字段

  • $attrs:一个以 [ .. ] 分隔的属性列表。例如[ #[doc="Does a thing"] #[repr(u8)] ]

  • $vis:一个以 ( .. ) 为分隔符的可见性注释。例如: ()(pub)

  • $name:枚举的名称,作为一个标识符。例如:Option

  • $generics:对枚举的 { .. } 输出的 parse_generics_shim!,包含 constrparamsltimestnames 字段

generics: {
constr: $constr:tt,
params: $params:tt,
ltimes: $ltimes:tt,
tnames: $tnames:tt,
}
  • $constr:一个以 [ .. ] 为分隔符、以逗号分隔的泛型约束列表。例如:['a, 'b: 'a, T, U: 'a + Copy,]

  • $params:一个以 [ .. ] 为分隔符、以逗号分隔的泛型参数名称列表。例如:['a, 'b, T, U,]

  • $ltimes:一个以 [ .. ] 为分隔符、以逗号分隔的泛型生命周期参数列表。例如:['a, 'b,]

  • $tnames:一个以 [ .. ] 为分隔符、以逗号分隔的泛型类型参数列表。例如:[T, U,]

  • $where_:对枚举的 { .. } 输出的 parse_where_shim!,包含 clausepreds 字段

where: {
clause: $clause:tt,
preds: $preds:tt,
}
  • $clause:一个由 [ .. ] 分隔的、以逗号结尾的子句,包括 where 关键字。如果子句为空,则省略 where 关键字,并且括号为空。 例如: [][ where for<'a> T: Fn(&'a i32), ]

  • $preds:一个由 [ .. ] 分隔的、以逗号结尾的子句谓词列表。 例如: [][ for<'a> T: Fn(&'a i32), ]

  • $variants:一个由 [ .. ] 分隔的、以逗号结尾的变体列表(以下将描述)。

  • $num_variants:枚举中变体的数量。 例如: 2

每个变体具有以下形式

{
ord: ($vord_index:tt, $vord_ident:ident),
attrs: $vattrs:tt,
kind: $vkind:ident,
name: $vname:ident,
fields: $vfields:tt,
num_fields: $vnum_fields:tt,
}
  • $vord_index:此变体的0基于序号。 例如: 1

  • $vord_ident:相对于同一 enum 的其他变体保证是唯一的标识符。标识符在 不同 parse_enum! 调用之间不一定保证是唯一的。 例如: _ord_01

  • $vattrs:附加到变体的属性列表。 例如: [ #[doc=""A variant unlike the rest.""] ]

  • $vkind:其中之一为 unitarytuplerecord

  • $vname:变体的名称作为标识符。 例如: None

  • $vfields:一个由 [ .. ] 分隔的、以逗号结尾的字段列表(以下将描述)。

  • $vnum_fields:变体中的字段数量。 例如: 1

变体字段具有以下形式

{
ord: ($ford_index:tt, $ford_ident:ident),
attrs: $fattrs:tt,
vis: $fvis:tt,
ty: $fty:ty,

// **NOTE**: only exists for *record* variant fields:
name: $fname:ident,
}
  • $ford_index:该变体字段的基于0的序号。例如 1

  • $ford_ident:一个相对于同一变体其他字段保证唯一的标识符。标识符在不同 parse_enum!调用之间,或在同一调用中的变体之间,不保证 是唯一的。例如 _ord_01

  • $fattrs:一个用[ .. ]分隔的属性列表,附加到变体字段。例如 [ #[doc="A part of the whole."] ]

  • $fvis:一个用( .. )分隔的可视性注解。例如()(pub)

  • $fty:变体字段的类型。

  • $fname:变体字段名称作为标识符。例如 part

示例

parse_enum! {
then stringify!(output:),
/// The `Option` type.
pub enum Option<T> {
/// No value.
None,
/// Some value `T`.
Some(T),
/// File could not be found.
FileNotFound { path: PathBuf },
}
}

// Expands to:
stringify!(

依赖关系