代码之家  ›  专栏  ›  技术社区  ›  Evan Carroll

如何最好地使用Perl的regexp::grammars进行平衡引用?

  •  2
  • Evan Carroll  · 技术社区  · 14 年前

    使用Damian Conway的 Regexp::Grammars ,我正在尝试匹配不同的平衡报价( 'foo' , "foo" ,但不是 'foo" )机制——如parens、quotes、double-quotes和double-dollars。这是我当前使用的代码。

    <token: pair>        \'<literal>\'|\"<literal>\"|\$\$<literal>\$\$
    <token: literal>    [\S]+
    

    这通常很好用,我可以这样说:

    <rule: quote>            QUOTE <.as>? <pair>
    

    我的问题是如何改革输出,以排除 pair 令牌?

    {
      '' => 'QUOTE AS \',\'',
      'quote' => {
                   '' => 'QUOTE AS \',\'',
                   'pair' => {
                               'literal' => ',',
                               '' => '\',\''
                             }
                 }
    },
    

    在这里,显然没有欲望 一对 在中间,引用,和 literal 它的价值。有更好的匹配方法吗 “福” , “福” $$foo$$ 可能有时候 ( foo ) 而不是每次创造一个不必要的 一对 令牌?我可以预先处理掉那个令牌还是将它折叠到上面?或者,完全编写一个更好的结构来消除对它的需求?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Evan Carroll    14 年前

    根据达米安的说法,答案其实是 "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>\$\$
    

    医生说:

    Grammar还提供对蒸馏过程的完全手动控制。如果使用保留字match作为子规则调用[…]的别名,请注意,在第二种情况下,即使并被捕获到结果哈希,也不会返回它们,因为匹配别名会覆盖正常的“返回结果哈希”语义,并只返回其关联子规则(即)生成的结果。

        2
  •  0
  •   codeholic    14 年前

    使用达米安的另一个伟大模块, Text::Balanced .

    推荐文章