我写了个 Perl 6 Grammar 的解析器,用 Ruby 完成的,解析速度比 Perl 6 快,而且直接生成数据结构。支持了 Perl6 grammar 大部分的特性:
LTM 最长分支: [ \w+ | <[a..z]>+ ] 普通分支: \w || \d+ token 定义:token TOP { ^ \s+ | <.comment> | $ } 零宽断言: { ^ ^^ $$ $ } .........
对于上下文无关文法的基本元素,大部分支持。
不知道这个东西对大家有没有用?
下面是一个 Lisp 方言的 grammar :
grammar Use::Spp {
token TOP { ^ [ <.ws> || <atom> ]+ $ }
token ws { [ \s+ || <.comment> ]+ }
token comment { '#' <-[\n]>+ $$ }
token atom {
|| <quote>
|| <symbol>
|| <int>
|| <Str>
|| <Array>
|| <Hash>
|| <List>
}
token quote { ':' }
token symbol { [ <.sym-chars> || <.char> ]+ }
token sym-chars { <-[0..9'":{}()\\\s\#\[\]]>+ }
token int { \d+ }
token Str {
|| \' [ <s-chars> || <char> ]+ \'
|| \" [ <d-chars> || <char> ]+ \"
}
token char { \\ . }
token s-chars { <-[\\ \']>+ }
token d-chars { <-[\\ \"]>+ }
token Array { \[ [ <.ws> || <atom> ]+ \] }
token Hash { \{ [ <.ws> || <atom> <.ws> <atom> ]+ \} }
token List { \( [ <.ws> || <atom> ]+ \) }
}