Raku:捕获标记的效果在“更高处”消失

2023-12-21

以下 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包含不带引号的字符串值,正如捕获市场的预期一样<( ... )>。 然而,令我惊讶的是,引用are包括在value.

有没有解决的办法?


TL;DR Use "multiple dispatch".[1,2] See @user0721090601's answer for a thorough explanation of why things are as they are. See @p6steve's for a really smart change to your grammar if you want your number syntax to match Raku's.

多调度解决方案

有没有解决的办法?

一种方法是切换到显式多重调度。

您目前有一个value调用特定命名值变体的令牌:

    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!」

惊喜

令我惊讶的是,引号包含在value.

I too was initially surprised.[3]

但目前的行为对我来说至少在以下方面也有意义:

  • 现有的行为在某些情况下是有价值的;

  • 如果我预料到了这一点,也就不足为奇了,我想在其他情况下我很可能会这样做;

  • 很难看出如果一个人会如何得到当前的行为was想要的结果却按照你(和我)最初的预期工作;

  • 有一个解决方案,如上所述。

脚注

[1] Use of multiple dispatch[2] is a solution, but seems overly complex imo given the original problem. Perhaps there's a simpler solution. Perhaps someone will provide it in another answer to your question. If not, I would hope that we one day have at least one much simpler solution. However, I wouldn't be surprised if we don't get one for many years. We have the above solution, and there's plenty else to do.

[2] While you can declare, say, method value:foo { ... } and write a method (provided each such method returns a match object), I don't think Rakudo uses the usual multiple method dispatch mechanism to dispatch to non-method rule alternations but instead uses an NFA https://en.wikipedia.org/wiki/Nondeterministic_finite_automaton.

[3] Some might argue that it "should", "could", or "would" "be for the best" if Raku did as we expected. I find I think my best thoughts if I generally avoid [sh|c|w]oulding about bugs/features unless I'm willing to take any and all downsides that others raise into consideration and am willing to help do the work needed to get things done. So I'll just say that I'm currently seeing it as 10% bug, 90% feature, but "could" swing to 100% bug or 100% feature depending on whether I'd want that behaviour or not in a given scenario, and depending on what others think.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Raku:捕获标记的效果在“更高处”消失 的相关文章

  • 删除匹配前的一个单词和一个单词

    匹配之前的一个单词可以是一组任何符号 例如 D E F 我有一个正则表达式 s w s XXX 输入示例 This is KKK M D D xXx PPP输出示例 This is KKK PPP 所以我需要删除 XXX 之前的 1 个单词
  • 使用十进制数有理数是否会影响 Perl 6 的性能

    据我了解 Perl 6 尽可能将小数实现为有理数 以避免大多数其他语言中存在的浮点问题 有人做过基准测试或了解这样做的性能损失吗 使用十进制数有理数是否会影响 Perl 6 的性能 我认为最有用的总体答案是 不 不是真的 但让我详细说明一下
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本
  • 如何从字符串中删除所有数字?

    我想删除字符串 0 9 中的所有数字 我写了这段有效的代码 words preg replace 0 words remove numbers words preg replace 1 words remove numbers words
  • RegularExpressionAttribute - 如何使其客户端验证不区分大小写?

    我有一个用于客户端验证的字符串 private const String regex b d 5 s s d 5 A Z 2 d 3 s s 1 d 3 s 我在我的中使用这个字符串 RegularExpression regex Erro
  • Python 非贪婪正则表达式

    我如何制作一个像这样的Python正则表达式 这样 给定 a b c d e 蟒蛇匹配 b 代替 b c d 我知道我可以使用 代替 但我正在寻找一种更通用的解决方案 使我的正则表达式更加干净 有没有办法告诉python 嘿 尽快匹配这个
  • Java 正则表达式 - 字母数字,最多一个连字符,句点或下划线,七个字符长

    我是 Java 正则表达式工具的新手 尽管它们潜力巨大 但我很难完成这项任务 我想编写一个正则表达式来验证遵循以下语法的输入字符串 小写字母和数字的任意组合 仅一个下划线 一个破折号或一个句号 无其他特殊字符 最小长度为 5 我想出了以下解
  • netsh 结果到 PowerShell 对象

    我正在尝试与NETSH https ss64 com nt netsh html来自 PowerShell 我想看到这个命令的结果 例如一个对象 但是netsh返回一个字符串 netsh wlan show hostednetwork Ge
  • 为什么这些非捕获正则表达式组不能正常工作?

    所以我花了很多时间在另一个堆栈溢出问题上 同样的问题又出现在上一个问题上 非捕获组并没有像我期望的那样工作 至少我是这么认为的 这是一个愚蠢的例子 类似于其他人的 CSS 测试字符串 这是我的正则表达式 rgb S 这是测试字符串 1px
  • ORA-12728: 正则表达式中的范围无效

    我想检查表中是否插入了有效的电话号码 所以我的触发代码在这里 select start index into mob index from gmarg mobile operators where START INDEX substr ne
  • Javascript:删除字符串标点符号并拆分成单词?

    抱歉 如果之前有人问过这个问题 但我正在尝试从这样的字符串中获取单词数组 Exclamation Question Quotes Apostrophe Wasn t Couldn t Didn t 该数组应该看起来像这样 exclamati
  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • 根据特定字符获取整个字符串或子字符串

    我有一个包含 MIME 类型的字符串 例如application json 现在我想将其与实际的 HTTP 标头进行比较 在本例中content type 如果标头包含 MIME 类型 那么就很简单 if mimeType contentT
  • 正则表达式上的换行符

    我试图替换两个标签之间的所有内容 但我无法构建正确的表达式 这就是我所做的
  • 如何使正则表达式匹配不区分大小写?

    我有以下正则表达式加拿大的邮政编码 http en wikipedia org wiki Postal codes in Canada ABCEGHJKLMNPRSTVXY 1 d 1 A Z 1 d 1 A Z 1 d 1 它工作正常 但
  • [A-z0-9]+ 正则表达式匹配方括号[重复]

    这个问题在这里已经有答案了 我正在努力解决以下正则表达式 A z0 9 如果针对此字符串进行测试 a919238 a asd 它返回a919238 包括方括号 我尝试输入我在 regex101 上的测试用例 https www regex1
  • 如何通过php获取网页的Open Graph协议?

    PHP 有一个简单的命令来获取网页的元标记 get meta tags 但这仅适用于具有名称属性的元标记 然而 开放图谱协议如今变得越来越流行 从网页获取 opg 值的最简单方法是什么 例如 我看到的基本方法是通过 cURL 获取页面并使用
  • vim 中的正则表达式查找和替换:向数字添加 .0

    我有一个如下所示的文件 1 1 0 1 6 1 0 2 8 1 0 3 10 1 0 4 12 1 0 6 如何为所有数字添加 0 后面的数字除外 我认为用正则表达式来做到这一点应该不会太难 但是我的正则表达式知识太生疏了 使用 VIM s
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 如何在 gulp.src 中使用基本正则表达式?

    我正在尝试选择两个文件gulp src highcharts js and highcharts src js 当然 我知道我可以使用数组表达式显式添加这两个表达式 但出于学习目的 我尝试为它们编写一个表达式 我读过可以使用简单的正则表达式

随机推荐

  • SwiftUI .deleteDisabled() 未按预期工作

    iOS 16 刚刚发布 我正在尝试更新我的应用程序 在做这件事的时候 我偶然发现了一个问题 在 iOS 15 中 我有一个可以删除项目的列表 但这只有当 isEditing 变量为true 问题是 deleteDisabled 没有做我期望
  • java中使用zxing扫描多个条形码

    我需要从 tiff 读取 pdf417 条形码 图像上通常有多个条形码 这是我的代码 InputStream in null BufferedImage bfi null File files new File DIR listFiles
  • 如何使用 HTML、CSS 使背景 div 内弯曲? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望我的部分背景看起来像最后的图片所示 我该如何使用 css 来做到这一点 bg width 400px height 200px
  • 当我将 android.permission.UPDATE_DEVICE_STATS 添加到我的 app.error 时发生

    我开发了一个应用程序 需要获取android permission UPDATE DEVICE STATS允许 但是 当我将此权限添加到我的应用程序 AndroidManifest xml 文件时 出现此错误 权限仅授予系统应用程序 我可以
  • 为什么 FFMPEG 总是生成很大的 WebM 文件?

    我正在尝试将我的电影编码为 WebM ffmpeg i input MOV codec v libvpx quality good cpu used 0 b v 10k qmin 10 qmax 42 maxrate 10k bufsize
  • Thymeleaf 装饰器不工作

    我创建了一个新的 Spring boot 项目 并希望将 Thymeleaf 与 LayoutDialect 结合使用 我的 pom xml 有以下依赖项
  • Ruby - 从字符串中删除模式

    我有一个字符串模式 作为示例 如下所示 WBA Skinny Joe vs Hefty Hal 我想从字符串中截断模式 WBA 并仅返回 Skinny Joe vs Hefty Hal 假设 WBA 位置是任意字母或数字的序列 后跟空格 破
  • 如何在性能损失很小的情况下包装 React 组件?

    我的团队使用 React材质用户界面 https material ui next com 图书馆 为了提供一致的 UI 模式并方便我们自定义 MaterialUI 的组件 我们将每个 MaterialUI 的组件包装在我们自己的组件中 例
  • Azure AD B2C - 如何实施自定义注册流程?

    这基本上是我之前问题的后续 https stackoverflow com a 44738654 2896495 https stackoverflow com a 44738654 2896495 我已经在我的 Web 应用程序 NET
  • 如何从外部分离 gdb 会话?

    我使用如下命令在后台启动 gdb 会话 gdb batch command tmp my automated breakpoints gdb p pid of proces gt gt tmp gdb results log The 最后让
  • 如何确定当前文化/区域设置是否使用 am/pm 还是 24 小时时间?

    我需要确定当前的区域性 区域设置是否设置为使用 am pm 时间或 24 小时时间 起初我以为我可以这样做 bool time24Hour Thread CurrentThread CurrentCulture DateTimeFormat
  • 使用 info.plist 存储多目标应用程序的特定于目标的值

    我有一个多目标 iPhone 应用程序 当前包含一个带有常量定义的头文件 这些常量定义在构建时有条件地包含 具体取决于正在构建的目标 但是 我想知道是否最好将此信息包含在构建的 info plist 中 因为这通常包含特定于目标的元 因此逻
  • 从后面的代码调用 javascript

    我有一个 c asp net 3 5 应用程序 我试图在某个事件发生后从代码后面打开一个窗口 我有这个 但它不起作用 并且 firebug 中没有错误 protected override void OnPreRender EventArg
  • 浏览器中跨时区的相同日期时间 - 在预订引擎上

    我正在寻找在任何浏览器中使用同一时间在国际上预订服务的最佳实践 解决方案 我不太明白其中的逻辑 也在这里挖掘 Use case 布鲁塞尔预订的用户假设有一家位于新加坡的理发服务 他一周后将飞往那里 他在浏览器日期时间控件中选择 14 00
  • Android:对Fragment使用Activity的默认动画

    我需要在片段替换中使用活动默认动画 但是使用android R anim我找不到它 我怎样才能找到它的名字 是否可以默认使用它 或者我必须手动创建动画才能使用它 预先非常感谢 在搜索了这个确切的问题后 我在 Google 论坛上找到了这个资
  • Liferay 7 无法设置全局会话属性

    我正在尝试设置会话属性 HTTP 或 Portlet 会话 以便我可以全局访问它 通过门户 但是 在获取 Session 属性时 它返回的是 null 而不是实际值 设置会话属性 Component immediate true prope
  • 调用 PowerMockito.mockStatic 时出现 AbstractMethodError

    我正在尝试使用 PowerMockito 来模拟静态调用 然而 当我尝试这样做时 PowerMockito mockStatic调用抛出一个 AbstractMethodError java lang AbstractMethodError
  • Android WebView:检查网页是否消耗了触摸

    如果我触摸我的 WebView 有没有办法检查我的 WebView 内容 网页 是否实际使用 消耗了触摸 在这种情况下我想要做什么 如果用户触摸屏幕一侧的边距 如果下面没有按钮 href等 当网页内容没有使用 消耗触摸时 我自己使用它 在
  • 登录前添加监听

    我一直在使用 symfony 3 创建 Web 应用程序 我已使用 EWZRecaptchaBundle 将 Recaptcha 添加到我的登录表单中 如何在登录前添加侦听器以验证 Recaptcha 的验证
  • Raku:捕获标记的效果在“更高处”消失

    以下 Raku 脚本 usr bin env raku use v6 d grammar MyGrammar rule TOP