在上一章(第三章)中我们用纯手工的方式构造了一个Pascal的扫描器(也称词法分析器)。细心的读者会想到,大部分语言的词法构造过程都差不多,都有变量ID,字符串,整数,浮点数,关键字,特殊符号等(如比较符,赋值,索引括号)等等。事实上在编译技术发展到今天,手写词法分析器基本很少了,因为编程语言的词不同于自然语言,很容易通过机械的手段实现。有很多工具可以生成词法分析器,比如Flex,JavaCC等。不过在本书中,不管词法还是语法还是代码生成,我将使用Antlr(http://www.antlr.org)这个大名鼎鼎的工具来完成后续的代码自动化工作。关于Antlr的基础我就不介绍了,网上有很多的教程。这儿我推荐两个:《使用 Antlr 开发领域语言 - 开发一个完整的应用》,《The Definitive ANTLR Reference

==>> 本章中文版源代码下载:svn co http://wci.googlecode.com/svn/branches/ch3_antlr/ 源代码使用了UTF-8编码,下载到本地请修改!

Antlr的Lexer和Parser还有AST属于自动化产物,自成体系。编译器/解释器的非自动化部分都是通过"hook"手段灌进Antlr语法中。如果使用Antlr,将会抛弃原有框架但是复用原有的代码和逻辑,再者项目也从纯粹的Java项目变成了Maven项目。

 

1 创建一个Antlr文件Pascal.g,首先是抬头,我们使用了不同于PascalToken的另外一个Token类型PascalAntlrToken,因为对于Antlr来说,只能继承Antlr的CommonToken,而PascalToken继承自Token。

   1: grammar Pascal;
   2: options{
   3:   TokenLabelType=PascalAntlrToken;
   4:   output=AST;
   5: }
   6: tokens{
   7:   NUMBER_REAL;
   8: }

相关文章:

  • 2021-12-07
  • 2021-07-28
  • 2021-10-20
  • 2021-12-31
  • 2022-02-21
  • 2021-11-20
  • 2021-08-05
  • 2021-07-05
猜你喜欢
  • 2022-02-02
  • 2021-08-13
  • 2022-01-30
  • 2021-07-25
  • 2021-12-10
  • 2022-01-14
  • 2021-11-27
相关资源
相似解决方案