2

使用 Damian Conway 的Regexp::Grammars,我尝试匹配不同的平衡引用('foo', "foo",但不是'foo")机制——例如括号、引号、双引号和双美元。这是我目前正在使用的代码。

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

4

2 回答 2

3

Per Damian,答案实际上在文档的“手动结果蒸馏”部分

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 别名覆盖了正常的“返回结果哈希”语义并仅返回其关联的子规则(即)产生的内容。

于 2010-06-15T22:07:23.197 回答
0

使用 Damian 的另一个很棒的模块,Text::Balanced

于 2010-06-15T18:11:31.477 回答