我如何才能最好地使用Perl的Regexp :: Grammars进行平衡引用?

时间:2010-06-15 16:34:20

标签: regex perl grammar regexp-grammars

使用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令牌?我可以预处理该令牌或将其折叠到上面吗?或者,完全编写一个更好的结构,不需要它?

2 个答案:

答案 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