nom宏中设计器位置的宏调用及ident!(...)语法解析
关于nom宏中
ident!(...)结构的语法解析 你观察得特别细致!在你给出的nom库exact!宏定义里,$submac:ident!( $($args:tt)* )这个写法其实是Rust宏规则特有的模式匹配语法,并不是一个预先定义好的宏调用——这也是它看起来有点“反常识”的原因。
我来拆解一下这个语法的逻辑:
核心是宏的模式捕获:
$submac:ident是一个宏捕获项,:ident指定它要捕获的是一个标识符(也就是像call!、tag!这类nom解析宏的名字本身)。- 后面跟着的
!( $($args:tt)* )是模式的固定部分,用来匹配「这个标识符后面紧跟着括号,括号内包含任意数量标记树(token tree)」的结构——简单说就是匹配一个带参数的完整宏调用形式。
这么设计的目的:
这个exact!宏的第一个分支就是专门用来处理「传入带参数的宏调用」的场景。比如当你写exact!(input, tag!("hello"))时,$submac会捕获到tag,$($args:tt)*会捕获到"hello",然后宏会展开成terminated!(input, tag!("hello"), eof!()),实现“匹配到指定内容后必须立刻到达输入末尾”的解析逻辑。关于你疑惑的「设计器位置」:
Rust的宏规则允许你匹配比单个token更复杂的语法结构,只要你写出对应的模式就行。这里的ident!(...)不是在调用宏,而是在告诉宏规则:“我要匹配一个以标识符开头、后跟括号和任意参数的宏调用结构”——这完全符合Rust宏的语法规范,只是属于比较进阶的用法。
举个实际展开的例子,假设你调用:
exact!(my_input, call!(my_custom_parser));
宏会匹配第一个分支,最终展开为:
terminated!(my_input, call!(my_custom_parser), eof!());
内容的提问来源于stack exchange,提问作者user2722968
相关产品推荐
相关产品推荐

