当前位置: 首页 > 知识库问答 >
问题:

做在Perl 6规则中首先解析锚点或:sigspace?

危彬彬
2023-03-14

我有两个问题。我展示的行为是否正确,如果是,是否在某个地方记录在案?

我在玩语法TOP方法。声明为规则,它意味着字符串锚定的开始和结束以及: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!

我认为这意味着规则首先应用: sigspace,然后应用锚:

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

我希望规则允许前导空格,如果您切换顺序,就会出现这种情况:

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

我可以在规则中为字符串的开头html" target="_blank">添加一个显式标记:

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

现在一切正常:

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

我没有任何理由认为应该是这样或那样。语法文档说发生了两件事,但文档没有说明这些效果的应用顺序:

请注意,如果您正在使用解析。解析方法,自动锚定标记顶部

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

我认为答案是,这个规则实际上并不锚定在模式意义上。这是. parse工作的方式。游标必须从位置0开始,在字符串中的最后一个位置结束。这是模式之外的事情。

共有2个答案

仲浩旷
2023-03-14

没有两个正则表达式效果。规则适用于: sigspace。之后,定义语法。当您调用. parse时,它从字符串的开头开始,一直到结尾(或者失败)。锚定不是语法的一部分。这是. parse应用语法的一部分。

我的主要问题是文档中某些内容的措辞很奇怪。他们在技术上并没有错,但他们也倾向于假设读者可能不知道的知识。在这种情况下,关于锚定TOP的随意评论并不像看上去那么特别。传递给的任何规则。parse以相同的方式锚定。除了调用中的:rule的默认值之外,该规则名称没有任何特殊行为。解析

凌宏大
2023-03-14

这种行为是有意的,是这些语言特征的结晶:

>

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

    从设计文件1(S05:规则和规则,第348行,重点添加):

    这意味着:

    rule TOP { \d+ }
                  ^-------- <.ws> automatically inserted
    
    rule TOP { ^ \d+ $ }
                ^---^-^---- <.ws> automatically inserted
    

    正则表达式是具有词法作用域的一流编译代码

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

    正则表达式修饰符,如:sigspace,包括由规则关键字隐式添加的修饰符,仅适用于它们的词法范围,即它们在编译时出现的源代码片段。S05,第629行1

    规则TOP的锚定在运行时由完成。解析

    S05,第4423行1

    即锚定到字符串的开头不是规则TOP固有的,并且不影响如何解析和编译TOP的词法范围。在调用方法. parse时执行。

    必须这样做,因为相同的语法可以用于不同的起始规则,而不是使用TOP。解析(…,规则=

    所以当你写的时候

    rule TOP { \d+ }
    

    它被编译为

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

    当你的时候。解析该语法,它有效地调用正则表达式代码^

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

    1)设计文档通常不被视为Perl 6语言的福音,但是S05在这方面非常准确,除了它提到了一些尚未实现但计划中的特性。任何想要真正了解Perl 6正则表达式/语法复杂性的人,都可以通过至少一次从上到下阅读完整的S05来获得IMO的良好服务。

  •  类似资料:
    • CloudGate解析规则可以直接导入使用,不需要任何额外的操作,非常方便! 规则列表 规则名称 下载地址 Surge https://async.be/Rule/Basic/Hosts Shadowrocket https://async.be/Rule/Basic/Hosts 解析规则 简要概述:通过实时同步Hosts信息源达到自动更新,同时使用解析模板进行生成。 无需任何其他操作,导入即可使

    • template.defaults.rules art-template 可以自定义模板解析规则,默认配置了原始语法与标准语法。 修改界定符 // 原始语法的界定符规则 template.defaults.rules[0].test = /<%(#?)((?:==|=#|[=-])?)[ \t]*([\w\W]*?)[ \t]*(-?)%>/; // 标准语法的界定符规则 template.def

    • 作为实践,我正在尝试解析一些作为shell命令输出的标准文本。 我想使用Perl6语法,我想在单独的令牌或正则表达式中捕获每个字段。因此,我做了以下语法: 我的想法是,正则表达式找到一个关键字,然后开始收集所有数据,直到下一个关键字。然而,每次我都会得到“池”:- 我不知道当它找到一个关键字时,如何让它停止吃掉字符,然后将其视为另一个关键字。

    • phpGrace url 解析规则,如下: http://www.xxx.com/ = http://www.xxx.com/index/index -------域名-------- --------域名------控制器-方法 -- http://www.xxx.com/index/test --------域名------控制器-方法-- http://www.xxx.com/a

    • 可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?

    • 本文向大家介绍ANTLR 优先规则,包括了ANTLR 优先规则的使用技巧和注意事项,需要的朋友参考一下 示例 几个词法分析器规则可以匹配相同的输入文本。在这种情况下,令牌类型将选择如下: 首先,选择与最长输入匹配的词法分析器规则 如果文本与隐式定义的标记匹配(例如'{'),请使用隐式规则 如果多个词法分析器规则匹配相同的输入长度,请根据定义顺序选择第一个 以下是组合语法: 给出以下输入: 将从词法