2013-05-03 36 views
1

我一直在学习ANTLR几天。我的学习目标是能够生成解析器和词法分析器,然后将它们从Java手动转换为我的目标语言(C/C++/Java/C#/ Python,没有任何工具支持它)。我选择了ANTLR因为其关于页:ANTLR被广泛使用,因为它很容易理解的,强大的,灵活的,产生人类可读输出[...]“人类可读的”ANTLR生成的代码?

在学习这个工具,我决定开始用一个简单的语法简单的词法分析器:JSON。然而,一旦我使用ANTLR4为这个词法分析器生成.java文件,我就被广泛地忽视了。我有一个巨大的混乱远从人类可读的序列化代码,依次为:

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

一些谷歌搜索无法为我提供一种方法来禁用此行为。

有没有一种方法来禁用此行为而产生人类可读的代码,还是我将不得不手工写我的词法分析器和解析器为这个目标编程语言?

回答

2

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

ANTLR词法分析器4使用DFA识别超过ANTLR的早期版本中一个巨大的速度和内存使用情况的改善。对于解析器,_ATN字段是在调用adaptivePredict时使用的数据结构(您会在生成的代码中注意调用该方法的行)。

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

+0

看看flex/Bison,还是生成的代码同样不可读? – Zac 2013-05-03 17:34:02

+0

我认为随着版本的增加,人类可读性一直在下降,这导致了更快的解析器和词法分析器。在Antlr 2中,即使是词法分析器也相当清晰。 – 2013-05-03 19:13:15

+0

@Zac我对flex的使用经验是,它生成的代码也不是人类可读的。 – 2013-05-03 19:14:34