Perl 6 语法与我认为的不匹配

2024-04-17

我正在做代码出现第 9 天 http://adventofcode.com/2017/day/9:

您坐了一会儿并记录了流的一部分(您的谜题输入)。这些字符代表组 - 开头的序列{并结束于}。在一个组内,有零个或多个其他东西,用逗号分隔:要么是另一个组,要么是垃圾。由于组可以包含其他组,因此}只关闭最近打开的未关闭组 - 也就是说,它们是可嵌套的。您的谜题输入代表一个单一的大组,该组本身包含许多较小的组。

有时,你会发现垃圾而不是一群人。垃圾开始于<并以>。在这些尖括号之间,几乎可以出现任何字符,包括{ and }。垃圾内,<没有特殊意义。

在徒劳地尝试清理垃圾时,某些程序使用以下命令取消了其中的一些字符!: 在垃圾内,后面的任何字符!应该被忽略,包括<, >,甚至还有另一个!.

当然,这对于 Perl 6 语法来说是令人尖叫的......

grammar Stream
{
    rule TOP { ^ <group> $ }

    rule group { '{' [ <group> || <garbage> ]* % ',' '}' }
    rule garbage { '<' [ <garbchar> | <garbignore> ]* '>' }

    token garbignore { '!' . }
    token garbchar { <-[ !> ]> }
}

这在简单的例子上似乎工作得很好,但在两个例子上就会出错garbchar连续:

say Stream.parse('{<aa>}');

gives Nil.

Grammar::Tracer没有帮助:

TOP
|  group
|  |  group
|  |  * FAIL
|  |  garbage
|  |  |  garbchar
|  |  |  * MATCH "a"
|  |  * FAIL
|  * FAIL
* FAIL
Nil

多种的garbignore没问题:

say Stream.parse('{<!!a!a>}');

gives:

「{<!!a!a>}」
 group => 「{<!!a!a>}」
  garbage => 「<!!a!a>」
   garbignore => 「!!」
   garbchar => 「a」
   garbignore => 「!a」

有任何想法吗?


UPD鉴于代码问题的出现没有提到空格,您不应该使用rule完全构建。只需切换所有rules to tokens,你应该已经设置好了。一般来说,遵循布拉德的建议——使用token除非你know你需要一个rule(下面讨论)或regex(如果您需要回溯)。


我最初的回答如下探讨了为什么rule没用。我暂时把它留在里面。


TL;DR <garbchar> |包含一个空格。直接跟在任何后面的空格atom https://en.wikipedia.org/wiki/Regular_expression#Syntax in a rule表示标记化中断。您可以简单地删除这个不适当的空间,即写<garbchar>|相反(或者更好的是,<.garbchar>|如果你不需要捕获垃圾)来得到你想要的结果。


正如您最初的问题所允许的那样,这不是一个错误,只是您的思维模型关闭了。

您的回答正确地指出了问题:代币化 https://en.wikipedia.org/wiki/Lexical_analysis#Tokenization.

所以我们剩下的是你的后续问题,这是关于你的标记化的心理模型,或者至少是 Perl 6 默认情况下如何标记化:

为什么...我的第二个例子...连续两个 garbchars 出错:

'{<aa>}'

简单来说,问题是如何对其进行标记:

aa

简单的高级答案是,在解析白话时,aa通常将被视为一个标记,而不是两个,并且默认情况下,Perl 6 采用这一普通定义。这就是您遇到的问题。

您可以推翻这个普通定义以获得您想要实现的任何标记化结果。但很少有必要这样做,而且在像这样的简单情况下当然也不需要这样做。

我将提供两条冗余路径,希望它们能引导人们找到正确的心智模型:

  • 对于那些喜欢直接深入细节的人来说,有我最近写的关于 Perl 6 中标记化的 Reddit 评论 https://www.reddit.com/r/perl6/comments/7fa0wg/the_publisher_of_a_guide_to_parsing_is/dqaety3/.

  • 这个答案的其余部分提供了高级讨论,补充了我的 reddit 评论中的低级解释。

摘自维基百科页面关于标记化的“障碍”部分 https://en.wikipedia.org/wiki/Lexical_analysis#Obstacles,并将摘录与 P6 的具体讨论交织在一起:

通常,标记化发生在单词级别。然而,有时很难定义“词”的含义。分词器通常依赖于简单的启发式方法,例如:

  • 标点符号和空格可能包含也可能不包含在生成的标记列表中。

在 Perl 6 中,您可以使用与标记化正交的捕获功能来控制解析树中包含或不包含的内容。

  • 所有连续的字母字符串都是一个标记的一部分;数字也是如此。

  • 标记由空白字符(例如空格或换行符)或标点符号分隔。

默认情况下,Perl 6 设计体现了这两种启发式的等效方法。

得到的关键是它是rule处理一串标记(复数)的构造。这token构造用于定义每次调用一个令牌.

我想我的回答就到这里结束了,因为它已经很长了。请使用评论来帮助我们改进这个答案。我希望到目前为止我所写的内容有所帮助。

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

Perl 6 语法与我认为的不匹配 的相关文章

  • 正则表达式奇/偶数

    我有一个正则表达式问题 我不知道该怎么做 它必须匹配开头包含任意数量的 a 的所有字符串 如果 a 的数量为偶数 则匹配单个 0 如果 a 的数量为奇数 则匹配单个 1 如何跟踪偶数 奇数 Sample aaa1 aaaa0 a aa 1
  • Perl Regex:如何从 CSV 行中删除引号内的引号

    我从 CSV 文件中得到了一行 作为场围场和 作为字段分隔符作为字符串 有时有 在打破场围的数据中 我正在寻找一个正则表达式来删除这些 我的字符串看起来像这样 my csv qq 123456 024003 Stuff 28 stuff w
  • .NET 查询字符串值的正则表达式

    我需要从 Url PathAndQuery 中删除任何 id SomeValue 其中 SomeValue 可以是整数或字符串 它后面可能有也可能没有另一个 符号 所以它可能是 somepage aspx cat 22 id SomeId
  • preg_replace 内的 preg_replace

    现在我在替换已经从 preg match 中出来的字符串时遇到问题 假设我有 bbcode b bla b 我有这部分正在替换 b with b 但我们只是说出于所有测试目的 他们所做的 b hi b test b b 最终出来的是 hi
  • 如何验证字符串仅包含字母、数字、下划线和破折号? [复制]

    这个问题在这里已经有答案了 如果我迭代字符串中的所有字符 我知道如何做到这一点 但我正在寻找一种更优雅的方法 正则表达式只需很少的代码即可实现这一目的 import re if re match A Za z0 9 my little st
  • 在 Cocoa 应用程序中验证用户输入的 URL 的最佳方法是什么?

    我正在尝试构建一个自制的网络浏览器 以更加熟练地使用 Cocoa 我需要一种好方法来验证用户是否输入了有效的 URL 我尝试过一些正则表达式 但 NSString 有一些有趣的怪癖 并且不喜欢我见过的大多数正则表达式使用的一些反引号 你可以
  • 如何确定输入的模式是“Int,VarChar,Date,Time ...”等

    我有一个下拉菜单 其中包含DataType 和一个文本框 这是用于输入的Regex Pattern 如果我进入 test 在文本框中 或从下拉菜单中选择Int 如果在文本框中输入 则其模式是错误的 0 9 那么它的correct patte
  • 当存在多个字段分隔符时使用 AWK 忽略字段内的逗号

    我想像下面这样解析 CSV 记录awk or gawk 这些字段以逗号分隔 但最后一个字段 6 很特殊 因为它确实由子字段组成 这些子字段由 作为字段分隔符 或者 准确地说 分隔 这本身不是问题 我可以使用awk F 设置替代字段分隔符 但
  • 如何检查有效的电子邮件地址? [复制]

    这个问题在这里已经有答案了 有没有一种好方法可以使用正则表达式检查表单输入以确保它是正确样式的电子邮件地址 从昨晚开始就一直在搜索 如果它是子域名电子邮件地址 那么每个回答过人们有关该主题的问题的人似乎也有问题 无关紧要 即使您可以验证电子
  • 正则表达式限制 url 文件夹的通配符

    我想设置一个与 URL 的某些模式匹配的正则表达式 http www domain com folder1 folder2 anything anything index html 这匹配并完成工作 http www domain com
  • PostgreSQL 对 string\varchar 的各种清理

    我必须通过以下方式清理一些 varchar 删除特殊字符 例如 来自封闭列表 我已经成功地通过大量使用replace regexp replace来做到这一点 但我正在寻找类似于SQL Server中的东西 删除以下数字但不删除相邻的数字含
  • 将聊天文本中的成对符号替换为 html 标签,以设置粗体、斜体和删除线样式

    我正在尝试制作 Whatsapp 风格的文本帖子 当用户创建这样的文本时 Hi how are you where are you 然后这个文本会像这样自动改变 Hi你好吗你在哪 我知道我可以使用 php 正则表达式来做到这一点 如下所示
  • 正则表达式的替代(流畅?)界面设计

    我刚刚看到了一个巨大的 Java 正则表达式 这让我对正则表达式的一般可维护性进行了一些思考 我相信大多数人 除了一些糟糕的 Perl 贩子 都会同意正则表达式很难维护 我正在考虑如何解决这种情况 到目前为止 我最有希望的想法是使用流畅的界
  • 如何在 Eclipse 中使用正则表达式将大写字母替换为小写字母?

    我想检查所有源代码文件并替换所有出现的k Xyyy with k xyyy 交换后面的第一个字母k 从大写到小写 我正在使用 Eclipse 对话框来搜索和替换多个文件 现在我有正则表达式 bk A Z 如何指定正则表达式的替换字符串 我刚
  • 如何自定义 Zend_Form 正则表达式错误消息?

    我有以下代码 postcode form gt createElement text postcode postcode gt setLabel Post code postcode gt addValidator regex false
  • 从 Python 中编译的正则表达式中提取命名组正则表达式模式

    我有一个 Python 正则表达式 其中包含多个命名组 但是 如果先前的组已匹配 则可能会错过与一组匹配的模式 因为似乎不允许重叠 举个例子 import re myText sgasgAAAaoasgosaegnsBBBausgisego
  • 如何提取括号(圆括号)之间的文本?

    我有一根绳子User name sales 我想提取括号之间的文本 我该怎么做 我怀疑子字符串 但我无法弄清楚如何阅读 直到右括号 文本的长度会有所不同 如果您希望远离正则表达式 我能想到的最简单的方法是 string input User
  • 如何使用正则表达式进行正确的输入验证?

    我想让用户只输入整数或浮点数 现在我只能输入整数 它允许输入点或逗号 无法找到正确的正则表达式来验证整数和浮点数
  • 如何匹配和删除包含特定字符串的任何行?

    我的网站上有一个巨大的 URL 目录列表 例子 folder folder2 folder3 page htm folder folder2 folder3 page2 htm folder folder2 folder3 page3 ht
  • PHP使用正则表达式查找字符串

    我已经阅读了多个有关正则表达式的教程 但它只是不会留在我的脑海中 我永远无法让我的模式发挥作用 希望有人能帮忙 我有一个 php 变量 content 我需要在其中找到如下所示的特定模式 图库 名称 文件夹 我想搜索 starting wi

随机推荐

  • angularjs指令动态设置模板url

    我正在使用模板 URL 创建指令 我想根据 user role 动态设置模板 URL 任何想法 这是我的指令代码 RatingRX directive headermenu gt directive directive restrict E
  • d3.js:如何创建“力导向图集群”

    我一直在探索 d3 js 库 尤其是力导向图创建 我仔细阅读了 Bostock 等人关于它的论文 并注意到我正在尝试创建的精确类型的图表 基本上是一个力导向图 其中带有围绕羽毛组的颜色编码区域 这是第三列第二行的插图 此处标记为 力导向图簇
  • 从其他容器访问mysql容器

    我已经使用暴露 3306 的 mysql 设置了 docker 容器 我已经指定了数据库用户 数据库密码并创建了一个测试数据库并将权限授予新用户 在另一个容器中 我想访问这个数据库 因此 我使用一个简单的 php 脚本设置了新容器 该脚本在
  • 首先将外键映射到 EF 代码中的非主代理键列

    public class A DatabaseGenerated DatabaseGeneratedOption Identity public virtual int Aid get set public virtual ICollect
  • 选择元素时,CSS 中的插入符号 ^ 有何用途?

    我在文件中遇到了这样的 css 选择器 contactDetails ul li a a href tel 像这样的抑扬符 在 CSS 中没有定义的含义 两字符运算符 可用于属性选择器 http www w3 org TR selector
  • 使用字节将字母数字代码解码为键值对象

    我有一个来自 CS GO 游戏的 十字准线代码 CSGO O4Jsi V36wY rTMGK 9w7qF jQ8WB 我可以使用此函数解码一些值 import BigNumber from bignumber js Intentionall
  • Mongodb php查询,在数组中搜索?

    我正在寻找一种在具有以下结构的 answer 文档数组中搜索关键字 例如 Henrik 的方法 Array id gt MongoId Object id gt 4eeedd9545c717620a000007 formId gt 6 re
  • 使用纬度/经度计算从 A 点到线段的距离

    我正在开发一个使用 GPS 的 Android 应用程序 我想知道如果 新位置 C 点 距离线段 AB 太远 是否有办法可以丢弃 GPS 位置数据 我正在使用发现的点到线段公式在维基百科上 http en wikipedia org wik
  • 在MySQL php中将ID从一个表插入到另一个表

    我有两张桌子 一张是Information另一个是work force 信息 劳动力 当 的时候addInformation 接到电话 我想将数据插入到信息 以及id这是自动增量将插入表workForce 列 twf 这是我尝试过的 添加信
  • 在 BPMN 中用一个任务表示 while 循环的正确方法是什么?

    BPMN 中表示仅重定向到一个任务的简单 while 循环的正确方法是什么 我想说使用循环活动是更好的选择 因为它有助于保持流程模型整洁 在流程中创建循环时也要小心 因为任务定义通常在第一次迭代和第二次迭代之间发生变化 例如第一次迭代是创建
  • 如何使应用程序的触摸栏在 macOS 上始终可见?

    我正在做macOS 菜单栏应用程序 https vidr io显示全屏覆盖 用户可以通过菜单栏中的滑块控制该叠加层的不透明度 我希望将这些控件移至触摸栏 因为该应用程序用于屏幕录制 并且会记录主屏幕上的干扰 我的应用程序中的滑块应该像默认情
  • Spring Security 3.1.0 - 无法从 HTTPS 切换到 HTTP

    我是 Spring Security 的新手 所以我制作了一个小型 Web 应用程序 以便尝试它并找到对我正在从事的项目有用的配置 我强制通过 HTTPS 访问登录页面 登录后需要切换回 HTTP 换句话说 登录页面 仅限 HTTPS 其他
  • iPhone开发-设置UIWebView字体

    我必须显示从服务器提取的富文本 所以我使用 UIWebView 现在的问题是我无法控制 UIWebView 中使用的字体 如何更改字体以使用系统字体 使其与应用程序的其余部分一致 我现在正在做这样的事情 myRichTextView UIW
  • 如何在 AWS CloudWatch Insights 中按字段聚合日志,然后按 bin 聚合日志?

    我正在尝试执行一个查询 该查询将首先按字段计数聚合 然后按bin 1h 例如我想得到如下结果 Date Field Count 1 2019 01 01T10 00 00 000Z A 123 2 2019 01 01T11 00 00 0
  • 存档的 macOS 应用程序启动时显示空白窗口

    我有一个 macOS 应用程序 其中包含一个 ViewController 可以重命名应用程序窗口并调整其大小 有几个按钮 以及一个在启动时加载默认网页的 WKWebView 该项目本身是一个 xcworkspace 文件 因为它包含用于
  • 对外部程序的非阻塞调用,不会丢失返回码

    当从 Matlab 中启动外部程序 为了简洁起见 我们将其称为 EX 时 我可以这样做 status result system EX exe 它将阻塞直到 EX 返回 或者像这样 status result system start EX
  • 如何在winform和wpf中以编程方式实现鼠标移动、单击、右键单击和按键等?

    如何在 winform 和 wpf 中以编程方式移动鼠标 单击 右键单击和按键等 如果可能的话 请帮我提供代码片段 如果我正确理解你的问题 那么你想真正模拟输入 在这种情况下SendInput是要走的路 从这个链接 http robrely
  • 存储过程中的 SQL case 语句

    我有一个包含 CASE 语句的 SQL Server 存储过程 但是 如果多个条件成立 我需要附加这些值 因此 如果某个特定记录有失效日期 And 超出里程 我希望这两个值都显示在不可归档原因柱子 我将如何实现这一目标 CASE WHEN
  • 查找列表中不常见的元素

    我正在尝试编写一段可以自动分解表达式的代码 例如 如果我有两个列表 1 2 3 4 和 2 3 5 代码应该能够找到两个列表 2 3 中的公共元素 并组合其余的元素元素一起组成一个新列表 即 1 4 5 从这篇文章 如何找到列表交集 htt
  • Perl 6 语法与我认为的不匹配

    我正在做代码出现第 9 天 http adventofcode com 2017 day 9 您坐了一会儿并记录了流的一部分 您的谜题输入 这些字符代表组 开头的序列 并结束于 在一个组内 有零个或多个其他东西 用逗号分隔 要么是另一个组