CMM语言解释器构造实践(一)——前言

前言

此项目记录了一个小型编译器——CMM语言编译器(解释器)的开发过程,项目所需要的前导理论课程为编译原理

In this programming project, you will design and implement an interpreter of CMM language, using the principles you learned in Compiler Principles course. The interpreter will read CMM source codes and make the lexical analysis, syntax analysis and semantic analysis on the codes. If it encounters errors, reports them. If no errors are encountered, your interpreter will give the execution result directly.

在此项目中,将实现一个CMM语言(详见下一目)的编译器。该编译器能够实现词法分析、语法分析、语义分析以及中间代码生成(主要为四元式的构造)等基本过程,也包括图形用户界面的设计,最终将以一个简易IDE(集成开发环境)的形式呈现。


CMM语言

CMM(C Minus Minus/C- -)语言为C语言的一个子集,其基础定义如下:

  • 语言结构:顺序结构(赋值语句、输入、输出)、选择语句(if-else)、循环结构(while)。这些语句结构和C语言的结构一样,允许嵌套。
  • 表达式局限于关系表达式和算术表达式,运算的优先级为:算术运算、关系运算,并服从左结合规则。
  • 算术表达式包括整数和实数上的运算、变量及“()”、“”、“+”、“-”、“/”,运算符的优先级顺序为:“()”大于“”和“/”大于“+”和“-”。
  • 关系运算符包括:“<”、“==”、“<>”。
  • 一条语句以“;”结束;程序由一条语句或者由“{”和“}”嵌套表达的复合语句。
  • 支持多行注释(使用“/*”和“ * ”)。
  • 支持数组运算,数组的下标必须是正整数,使用“[”和“]”表示数组下标。
  • 变量的使用之前需要先声明,声明的方式和C语言一样。
  • 十进制的整数与实数。
  • 标识符(由数字、字母和下划线组成的串,但必须以字母开头、且不能以下划线结尾的串)。
保留字 特殊符号
if +
else -
while *
read /
write =
int <
real >
  <>
  (
  )
  ;
  {
  }
  /*
  */
  [
  ]

注:以上为需要实现的基本语言要求,可以在此基础上进行更多的扩展,以分析更多的类型和结构,如方法、指针等。


任务说明

Quick Review

编译器开发的通常过程如上图所示,共包括词法分析、语法分析、语义分析、中间代码生成与代码优化、代码生成等阶段,开发的整个过程也依赖于符号表、出错处理机制。

end

在编译过程中,源码经过前端处理(词法分析、语法分析、语义分析)成为中间代码,中间代码再经过后端处理(中间代码生成与代码优化、代码生成)变为目标代码。
过程中主要涉及到的数据结构包括:Tokens、The Syntax Tree、The Symbol Table、The Literal Table、Intermediate Code。

项目的开发流程基本分为五个阶段:

  1. 编译工具的使用
    该阶段主要学习JavaCC(或Antlr)等编译工具,了解其使用方法,包括环境安装、编译工具的语法及使用、实例分析。要求能够使用实例,以实现CMM语言的词法语法分析器的自动实现。

  2. 词法分析

  3. 语法分析

  4. 语义分析、中间代码生成与代码优化

  5. 图形界面开发

dev
在开启漫长的开发过程之前,还需要注意以下两点:

  • 不要拖延,越早开始,最终所做的功能才会越完善。
  • 要采用迭代开发的过程,不要期求一步到位。

在后续的几篇文章中,笔者将陆续记录每个阶段的开发环节。


附录

项目源码:https://github.com/RMSnow/CMMParser