Parsing 用于内联文档的解析器生成器

Parsing 用于内联文档的解析器生成器,parsing,antlr,parser-generator,Parsing,Antlr,Parser Generator,为了有一个能够提取多种语言的内联文档的通用文档系统,需要为每种语言提供一个解析器。因此,需要一个解析器生成器,它实际上不必那么完整或高效 是一个很好的解析器生成器,它已经有许多流行语言的语法。是否有更好的替代方案,即更简单的方案,支持为更多的现成语言生成解析器?在我工作的地方,我们曾经使用过。这比Antlr简单得多,并且支持多种语言。然而,由于我们需要进行更复杂的解析,我们已经转移到了Antlr,我们发现Antlr比GOLD更好 如果您只是在寻找部分解析,那么可以使用ANTLR的选项部分地lex

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


是一个很好的解析器生成器,它已经有许多流行语言的语法。是否有更好的替代方案,即更简单的方案,支持为更多的现成语言生成解析器?

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

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

lexer grammar Foo;

options {filter=true;}

StringLiteral
  :  ...
  ;

CharLiteral
  :  ...
  ;

SingleLineComment
  :  ...
  ;

MultiLineComment
  :  ...
  ;
正确实现后,您可以获得multilecomments/*…*/从Java文件中很容易地访问,而不必担心单行注释和字符串或字符文字会把事情搞砸


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

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

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

有一个C++的GLR解析器,叫做ELKHODENS,它强大到足以解析C++的大部分。 然而,对于您的实际需求,您实际上不需要进行任何认真的解析:正则表达式匹配引擎可能已经足够好了。Google Re2可能适合提供大多数PCRE功能,速度更快,并且具有C++接口。


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

GOLD AFAIK是一个纯LALR1解析器生成器,例如,它类似于Bison和YACC。这种解析器生成器的缺点是,实际上每一种真正的计算机编程语言都没有一种自然的LALR1语法,因此需要大量的精力来弯曲和扭曲语法以适应LALR1解析器生成器(包括GOLD)。LALR1语法分析器生成器仅适用于设计为具有LALR1语法的领域特定语言。请参阅编程语言语法分析器问题的答案处理更多语言的示例语法分析器生成器?解析器生成器之所以复杂,是为了处理许多语言似乎带来的无数复杂问题。