用于内联文档的分析器生成器

时间:2010-04-03 22:14:20

标签: parsing antlr parser-generator

要拥有可以提取多种语言的内联文档的通用文档系统,需要使用每种语言的解析器。因此需要一个解析器生成器(实际上不必那么完整或高效)。

http://antlr.org/是一个很好的解析器生成器,已经有许多流行语言的语法。是否有更好的选择,即更简单的替代方案,支持为更多语言开箱即用生成解析器?

3 个答案:

答案 0 :(得分:0)

如果您只是在寻找“部分解析”,那么您可以使用ANTLR的选项来部分“勒克斯”令牌流并忽略其余的令牌。您可以通过在词法分析器语法中启用filter=true来实现此目的。然后词法分析器尝试匹配您在语法中定义的任何标记,当它无法匹配其中一个标记时,它会前进一个单个字符(并忽略它),然后再次尝试匹配下一个字符中的一个标记:

lexer grammar Foo;

options {filter=true;}

StringLiteral
  :  ...
  ;

CharLiteral
  :  ...
  ;

SingleLineComment
  :  ...
  ;

MultiLineComment
  :  ...
  ;

如果实施得当,您可以非常轻松地从Java文件中获取MultiLineComment s(/* ... */),而不必担心单行注释和String或char文字搞乱。

显然,您的源文件需要有效才能正确标记文件,否则会得到奇怪的结果!

答案 1 :(得分:0)

我的编译器使用Dypgen。这是一个用户可扩展的GLR解析器,具有大量的丰富功能,因此它可以解析许多语言。引导语法是EBNF(它直接在你的作品中支持* +和?)。它足以动态加载扩展,这是我的编译器所利用的事实:我的大部分编程语言都在编译器启动时动态加载它的语法。

Dypgen是用Ocaml编写的,并生成Ocaml代码。

有一个名为Elkhound的C ++ GLR解析器,它足以解析大部分C ++。

但是,根据您的实际需求,您并不需要进行任何严格的解析:正则表达式匹配引擎可能已经足够了。谷歌re2可能是合适的(提供大多数PCRE功能,更快,并使用C ++接口)。

虽然这不太准确,但它足够好,因为您可以要求内联文档遵循一些简单的格式。大多数现有的内联文档都是出于这个原因。

答案 2 :(得分:-1)

我工作的地方曾经使用GOLD Parser。这比Antlr简单得多,并且支持多种语言。我们已经转移到Antlr,因为我们需要进行更复杂的解析,我们发现Antlr比GOLD更好。