ai didi

regex - Raku:捕获标记的效果丢失 "higher up"

转载 作者:行者123 更新时间:2023-12-03 09:56:32 24 4
gpt4 key购买 nike

以下 Raku 脚本:

#!/usr/bin/env raku
use v6.d;

grammar MyGrammar
{
rule TOP { <keyword> '=' <value> }
token keyword { \w+ }
token value { <strvalue> | <numvalue> }
token strvalue { '"' <( <-["]>* )> '"' }
token numvalue { '-'? \d+ [ '.' \d* ]? }
}

say MyGrammar.parse('foo = 42');
say MyGrammar.parse('bar = "Hello, World!"');
具有以下输出:
「foo = 42」
keyword => 「foo」
value => 「42」
numvalue => 「42」
「bar = "Hello, World!"」
keyword => 「bar」
value => 「"Hello, World!"」
strvalue => 「Hello, World!」
对于第二项,请注意 strvalue包含不带引号的字符串值,与捕获市场 <( 的预期一致... )> .
然而,令我惊讶的是,引号包含在 value 中。 .
有没有解决的办法?

最佳答案

TL;DR 使用“多次调度”。 [1,2] 请参阅@user0721090601 的回答,详细了解为什么会如此。如果您希望您的数字语法与 Raku 相匹配,请参阅 @p6steve 对您的语法进行非常聪明的更改。
多分派(dispatch)解决方案

Is there a way around this?


一种方法是切换到显式多分派(dispatch)。
您目前有一个 value调用专门命名的值变体的 token :
    token value { <strvalue> | <numvalue> }
将其替换为:
    proto token value {*}
然后根据语法多个调度目标规则重命名被调用的标记,因此语法变为:
grammar MyGrammar
{
rule TOP { <keyword> '=' <value> }
token keyword { \w+ }
proto token value {*}
token value:str { '"' <( <-["]>* )> '"' }
token value:num { '-'? \d+ [ '.' \d* ]? }
}

say MyGrammar.parse('foo = 42');
say MyGrammar.parse('bar = "Hello, World!"');
这显示:
「foo = 42」
keyword => 「foo」
value => 「42」
「bar = "Hello, World!"」
keyword => 「bar」
value => 「Hello, World!」
默认情况下,这不会捕获单个交替。我们可以坚持使用“多次调度”,但重新引入子捕获的命名:
grammar MyGrammar
{
rule TOP { <keyword> '=' <value> }
token keyword { \w+ }
proto token value { * }
token value:str { '"' <( $<strvalue>=(<-["]>*) )> '"' }
token value:num { $<numvalue>=('-'? \d+ [ '.' \d* ]?) }
}

say MyGrammar.parse('foo = 42');
say MyGrammar.parse('bar = "Hello, World!"');
显示:
「foo = 42」
keyword => 「foo」
value => 「42」
numvalue => 「42」
「bar = "Hello, World!"」
keyword => 「bar」
value => 「Hello, World!」
strvalue => 「Hello, World!」
惊喜

to my surprise, the quotes are included in value.


我最初也很惊讶。 [3]
但至少在以下方面,当前的行为对我来说也很有意义:
  • 现有行为在某些情况下是有值(value)的;
  • 如果我期待它,那就不足为奇了,我认为在其他情况下我很可能会这样做;
  • 很难看出一个人将如何获得当前行为,如果它是想要的,而是按照你(和我)最初预期的那样工作;
  • 有一个解决方案,如上所述。

  • 脚注
    [1] 使用多个调度 [2] 是一个解决方案,但考虑到原始问题,imo 似乎过于复杂。也许有一个更简单的解决方案。也许有人会在您的问题的另一个答案中提供它。如果没有,我希望有一天我们至少有一个更简单的解决方案。但是,如果我们多年没有得到一个,我不会感到惊讶。我们有上述解决方案,还有很多其他工作要做。
    [2] 虽然您可以声明 method value:foo { ... }并编写一个方法(假设每个这样的方法返回一个匹配对象),我不认为 Rakudo 使用通常的多方法分派(dispatch)机制来分派(dispatch)到非方法规则交替,而是使用 NFA .
    [3] 有些人可能会争辩说,如果 Raku 符合我们的预期,它“应该”、“可以”或“将”“做到最好”。如果我通常避免 [sh|c|w] 关于错误/功能,我发现我认为我的最佳想法,除非我愿意考虑其他人提出的任何和所有缺点并愿意帮助完成所需的工作做的事情。所以我只想说,我目前将其视为 10% 错误、90% 功能,但“可能”转向 100% 错误或 100% 功能,具体取决于在给定场景中我是否想要这种行为,并取决于其他人的想法。

    关于regex - Raku:捕获标记的效果丢失 "higher up",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63426361/

    24 4 0
    文章推荐: javascript - 如何在c3中拟合Y轴
    文章推荐: python - 雪花 Pandas pd_writer用NULL写入表
    文章推荐: android - 在 google play 控制台中加载映射文件
    文章推荐: reactjs - 尝试运行npm start命令时出错
    行者123
    个人简介

    我是一名优秀的程序员,十分优秀!

    滴滴打车优惠券免费领取
    滴滴打车优惠券
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com