【发布时间】:2017-12-09 12:11:20
【问题描述】:
您坐了一会儿并记录流的一部分(您的拼图输入)。字符代表组 - 以
{开头并以}结尾的序列。在一个组中,有零个或多个其他东西,用逗号分隔:另一个组或垃圾。由于组可以包含其他组,}仅关闭最近打开的未关闭组 - 也就是说,它们是可嵌套的。您的拼图输入代表一个单独的大组,该组本身包含许多较小的组。有时,您会发现垃圾而不是一组。垃圾以
<开头,以>结尾。在这些尖括号之间,几乎可以出现任何字符,包括{和}。在垃圾中,<没有特殊含义。在清理垃圾的徒劳尝试中,某些程序使用
!取消了其中的一些字符:在垃圾中,应忽略!之后的任何字符,包括<、@987654335 @,甚至是另一个!。
当然,这需要 Perl 6 语法...
grammar Stream
{
rule TOP { ^ <group> $ }
rule group { '{' [ <group> || <garbage> ]* % ',' '}' }
rule garbage { '<' [ <garbchar> | <garbignore> ]* '>' }
token garbignore { '!' . }
token garbchar { <-[ !> ]> }
}
这在简单的示例上似乎可以正常工作,但是连续两个garbchars 会出错:
say Stream.parse('{<aa>}');
给Nil。
Grammar::Tracer 无济于事:
TOP
| group
| | group
| | * FAIL
| | garbage
| | | garbchar
| | | * MATCH "a"
| | * FAIL
| * FAIL
* FAIL
Nil
多个garbignores 没问题:
say Stream.parse('{<!!a!a>}');
给予:
「{<!!a!a>}」
group => 「{<!!a!a>}」
garbage => 「<!!a!a>」
garbignore => 「!!」
garbchar => 「a」
garbignore => 「!a」
有什么想法吗?
【问题讨论】: