10

我已经开始学习 ANTLR,并且拥有 2007 年出版的《The Definitive ANTLR Reference》一书和 ANTLRWorks(一种用于创建语法的交互式工具)。而且,作为那种人,我从第 3 章开始。(“不耐烦的快速浏览”)。

这是一个相当痛苦的过程,特别是因为一些错误是相当难以理解的(例如,ANTLR:“规则范围内缺少属性访问”问题,这对我来说意味着“你搞错了”)。我还有一些非常简单的语法(仅限 3-4 个产品)和简单的输入(2 行),运行时会出现“OutOfMemory”错误。

ANTLR 站点很有用,但有些零散,一些 SO 用户评论 ( https://stackoverflow.com/questions/278480/good-tutorial-for-antlr ) 本书和教程期望入门级别很高。因此,我一直不愿意接近 ANTLR 讨论列表。

稍后我们开始掌握它。拥有可以轻轻扩展的简单可靠示例将很有用。这当然值得掌握,因为我们已经基于 ANTLR 改造了很多我们的思想。

一个问题是 ANTLR V3 与 V2 相比有显着的变化。SO(以及 ANTLR 页面上)的一个答案是指不再可用的 V2 语法。

一些关于 SO 的 ANTLR 问题对我有很大帮助,但找到它们有点临时。所以我想知道 SO 用户如何帮助减少学习过程的痛苦。(如果您参考参考书,指向特定页面会很有用)。

编辑。@duffymo 和 @JamesAnderson 已经证实 ANTLR 是一项艰苦的工作——主要是因为解析器很困难。(FWIW 我已经通过 LEX/YACC 等,毫无疑问 ANTLR 更强大且更易于使用。)我认为拥有可以避免污染的区域仍然很有用,例如:

  • 确保变量名的正确大写
  • 将包名称添加到词法分析器以及解析器
  • 注意规则的顺序,因为它会影响优先级

更多这样的东西会很有用。

4

3 回答 3

7

我同意 - ANTLR 不适合胆小的人。它确实期望高入门级别,因为语法和解析器并非微不足道。

话虽如此,这里有一些建议:

  1. 忘记v2。第 3 版是标准;甚至不要浪费时间考虑早期版本或其文档。
  2. OutOfMemoryError 告诉您在您定义的语法中有一些循环。
  3. IntelliJ 有一个很棒的 IDE,可以与 ANTLR v3 一起工作。它将为您提供语法、逐步调试等的图形表示。如果您要使用 ANTLR 进行大量工作,购买许可证值得几美元。

ANTLR 并不容易掌握。书很好,但是很厚。正如您所指出的,错误消息很神秘。如果这里有人能让它变得容易,我会感到惊讶。

于 2009-11-02T11:05:09.970 回答
6

抱歉,但我对 ANTLR(实际上是 javacc、bison 或任何全功能解析器)的经验是,您的大部分学习将通过纠正自己的错误来完成!

获得其他人代码的好例子会在一定程度上减少这种情况,最好的例子看起来很简单——但是你错过了让它们看起来那么容易所花费的所有汗水和头发。

于 2009-11-02T11:21:32.047 回答
2

即使您更喜欢命令行,也值得在遇到问题时使用 AntlrWorks。图解表示可以更容易地看出我做错了什么。

一张图片抵得上一千条错误信息。

于 2009-12-07T13:11:02.807 回答