作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
perl6 如何决定哪个 proto
token
先匹配?
下面的代码按预期工作,它匹配字符串 1234
, 和 Grammar::Tracer
显示匹配的第一个标记是 s:sym<d>
,这是有道理的,因为它是最长的标记。
但是,如果我将文字更改为 token ,例如,更改 token
three
表格 '3'
至 <digit>
,匹配失败,Grammar::Tracer
显示 s:sym<b>
正在匹配第一。
搬家 s:sym<d>
到顶部,在两种情况下都匹配字符串,但是这种行为的解释是什么?
#!/usr/bin/env perl6
no precompilation;
use Grammar::Tracer;
grammar G {
token TOP { <s> }
proto token s { * }
token s:sym<a> { <one> }
token s:sym<b> { <one> <two> }
token s:sym<c> { <one> <two> <three> }
token s:sym<d> { <one> <two> <three> <four> }
token one { '1' }
token two { '2' }
token three { '3' }
token four { '4' }
}
my $g = G.new;
say $g.parse: '1234';
# Output: Match
# token three { '3' }
TOP
| s
| | s:sym<d>
| | | one
# Output No Match
# token three { <digit> }
TOP
| s
| | s:sym<b>
| | | one
最佳答案
How does perl6 decide which proto token to match against first?
First, select the branch which has the longest declarative prefix.
3
是一个声明性原子。
<foo>
可能是也可能不是;这取决于它包含的内容。
\d
, 是声明性的,而所有以形式形式声明的都是
<foo>
,例如
<digit>
, 不是。
<ws>
模式不是声明性的。鉴于
rules
中原子之后的空格被转换为
<ws>
,这意味着第一个这样的空格终止了该规则的声明性前缀。)
<digit>
atom 不是声明性前缀的一部分,而是终止前缀。
Moving
s:sym<d>
to the top, matches the string in both cases, but what is the explanation for that behavior?
<three>
的变化调用
<digit>
您已将规则更改为三个与最长声明性前缀 (
<one> <two>
) 并列的规则。所以
other tie-breaking rules are used .
关于regex - proto 代币候选排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56157835/
我是一名优秀的程序员,十分优秀!