Richie

Sometimes at night when I look up at the stars, and see the whole sky just laid out there, don't you think I ain't remembering it all. I still got dreams like anybody else, and ever so often, I am thinking about how things might of been. And then, all of a sudden, I'm forty, fifty, sixty years old, you know?

ANTLR笔记5 - 备忘

1. 对语法框架结构的整体构思
   一方面为了避免过多因素的干扰,另一方面考虑迭代完善过程,在对语法的整体构思时不要考虑语法树的结构,以及如何构造语法树的问题。

2. 采用自底向上的方法
   因为这样可以结合ANTLRWorks一步步测试,在Interpreter窗口选择要测试的规则就可以进行。
   例如下面图中的NoViableAltException表示这个表达式无法解析
   
   自底向上时对每一个规则最好能够充分的考虑到各种需要处理的情况,并用ANTLRWorks测试验证。每编写好一个规则,最好能用自顶向下、最左推导的思维方式进行Review,尝试找出有可能破坏这种推导方式的情况。因为越往上,出现问题,尤其是不符合LL(*)时,越难找出原因。
   词法规则比较重要,好的词法规则定义可以使语法规则简化。

3. 善用ANTLRWorks
3.1 便利的编辑功能
   Ctrl+B: 转到规则的定义处
   Ctrl+Shift+B: 查找规则,能按当前输入字符过滤
   Ctrl+Alt+left, Ctrl+Alt+right: 前进、后退
   Ctrl+R: 检查语法
3.2 排错,例如Decision can match input such as "..." using multiple alternatives
   说明语法规则不符合LL(*),不大熟练的情况下,对复杂的语法定位这个问题比较困难,ANTLRWorks提供了一些信息帮助我们解决这样的问题
   首先进行语法检查之后如果出现这样的提示,在左上角的规则列表窗口中,有问题的规则会红色字体显示,鼠标移上去会有一些提示信息(在Console窗口中有显示这些信息)
  
   选择一个有问题的规则,在Syntax Diagram窗口可以看到各个存在冲突的推导路径,勾选右下角的Show NFA可以从NFA视图来查看这些推导路径
   

   这些推导路径有助于我们找出Non-LL(*)语法,解决这样的问题需要熟练的技巧

4. 语法树的构造
   语法树的结构服务于它的目的,所以应用中怎样使用方便,就应当怎样构造语法树,而不是依赖于ANTLR的*.g语法文件,也不要太过于受ANTLR AST的构造。所以,设计语法树时先不要考虑ANTLR AST构造。
   使用ANTLR构造语法树时,先充分了解ANTLR提供的各种AST构造方法,灵活运用。
   通过ANTLR Runtime的dll文件,弄明白IToken、ITree、ITreeAdapter的原理和职责,结合ANTLR生成的**Parser.cs文件,弄明白整个构造过程,这样除了在语法文件中使用AST Construction之外,还可以基于ITree、ITreeAdapter来控制语法树的构造过程

posted on 2008-03-17 00:21  riccc  阅读(3114)  评论(0编辑  收藏  举报

导航