使用 perl 的 Regexp::Grammars,如何进行依赖于 $MATCH 的捕获?

发布于 2024-09-05 15:14:14 字数 662 浏览 1 评论 0 原文

我有一个这样的令牌:

<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}

但这似乎并不有效的。我可以验证我的原始令牌是否有效 会随着该值而消失,并且,如果我对它进行硬编码,我会得到正确捕获并且一切正常?那么,我如何在拥有动态模式的同时获得合理的结果呢?

I've got a token like such:

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

and what I want to happen is for delim2 to capture and be set to the value of delim. When I run this, delim2 is set, but the capture is never done. I think this is an error in my reasoning: I'm trying to chain this form:

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

and this form: (?{ MATCH{delim} }) into something like this

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

but this simply doesn't seem valid. I can verify my original token works <delim2=((?{ die $MATCH{delim} }))> will die with the value, and, if I hard code it, I get the right capture and everything works <delim2=(')>? So how do I go about achieving sane results, while having a dynamic pattern?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青芜 2024-09-12 15:14:14

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

你可以做一些类似的事情

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

,虽然很可怕,但在测试中似乎有效。或者你可以放弃并转到 Parse::RecDescent ,它对此类事情有更好的支持。或者你可以开始破解 R::G。

(?{ $MATCH{delim} }) doesn't assert that $MATCH{delim} appears here in the input; only that it's a true value. Regexp::Grammars should have a "named-backreference" construct like perl \k<NAME> but it doesn't (and you can't use \k<NAME> because Regexp::Grammars stores its results somewhere entirely different).

You could do something like

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

which is horrible but seems to work in testing. Or you could give in and go to Parse::RecDescent which has better support for this kind of thing. Or you could start hacking on R::G.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文