“源码之前,了无秘密”!

“源码之前,了无秘密”——侯捷

  现在的一个任务中部分工作需设计一种语言并要生成对应的AST。之前本人相关内容都是通过使用Flex/Bison完成的,但是确实C/C++这方面的开发的槽点太多太多,于是乎想试试ANTLR。
  我们的问题是需要拿到自定义文法的程序代码构建出来的AST(抽象文法树,Abstract Syntax Tree)。ANTLR能够很容易的按照指定文法产生式的程序解析出相应的"AST",但这个AST不一定是我们想要的,我们需要的是由自己定义出来的表示各个语法元素的类组成的AST。
  实验室之前的学生用过ANTLR,但之前本人没有用过,现在初步调研发现貌似和Flex/Bison还不太一样。虽然能够自动生成的AST,但这个AST可能不是我们所需。因为要想向各个组成AST的类中添加各种成员属性用于辅助的计算(现在这方面的事情在本次任务中还不确定,如果不需要添加属性就能完成任务那肯定好啊)。那这下就需要研究研究ANTLR如何使用了。
  开始看了ANTLR的一些文档都说的不是和我们的需求一致。另外,ANTLR各种用法掺杂在一起,看的人一头雾水,直到后来找到一个网页讨论ANTLR下Listener和Visitor的区别(地址见下方)。
[Antlr 4 - Listener vs Visitor]http://jakubdziworski.github.io/java/2016/04/01/antlr_visitor_vs_listener.html
  这篇文章主旨是比较Listener和Visitor在ANTLR中的使用效果(这里不进行讨论)。开始也同样是没有看太明白ANTLR如何工作,并且如何能够得到自定义的类构成的AST。在查找其他人的文档都没有太好效果时,看到这位作者附上了他demo的Github地址,那就试试直接看他的demo的源码,他demo代码量还是比较小的。
  通过看他的源码,虽然该源代码也不是关于自定义类构件AST的,但能够很容易就明白ANTLR如何工作了,并进而想清楚了如何由自己定义的类来构成的AST对象了。
  源码之前,了无秘密~
ps:之后做过试验后再讨论具体的内容。

你可能感兴趣的:(“源码之前,了无秘密”!)