2

这几天我一直在学习ANTLR。我学习它的目标是我能够生成解析器和词法分析器,然后亲自将它们从 Java 手动翻译成我的目标语言(C/C++/Java/C#/Python,没有工具支持它)。我之所以选择 ANTLR,是因为它的 About 页面:ANTLR 被广泛使用是因为它易于理解、强大、灵活、生成人类可读的输出 [...]

在学习这个工具时,我决定从一个简单语法的简单词法分析器开始:JSON。然而,一旦我使用 ANTLR4 为这个词法分析器生成了 .java 文件,我就大吃一惊了。我得到了一大堆远非人类可读的序列化代码,然后是:

    public static final ATN _ATN =
    ATNSimulator.deserialize(_serializedATN.toCharArray());
static {
    _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
}

一些 Google 搜索无法为我提供禁用此行为的方法。

有没有办法禁用这种行为并生成人类可读的代码,或者我将不得不为这种目标编程语言手写我的词法分析器和解析器?

4

1 回答 1

3

ANTLR 4 使用一种新算法进行预测。Terence Parr 目前正在撰写一份详细描述该算法的技术报告。人类可读的输出指的是生成的解析器。

与以前的 ANTLR 版本相比,ANTLR 4 词法分析器使用 DFA 识别器来大幅提高速度和内存使用率。对于解析器,该_ATN字段是在调用中使用的数据结构adaptivePredict(您会注意到生成的代码中调用该方法的行)。

您将无法手动将 ANTLR 4 词法分析器生成的 Java 代码翻译成另一种编程语言。如果语法严格为 LL(1)(即生成的代码不包含对 的任何调用adaptivePredict),您也许可以手动翻译生成的解析器的代码。但是,您将失去从序列化 ATN 中编码的信息中提取的错误恢复能力。

于 2013-05-03T16:28:30.997 回答