Perl 6 规则中 .parse 锚点还是 :sigspace 首先?

2024-03-28

我有两个问题。我表现出的行为是否正确?如果是,它是否记录在某处?

我在玩语法TOP方法。宣布为rule,它意味着字符串的开头和结尾锚点以及:sigspace:

grammar Number {
    rule TOP { \d+ }
    }

my @strings = '137', '137 ', ' 137 ';

for @strings -> $string {
    my $result = Number.parse( $string );
    given $result {
        when Match { put "<$string> worked!" }
        when Any   { put "<$string> failed!" }
        }
    }

如果没有空格或只有尾随空格,则字符串将被解析。由于前导空格,它会失败:

<137> worked!
<137 > worked!
< 137 > failed!

我想这意味着rule正在申请:sigspace首先是锚点,然后是锚点:

grammar Foo {
    regex TOP { ^ :sigspace \d+ $ }
    }

我期待一个rule允许前导空格,如果你改变顺序就会发生这种情况:

grammar Foo {
    regex TOP { :sigspace ^  \d+ $ }
    }

我可以添加一个显式标记rule对于字符串的开头:

grammar Number {
    rule TOP { ^ \d+ }
    }

现在一切正常:

<137> worked!
<137 > worked!
< 137 > worked!

我没有任何理由认为应该是其中一种方式。这语法文档 https://docs.perl6.org/language/grammars说发生了两件事,但文档没有说明这些效果适用的顺序:

请注意,如果您使用 .parse 方法进行解析,则标记 TOP 会自动锚定

and

当使用规则而不是标记时,原子后面的任何空格都会变成对 ws 的非捕获调用。


我认为答案是该规则实际上并不是以模式意义为基础的。就是这样.parse作品。光标必须从位置 0 开始,到字符串中的最后一个位置结束。这是模式之外的东西。


该行为是有意为之的,并且是这些语言功能的顶峰:

  • Sigspace 忽略第一个原子之前的空格。

    From the design docs1 (S05: Regexes and Rules, line 348 http://design.perl6.org/S05.html#line_348, emphasis added):

    The new :s (:sigspace) modifier causes certain whitespace sequences to be considered "significant"; they are replaced by a whitespace matching rule, . Only whitespace sequences immediately following a matching construct (atom, quantified atom, or assertion) are eligible. Initial whitespace is ignored at the front of any regex, to make it easy to write rules that can participate in longest-token-matching alternations. Trailing space inside the regex delimiters is significant.

    这意味着:

    
    
    rule TOP { \d+ }
                  ^-------- <.ws> automatically inserted
    
    rule TOP { ^ \d+ $ }
                ^---^-^---- <.ws> automatically inserted
      
  • 正则表达式是具有词法作用域的一流编译代码。

    正则表达式/规则不是一个稍后可能会连接字符以更改其行为的字符串。它是一个独立的例程,在编译时进行解析并确定其行为。

    Regex modifiers like :sigspace, including the one implicitly added by the rule keyword, apply only to their lexical scope - i.e. to the fragment of source code they appear in at compile time. S05, line 629 http://design.perl6.org/S05.html#line_6291:

    The :i, :m, :r, :s, :dba, :Perl5, and Unicode-level modifiers can be placed inside the regex (and are lexically scoped)
  • 的锚定rule TOP在运行时完成.parse.

    S05, line 4423 http://design.perl6.org/S05.html#line_44231:

    The .parse and .parsefile methods anchor to the beginning and ending of the text, and fail if the end of text is not reached. (The TOP rule can check against $ itself if it wishes to produce its own error message.)

    IE。锚定到字符串的开头并不是规则所固有的TOP,并且不影响词法范围TOP被解析和编译。当方法完成时.parse叫做。

    必须是这样,因为相同的语法可以使用不同的起始规则,而不是TOP, using .parse(..., rule => ...).

所以当你写的时候

rule TOP { \d+ }

它被编译为

regex TOP { :r \d+ <.ws> }

而当你.parse该语法,它有效地调用正则表达式代码^ <TOP> $,锚点不属于TOP的词法范围,而不是仅仅calls例行公事TOP。组合的行为就像规则一样TOP被写为:

regex TOP { ^ [:r :s \d+] $ }

1) The design docs are in general not to be taken as gospel for what is or isn't part of the Perl 6 language, but S05 is pretty accurate in that regard, except that it mentions some features that haven't been implemented yet but are planned. Anyone who wants to truly grok the intricacies of Perl 6 regexes/grammars, is IMO well served by reading the full S05 from top to bottom at least once.

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

Perl 6 规则中 .parse 锚点还是 :sigspace 首先? 的相关文章

  • 如何破解已安装的 perl6 模块源?

    我希望能够查看并更改已安装的源代码 通过zef perl6 模块 我怎样才能做到这一点 在我的系统上 模块源位于 perl6 sources 还有一些关于模块的元数据文件 perl6 dist 我也可以使用zef locate 显示模块的源
  • ANSI-C 语法 - 数组声明,如 [*] 等

    ANSI C 语法来自 link http www quut com c ANSI C grammar y html给我以下数组声明规则 1 direct declarator type qualifier list assignment
  • 从 Native 指针中获取数据

    将数据放入 Perl 6 Native 指针中没什么大不了的 sub memcpy Pointer void source Pointer void destination int32 size is native my Blob blob
  • 运算符的优先级和结合性是什么?

    C 中运算符的优先级和结合性是什么 谁定义了运算符优先级和结合性 以及它与求值顺序有何关系 https stackoverflow com q 20767745 5740428解释了这些属性如何从语法中出现 然而 我只是对所有规则的列表感兴
  • 如何引用语法中先前匹配的项目?

    我正在尝试解析 BibTeX 作者字段 并将其拆分为单独的作者 这将帮助我重写每个作者的姓名首字母 这是一个最小的例子 use v6 my str Rockhold Mark L and Yarwood RR and Selker John
  • 乔姆斯基语言类型

    我试图理解四种不同的乔姆斯基语言类型 但我发现的定义对我来说没有任何意义 我知道类型 0 是自由语法 类型 1 是上下文相关的 类型 2 是上下文无关的 而类型 3 是常规的 那么 有人可以解释一下这一点并将其放在上下文中吗 谢谢 语言是属
  • 使用 pyparsing 解析嵌套结构

    我正在尝试解析生物序列中位置的特定语法 职位可以采用以下形式 12 a simple position in the sequence 12 34 a complex position as a base 12 and offset 34
  • 在哪里可以找到 Perl 编程语言的形式语法?

    我知道 Perl 语法是不明确的 并且它的消歧是不平凡的 有时涉及在编译阶段执行代码 http www modernperlbooks com mt 2009 08 on parsing perl 5 html 无论如何 Perl 是否有正
  • 使用 NativeCall 将 C 库函数合并到 Perl6 中

    我正在尝试使用lgamma来自 C 的math h在 Perl6 中 我如何将其合并到 Perl6 中 我努力了 use NativeCall sub lgamma num64 gt num64 is native Str say lgam
  • 语法写作工具[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试用 EBNF 编写语法 除非有很好的理由 否则它必须是 EBNF 并且正在寻找一些实用程序 如果有一个 GUI 界面可以制作一个
  • 在 Rust 中,“as”是一个运算符吗?

    Rust 参考目前说了以下内容the as操作员 https doc rust lang org reference html type cast expressions 7 2 12 5 类型转换表达式 类型转换表达式用二元运算符表示as
  • 在 Perl 6 中使用正则表达式和 .contains 进行过滤

    我经常需要过滤元素array字符串 包含一些子字符串 例如一个字符 因为它可以通过匹配来完成regex或与 contains方法 我决定做一个小测试以确保 contains更快 因此更合适 my array aa cc my constan
  • 在 Ubuntu 15.10 上安装 Perl6 和 Panda。 bootstrap.pl 的问题

    我正在尝试在 Ubuntu 15 10 上安装 Panda 首先我尝试过 git clone recursive git github com tadzik panda git cd panda perl6 bootstrap pl 最后一
  • NLTK 中解析的英语语法

    是否有现成的英语语法可供我加载并在 NLTK 中使用 我搜索了使用 NLTK 进行解析的示例 但似乎我必须在解析句子之前手动指定语法 多谢 你可以看一下pyStat解析器 https github com emilmont pyStatPa
  • 如何使用 preg_match_all() 获取子组匹配的所有捕获? [复制]

    这个问题在这里已经有答案了 更新 注意 我想我可能正在寻找的是得到捕获一组 https stackoverflow com questions 6571106 can you retrieve multiple regex matches
  • 验证英语文本中“a”和“an”的正确使用 - Python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想创建一个程序 从文件中读取文本并指出 a 和 an 何时使用不正确 据我所知 一般规则是当下一个单词以元音开头时使用 an 但还应
  • Perl 6 规则中 .parse 锚点还是 :sigspace 首先?

    我有两个问题 我表现出的行为是否正确 如果是 它是否记录在某处 我在玩语法TOP方法 宣布为rule 它意味着字符串的开头和结尾锚点以及 sigspace grammar Number rule TOP d my strings 137 1
  • 如何在 Perl 6 中追加到文件?

    我正在尝试这个和其他一些事情 但它每次都会截断文件 my file primes txt sub MAIN Int D low Int D high where gt low unless my fh open file w append
  • 对模块进行单元测试时如何模拟导入的子例程

    考虑一个导出连接到互联网并返回结果的子例程的模块 unit module A sub download is export result from internet Not the actual implementation obvious
  • Perl 6:检查元素是否在列表中的最佳方法是什么?

    假设我有一个大数组 stuff and a thing 我想知道是否 thing is in stuff 在 Perl 6 中做到这一点的最佳方法是什么 我所说的 最好 是指 惯用的 可读的 高性能的 不一定按这个顺序 实际上有两个单独的案

随机推荐

  • Eclipse M2E / 更改订单和导出

    我正在 Eclipse Indigo 中处理 Maven 项目 为了编译一些需要认可的库 webservices api jar 的类 我转到 Properties Java Build Path Order and Export 并将 M
  • SpriteKit 粒子发射器未出现在 Xcode 编辑器中

    我经常遇到粒子效果未出现在编辑器中的问题 当我第一次创建它们时 一切正常 但一段时间后它们就不再出现 我只看到黑色背景 但不存在粒子 我能够处理这个问题的唯一方法是删除节点并创建一个具有相同属性的新粒子节点 这是耗时且烦人的 然后 过了一段
  • 会话 cookie 未设置

    无法让 php 的 SESSION 在我的本地计算机上工作 它在实时服务器上工作正常 但在本地计算机上无法工作 我尝试过在 Windows 上使用 apache 和 php 在 Mac 上使用 apache 和 php 在 debian 上
  • 如何将参数传递给 selectExpr? SparkSQL-Scala

    当您有数据框时 您可以使用以下方法添加列并填充其行selectExprt 像这样的事情 scala gt table show idempr tipperrd codperrd tipperrt codperrt OlcM h 999999
  • 如何使用mysql和php获取排序行的位置

    我有一个存储高分以及玩家 ID 的表 我希望能够通过玩家 ID 提取记录 然后获取他们的分数在表中的排名或位置 意思是 基本上我希望能够说 你处于第 N 位置 纯粹基于玩家得分与所有其他得分的比较 例如 如果我位于第 46 位 那么对我来说
  • Chrome 更新 73 - Materialise CSS JS 触发错误

    在最新的 Chrome Update 73 之后 Materialize CSS 0 100 2 的日期选择器 时间选择器和下拉菜单不再工作 当您点击它时它会闪烁 然后消失 知道如何解决这个问题吗 我遇到过同样的问题 现在我做了一些更改以使
  • 如何使用 write 系统调用将 int 写入文件并完全按照写入方式读取它们?

    如何使用 UNIX 的 write 系统调用将 int float 或其他类型写入文件 我想这样做而不使用任何 lib 函数 例如fprintf or fwrite 我想使用文件描述符而不是FILE 再次打开后 文件必须完全按照写入的方式读
  • Java:同步实用程序

    我问这个纯粹是为了确定实施问题类的价值 您是否知道 Java 实用程序类采用非同步实例 使用反射来调查该实例 并返回 包装 在同步调用中的输入实例 即 为任何实例创建同步委托类的工厂 我喜欢乔恩 斯基特的回答 它只见树木而不见森林 但要回答
  • 将枚举序列化为从 Azure Function 返回的 JSON 中的字符串

    有没有办法配置 Azure Functions 如何将对象序列化为 JSON 作为返回值 我想使用字符串而不是整数作为枚举值 例如 给定以下代码 public enum Sauce None Hot public class Dish Js
  • 如何从vb.net代码向水晶报表传递参数

    我创建了一个水晶报告 交叉表 我没有使用任何数据集 而是使用水晶报表中的向导从我的数据库架构中调用过程 给出的提供程序是 Oracle 的 Microsoft OLEDB 提供程序 之后我提供了我的数据库凭据 即架构 用户名 密码 并选择了
  • 如何将 HTML 元素记录为 JavaScript 对象?

    使用 Google Chrome 如果您console log一个对象 它允许您检查控制台中的元素 例如 var a foo bar whiz bang console log a 这打印出来Object可以通过单击旁边的箭头进行检查 但是
  • window.scrollTo 在 Internet Explorer 11 中不起作用

    我希望在启动页面时滚动条默认位于顶部 但是下面的代码在 chrome 中工作正常 但在 IE11 中不行 如果我尝试调试脚本 滚动条位于顶部 document ready function window scrollTo 0 0 我在网上尝
  • Android Seekbar 有两个拇指

    这个问题的变体可以在互联网上找到 但没有答案 我想要一个带有两个拇指范围选择的搜索栏 我愿意自己编程 但缺乏 Android 经验 有人可以给我一些关于从哪里开始的指示吗 我的意思是 我知道我必须扩展一些东西 可能是进度条 但是我应该如何去
  • AngularJS 绑定中的数学函数

    有没有办法在 AngularJS 绑定中使用数学函数 e g p The percentage is Math round 100 count total p 这个小提琴显示了问题 http jsfiddle net ricick jtA9
  • 检查字符串是否包含整数

    您知道可以检查字符串是否包含整数的函数吗 我期望它的工作方式如下 holds int 23 should return true holds int 2 3 should return false holds int qwe should
  • 仅使用 Perl 核心运行单个脚本来自动安装缺少的模块的快速方法是什么?

    我继承了一个应该能够部署到其他服务器的项目 该项目有许多简单的模块依赖项 但这些依赖项可能并不存在于所有目标计算机上 因此 我希望能够运行一个命令行脚本来检查安装了哪些 Perl 模块 并尝试通过 CPAN 自动安装缺少的模块 由于这应该是
  • C# 套接字编程入门 - 最佳实践

    我在这里看到了很多关于套接字的资源 我相信他们都没有涵盖我想知道的细节 在我的应用程序中 服务器执行所有处理并向客户端发送定期更新 这篇文章的目的是涵盖开发套接字应用程序时所需的所有基本思想并讨论最佳实践 以下是您在几乎所有基于套接字的应用
  • 如何模拟Android操作系统卸载后台应用程序?

    出于测试目的 我需要轻松地重现 Android 系统决定保存状态并终止后台应用程序时的情况 就像通常出于内存优化目的所做的那样 事实上 我还需要测试当用户切换回这样一个已删除进程时的恢复过程 直接的方法是打开应用程序 然后打开更多其他任务
  • 如何让点击日历图标时弹出日历?

    我正在研究website http ferhan ferohost com 我想在点击日历图标时弹出日历 我用来放置的 HTML 代码开始日期 and End Date are div class dates div class start
  • Perl 6 规则中 .parse 锚点还是 :sigspace 首先?

    我有两个问题 我表现出的行为是否正确 如果是 它是否记录在某处 我在玩语法TOP方法 宣布为rule 它意味着字符串的开头和结尾锚点以及 sigspace grammar Number rule TOP d my strings 137 1