我几天来一直在学习ANTLR。我学习它的目的是我能够生成解析器和词法分析器,然后亲自将它们从Java手工翻译成我的目标语言(C / C ++ / Java / C#/ Python,没有工具支持它)。我之所以选择ANTLR是因为它的关于页面:ANTLR被广泛使用,因为它易于理解,功能强大,灵活,可生成人类可读输出[...]
在学习这个工具时,我决定从一个简单的词法分析器开始,简单的语法:JSON。但是,一旦我使用ANTLR4为这个词法分析器生成.java文件,我就被广泛猝不及防。我收到了大量远离人类可读的序列化代码,接着是:
public static final ATN _ATN =
ATNSimulator.deserialize(_serializedATN.toCharArray());
static {
_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
}
一些Google搜索无法为我提供禁用此行为的方法。
有没有办法禁用此行为并生成人类可读的代码,或者我是否必须手工编写我的词法分析器和解析器以用于此目标编程语言?
答案 0 :(得分:3)
ANTLR 4使用新算法进行预测。 Terence Parr目前正在编写一份详细描述算法的技术报告。人类可读的输出是指生成的解析器。
ANTLR 4词法分析器使用DFA识别器,比以前的ANTLR版本提高了速度和内存使用率。对于解析器,_ATN
字段是在adaptivePredict
的调用中使用的数据结构(您将在生成的代码中注意调用该方法的行)。
您无法将生成的ANTLR 4词法分析器的Java代码手动转换为其他编程语言。如果语法严格是LL(1)(即生成的代码不包含对adaptivePredict
的任何调用),您可以手动翻译生成的解析器的代码。但是,您将失去从序列化ATN中编码的信息中提取的错误恢复能力。