使用Damian Conway的Regexp::Grammars,我试图匹配不同的平衡引用('foo'
,"foo"
,但不是'foo"
)机制 - 例如parens,引号,双引号和双倍美元。这是我目前正在使用的代码。
<token: pair> \'<literal>\'|\"<literal>\"|\$\$<literal>\$\$
<token: literal> [\S]+
这通常可以正常工作,并允许我这样说:
<rule: quote> QUOTE <.as>? <pair>
我的问题是如何改变输出,排除pair
令牌的针符号?
{
'' => 'QUOTE AS \',\'',
'quote' => {
'' => 'QUOTE AS \',\'',
'pair' => {
'literal' => ',',
'' => '\',\''
}
}
},
在这里,显然不希望在它之间引用pair
,引用它的literal
值。有没有更好的方法来匹配'foo'
,"foo"
和$$foo$$
,有时候( foo )
可能没有创建不必要的pair
令牌?我可以预处理该令牌或将其折叠到上面吗?或者,完全编写一个更好的结构,不需要它?
答案 0 :(得分:3)
Per Damian,答案实际上在文档的"Manual result distillation"部分
The correct answer is to tell your <pair> token
to pass the result of each <literal> subrule through as its own
result, using the MATCH=
alias (see: "Manual result distillation" in the module documentation) like so:
<token: pair> \'<MATCH=literal>\' | \"<MATCH=literal>\" |
\$\$<MATCH=literal>\$\$
以下是文档的说法:
Regexp :: Grammars还提供对蒸馏过程的全面手动控制。如果使用保留字MATCH作为子规则调用的别名[...]请注意,在第二种情况下,即使并且被捕获到结果哈希,也不会返回它们,因为MATCH别名会覆盖正常“返回结果 - 哈希”语义并仅返回其关联的子规则(即)生成的内容。
答案 1 :(得分:0)
使用Damian的另一个伟大模块,Text::Balanced。