我有两个问题。我展示的行为是否正确,如果是,是否在某个地方记录在案?
我在玩语法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开始,在字符串中的最后一个位置结束。这是模式之外的事情。
没有两个正则表达式效果。规则
适用于: sigspace
。之后,定义语法。当您调用. parse
时,它从字符串的开头开始,一直到结尾(或者失败)。锚定不是语法的一部分。这是. parse
应用语法的一部分。
我的主要问题是文档中某些内容的措辞很奇怪。他们在技术上并没有错,但他们也倾向于假设读者可能不知道的知识。在这种情况下,关于锚定TOP
的随意评论并不像看上去那么特别。传递给的任何规则。parse
以相同的方式锚定。除了调用中的
。:rule
的默认值之外,该规则名称没有任何特殊行为。解析
这种行为是有意的,是这些语言特征的结晶:
>
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 优先规则的使用技巧和注意事项,需要的朋友参考一下 示例 几个词法分析器规则可以匹配相同的输入文本。在这种情况下,令牌类型将选择如下: 首先,选择与最长输入匹配的词法分析器规则 如果文本与隐式定义的标记匹配(例如'{'),请使用隐式规则 如果多个词法分析器规则匹配相同的输入长度,请根据定义顺序选择第一个 以下是组合语法: 给出以下输入: 将从词法