【问题标题】:Parser generator for inline documentation用于内联文档的解析器生成器
【发布时间】:2010-04-03 22:14:20
【问题描述】:

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

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

【问题讨论】:

  • 查看 SO 问题的答案stackoverflow.com/questions/2564827/… of Parsers for Programming Languages
  • 更简单的解析器生成器来处理更多种语言?解析器生成器之所以复杂,是为了处理许多语言似乎带来的无数复杂问题。

标签: parsing antlr parser-generator


【解决方案1】:

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

lexer grammar Foo;

options {filter=true;}

StringLiteral
  :  ...
  ;

CharLiteral
  :  ...
  ;

SingleLineComment
  :  ...
  ;

MultiLineComment
  :  ...
  ;

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • GOLD AFAIK 是一个纯 LALR(1) 解析器生成器,例如,它类似于 Bison 和 YACC。这种解析器生成器的缺点是几乎每一种真正的计算机编程语言都没有自然的 LALR(1) 语法,因此需要大量的能量来弯曲和扭曲语法以适应 LALR(1) 解析器生成器,包括 GOLD . LALR(1) 解析器生成器仅适用于设计具有 LALR(1) 语法的特定领域语言。
      猜你喜欢
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 2012-09-13
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多