生成独立代码的Java解析器生成器



我使用antlr来生成java解析器,但是生成的代码引用了antlr库。

// Generated from Sentences.g by ANTLR. Needs the JAR... How to avoid this?
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.misc.*;
...
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class SentencesParser extends Parser {
    static { RuntimeMetaData.checkVersion("4.5.1", RuntimeMetaData.VERSION); }
...

是否有替代方法生成独立java代码?(或者是否有办法使生成的代码独立)

您可以通过手工编写递归下降解析器来避免引入任何其他依赖项(您可能最终会引入一些自己的解析器,但这完全取决于您)。

参见我的SO回答如何构建递归下降解析器:https://stackoverflow.com/a/2336769/120163

如前所述,如果您的语法没有左递归并且明确,最简单的方法是手工编写递归下降解析器。顺便说一下,许多语法可以通过左递归消除和左因式分解转换为LL(k)甚至LL(1)语法。自底向上解析器很难手工构建,因为它们的shift/reduce行为。

如果您正在寻找可以生成独立java解析器的工具,请查看我最近一直在开发的自顶向下非递归解析器生成工具。Java世界中一个流行的工具是javacc——但是它生成的是递归下降解析器。

最新更新