&引用;“可读性”;ANTLR生成的代码?

&引用;“可读性”;ANTLR生成的代码?,antlr,Antlr,我已经学习ANTLR几天了。我学习它的目标是,我能够生成解析器和词法分析器,然后亲自将它们从Java翻译成我的目标语言(C/C++/Java/C#/Python,没有工具支持它)。我之所以选择ANTLR,是因为它的About页面:ANTLR被广泛使用,因为它易于理解、功能强大、灵活,可以生成人类可读的输出[…] 在学习这个工具时,我决定从一个简单语法的简单lexer开始:JSON。然而,一旦我使用ANTLR4为这个lexer生成了.java文件,我就大错特错了。我得到了大量非人类可读的序列化代码

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

在学习这个工具时,我决定从一个简单语法的简单lexer开始:JSON。然而,一旦我使用ANTLR4为这个lexer生成了.java文件,我就大错特错了。我得到了大量非人类可读的序列化代码,接下来是:

    public static final ATN _ATN =
    ATNSimulator.deserialize(_serializedATN.toCharArray());
static {
    _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
}
一些谷歌搜索无法为我提供禁用此行为的方法


有没有一种方法可以禁用这种行为并生成人类可读的代码,或者我必须为这种目标编程语言手工编写词法分析器和解析器?

ANTLR 4使用了一种新的预测算法。特伦斯·帕尔目前正在撰写一份详细描述算法的技术报告。人类可读的输出引用生成的解析器

ANTLR 4 Lexer使用DFA识别器,与以前版本的ANTLR相比,速度和内存使用都有了巨大的提高。对于解析器,
\u ATN
字段是调用
adaptivePredict
时使用的数据结构(您会注意到生成的代码中调用该方法的行)


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

值得研究flex/Bison,还是生成的代码同样不可读?我认为随着版本的增加,人类可读性一直在下降,这导致了更快的解析器和词法分析器。在Antlr2中,即使lexer也相当清晰。@Zac我对flex的经验是,它生成的代码也不是很容易让人读懂。