分享 Perl6 grammar 的解析器

ssqq · 2015年08月20日 · 最后由 ssqq 回复于 2015年08月22日 · 2699 次阅读

我写了个 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> ]+ \) }
}

用的什么解析库呢?treetop,还是parslet,或者是楼主自己开发的~ 我之前用过前两个写过Fortran的解析器,但是速度太慢了,换为了Java下的ANTLR

解析库是一组 API 对应一个数据结构,而这个数据结构,是用这个解析库解析描述语法的文本解析的。这可能有点绕口。也就是说解析库依靠的东西,是用这个解析库生成的数据结构,有点像 Java 的 ANTLR, 解析器是根据语法生成的,但生成的不是代码,是数据结构。但是不需要两步,动态生成。

为了让解析器支持多种语言环境,我现在正在写一个类 LISP 的解释器,用于实现解析器的 API,这个解释器可以用多种语言实现,从而让多种语言都有语法解析的能力。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号