- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是一个基于更大语法的测试用例——目标是解析 Unity3D Assets 文件中使用的 YAML 子集。有趣的功能是键控数组匹配器。这个匹配器循环,匹配 data[i]: val
如<array-name(index)><indexer-and-value(index, name)>
. <array-name>
被重载,所以第一次调用时,它会匹配任何名称。随后的迭代——当索引不为零时——将只匹配看到的相同名称。
问题的关键在于,当 index>0 时,数组应该总是有一个已知的名称,并且应该作为参数传递给匹配器。不是——解释器给出以下错误:
Cannot resolve caller array-name(Match.new(...): 1, Nil, 1); none of these signatures match:
(Prefab $: Int $ where { ... }, $prevName, Int $indent, *%_)
(Prefab $: Int $idx, Match $ (@ (Any $prevName, *@)), Int $indent, *%_)
(Prefab $: Int $idx, @ (Any $prevName, *@), Int $indent, *%_)
Nil
,这是没有意义的。注意该函数中被注释掉的 block :
#{ }
.如果未注释,则测试用例将停止失败。没有基于最长匹配的分支(
|
运算符或
proto
匹配器),因此在匹配器中添加额外内容不应更改解析。
#use Grammar::Tracer;
#use Grammar::Debugger;
grammar Prefab {
token TOP {
<key> ':' <value=hash-multiline(1)> \n
}
token key { \w+ }
token kvpair(Int $indent=0) {
[
|| <key> ':' <hash-multiline($indent+1)>
|| <keyed-array($indent)>
|| <key> ': ' (\w+)
]
}
token keyed-array(Int $indent) {
# Keys are built in to the list:
# look for arrayname[0] first, then match subsequent lines more strictly, based on name[idx]
:my $idx = 0;
[
<array-name($idx, $<array-name>, $indent)>
<indexer-and-value($idx++, $indent)>
#{ } # XXX this fixes it, somehow
] +% \n
}
multi token array-name(0, $prevName, Int $indent) {
# the first element doesn't need to match indentation
\w+
}
multi token array-name(Int $idx, Match $ ([$prevName, *@]), Int $indent) {
<.indent($indent)>
$prevName
}
# todo: Can I remove this overload? In testing, the parameter was sometimes an array, sometimes a Match
multi token array-name(Int $idx, [$prevName, *@], Int $indent) {
<.indent($indent)>
$prevName
}
# arr[2]: foo
# ^^^^^^^^ match this
token indexer-and-value(Int $idx, Int $indent) {
'[' ~ ']' $idx
[
|| ':' <hash-multiline($indent+1)>
|| ': ' \w+
]
}
token hash-multiline(Int $indent=0) {
# Note: the hash does not need a newline if it's over after the first (inline) kv-pair!
# optional first line which is on the same line as the previous text:
[
|| [<kvpair($indent)>] [ \n <.indent($indent)> <kvpair($indent)> ]*
|| [ \n <.indent($indent)> <kvpair($indent)> ]+
]
}
multi token indent(0) {
^^ <?>
}
multi token indent(Int $level) {
^^ ' ' ** {2*$level}
}
}
sub MAIN() {
say so Prefab.parse($*kv-list);
}
my $*kv-list = q:to/END/;
Renderer:
m_Color[0]: red
END
最佳答案
timotimo 解释了 IRC 上的问题——匹配变量($/
、$0
、$1
和命名匹配)不是全局的。当匹配器开始时,匹配变量已经被填充。由于性能问题,它们大多*在匹配器主体的其余部分中根本没有更新。但是,当看到代码块(甚至是空 block )时,匹配变量会更新。所以“bug”解决方法实际上是一个有效的解决方案——包括一个空 block 来强制匹配变量更新。
* $0
似乎已更新并立即可用。可能其他编号的比赛也是如此。
更新:似乎唯一没有立即可用的匹配变量是当您在类似代码的上下文中使用它们而不使用 block 时,例如在不同匹配器的参数列表中。在这里,匹配变量在上一次匹配之后立即可用:
my regex word { \w+ };
say 'hellohello' ~~ /<word> $<word>/
my regex repeated($x) { [$x]+ };
say 'ooxoo' ~~ / ^ <repeated('o')> . <repeated($<repeated>)> $ /
my regex repeated($x) { [$x]+ };
say 'ooxoo' ~~ / ^ <repeated('o')> . {} <repeated($<repeated>)> $ /
关于regex - 这个 perl6 语法是坏了,还是暴露了一个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46130716/
我对 DBT 还很陌生,正在尝试探索如何进行曝光。我已经阅读了文档 ( https://docs.getdbt.com/docs/building-a-dbt-project/exposures ),
我对 DBT 还很陌生,正在尝试探索如何进行曝光。我已经阅读了文档 ( https://docs.getdbt.com/docs/building-a-dbt-project/exposures ),
这在Python中合法吗?似乎有效... 谢谢 # with these lines you not need global variables anymore if __name__ == '__m
我正在尝试使用 tomcat Docker 镜像打包一个 war 文件。我正在尝试在图像中公开 tomcat 端口以供外部访问。 这是我的docker文件 FROM tomcat8:3.0.0 C
我一直在尝试通过 ip 连接到 docker 容器,但再次失败。当我使用“docker inspect container-id”时,我得到了这个结果。 我的虚拟盒子默认设置是: 有人可以帮我解决这个
我知道要在 docker 容器中公开端口,您可以使用 -p标志(例如 -p 1-100:1-100 )。但是有没有一种很好的方法可以将大部分可能的端口从容器暴露给主机?例如,如果我在位于 VM 中的容
我正在开发一个带有 ktor 应用程序的 Kotlin,并且我使用暴露为 ORM。我有一个引用另一个表的表。这种关系是多对一的。前任: object Users : IdTable() { ov
我正在尝试学习 polymer ,并且正在尝试制作一个基本的消息传递框架。所以我创建了一个名为 messages-framework 的小 polymer 元素,它将显示消息,并在 3 秒后删除该消息
我的问题很简单也很笼统:当调用 RESTFUL API 时,无论是我的还是外部的,将 token 暴露在前端是否是常见做法/可以?例如,在 Google map api 的文档中,他们建议使用以下代码
我们有一个包含 1000 万条记录的数据库表。我们不想使用 auto_increment,因为那样会让我们的用户知道我们有多少条记录。我们不想将其暴露给我们的竞争对手。我看到的问题是使用 UUID 或
我有以下用户表对象和实体类: object UserTable : IntIdTable() { val name = varchar("name", 256) } class User(id
对于部署在 Google kubernetes 引擎上的基于微服务的示例架构,我需要帮助来验证我的理解: 我们知道服务应该对 pod 副本集的流量进行负载平衡。 当我们创建一个 nginx 入口 Co
String caminhoFoto = getExternalFilesDir(null) + "/"+ System.currentTimeMillis() +".jpg";
我目前正在编写一个用 Parcel js 打包的 TypeScript 模块化库。应用程序将使用该库来实现特定功能。消费应用程序/网页将在其 html 中添加对我的库的引用,例如。 我想在我的库中公
mongodb 生成的 ID 在您的所有文档中都是唯一的,将其暴露给客户端的风险是什么?就像我有一个 ID 为 12345676543 的用户名 James,将它暴露给 url 是明智的吗 examp
场景:假设攻击者通过对.apk文件进行逆向工程,获取了应用中使用的Push Registration Service的SENDER ID。攻击者开发了一个类似的虚假应用程序,它具有相同/不同的包名,并
当使用 Spring Boot starter 进行 graphql 时,数据获取时抛出的所有异常都在输出控制台中显示为“执行查询时的内部服务器错误”我希望我抛出的 e.message() 的 Gra
我正在尝试使用 Docker 运行 ASP.NET Core 应用程序,并且我想将外部 wwwroot 文件夹公开给容器,以便当我从外部对其进行更改时,它们会自动对我的应用程序可用。这可能吗,使用卷?
我构建了一个 WCF 服务,它为 Web 应用程序公开自身,它接受一个对象并在客户端机器上打印数据。在我的开发机器上运行良好,该服务在我安装它的任何机器上启动并运行。我可以在客户端机器的 Web 浏览
我似乎无法弄清楚这一点。我有一个使用 scikit-learn 训练的模型,保存到一个 .pkl 文件中,我想制作一个 API 来根据它进行预测。 我已经有了进行预测的代码,它在控制台/单元测试中运行
我是一名优秀的程序员,十分优秀!