2

我有一个像这样的令牌:

<delim2=((?{ $MATCH{delim} }))>

我想要发生的是delim2捕获并设置为delim. 当我运行它时,delim2已设置,但捕获从未完成。我认为这是我推理中的一个错误:我正在尝试链接这种形式:

<ALIAS= ( PATTERN )>     Match pattern, save match in $MATCH{ALIAS}

和这种形式:(?{ MATCH{delim} })变成这样的东西

<ALIAS= ( (?{MATCH{delim}) )>     Matches the value of $MATCH{delim} save to $MATCH{delim2}

但这似乎根本不成立。我可以验证我的原始令牌作品<delim2=((?{ die $MATCH{delim} }))>将随着价值而消失,并且,如果我对其进行硬编码,我会得到正确的捕获并且一切正常<delim2=(')>吗?那么,我如何在拥有动态模式的同时实现理智的结果呢?

4

1 回答 1

4

(?{ $MATCH{delim} })没有断言$MATCH{delim}出现在输入中;只是它是一个真正的价值。Regexp::Grammars 应该有一个像 perl 一样的“命名反向引用”结构,\k<NAME>但它没有(你不能使用\k<NAME>,因为 Regexp::Grammars 将其结果存储在完全不同的地方)。

你可以做类似的事情

(??{ quotemeta $MATCH{delim} })<delim2=(?{ $MATCH{delim} })>

这很可怕,但似乎在测试中起作用。或者你可以放弃并去 Parse::RecDescent ,它对这种事情有更好的支持。或者你可以开始对 R::G 进行黑客攻击。

于 2010-06-16T02:22:34.170 回答