0

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

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

4

3 回答 3

0

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

lexer grammar Foo;

options {filter=true;}

StringLiteral
  :  ...
  ;

CharLiteral
  :  ...
  ;

SingleLineComment
  :  ...
  ;

MultiLineComment
  :  ...
  ;

如果实施得当,您可以很容易地从 Java 文件中获取MultiLineComments ( /* ... */),而不必担心单行注释和字符串或字符文字会搞砸事情。

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

于 2010-04-04T18:45:23.167 回答
0

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

Dypgen 用 Ocaml 编写并生成 Ocaml 代码。

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

但是,对于您的实际需求,您实际上并不需要进行任何认真的解析:正则表达式匹配引擎可能就足够了。谷歌的 re2 可能是合适的(提供大多数 PCRE 功能,速度更快,并带有 C++ 接口)。

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

于 2010-12-04T20:57:56.797 回答
-1

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

于 2010-04-03T22:22:37.147 回答