#泛型 #解析 # #where #解析器

parse-generics-shim

为提议的RFC #1583提供稳定的适配层;提供解析泛型和where子句的宏

2个版本

使用旧的Rust 2015

0.1.1 2016年7月30日
0.1.0 2016年5月1日

5#where 中排名

每月 35 次下载
10 包(7 个直接)中使用

MIT/Apache

52KB
898

此包提供了RFC #1583中提议的parse_generics!parse_where!宏的稳定、部分实现。这些宏有两个作用

  1. 它们允许包作者在RFC是否被接受的情况下有限度地使用这些宏。
  2. 它们向Rust核心团队展示了对此功能的需求。
  3. 如果RFC被接受,它们提供了从部分实现到完整实现的迁移路径。

由于这些宏是通过macro_rules!实现的,因此它们有以下限制

  • 一般来说,只接受生命周期'a'z
  • 仅支持完整输出格式的一个子集。
  • 它们的效率显著较低,并且消耗了相当数量的递归限制。
<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_generics_shim!

macro_rules! parse_generics_shim {
(
{ $($fields:ident),+ },
then $callback_name:ident ! ( $($callback_args:tt)* ),
$($code:tt)*
) => { ... };
}

解析从$($code:tt)*开始(如果有)的泛型参数列表,扩展到解析信息加上参数列表之后的未消费标记。扩展的一般形式是

$callback_name! {
$($callback_args)*
{
$(
$fields: [ .. ],
)+
},
$($tail)*
}

回调

$callback_name$callback_args 指定用于解析结果的宏调用。请注意,$callback_args 可包含在 任何 以下之一中:( .. )[ .. ]{ .. }

字段

$fields 指示您想在展开中包含哪些信息。可用的字段有

  • constr - 通配参数及其约束的逗号分隔列表。
  • params - 逗号分隔的通配参数名称列表(包括生命周期和类型)。
  • ltimes - 逗号分隔的通配生命周期名称列表。
  • tnames - 逗号分隔的通配类型名称列表。

模拟器 支持以下组合

  • {constr,params,ltimes,tnames}
  • {constr}
  • { .. }

字段将按照在输入中出现的顺序出现在输出中。一个特殊情况是 { .. },它会导致 所有 字段被输出,然后跟随一个字面量 .. 标记。

警告:字段列表在长时间内保持不变没有任何明确保证。因此,强烈建议您不要直接匹配字段后面的 .. 标记。相反,您应该使用以下结构

macro_rules! match_output {
(
{
// Match the fields you care about.
constr: $constr:tt,
params: [ $($params:tt,)* ],

// Ignore the rest; *never* explicitly match `..`!
$($_fields:tt)*
},

$($tail:tt)*
) => { ... };
}

代码

$code 是要解析的实际源代码。如果它以 < 开头,宏将解析通配参数列表。如果它 不是< 开头,宏将按输入以空通配参数列表开始的方式执行(即 <>)。

示例

以下展示了各种调用形式如何影响输出

parse_generics_shim! {
{ constr, params, ltimes, tnames },
then stringify!(output:),
<'a, T, U: 'a + Copy> X
}

// Expands to:
stringify!(

依赖关系