整体需求分析

一个完整的编译器分成分析阶段和综合阶段。分析阶段由词法分析、语法分析、语义分析组成;综合阶段由中间代码生成、代码优化、代码生成组成。我们需要实现的是PASCAL_S到C的编译器,源语言和目标语言均为高级语言,因此应省略综合阶段的中间代码生成和代码优化这两部分,也就是说,综合阶段直接将分析阶段得到的输出转化为目标代码。另外,符号表的管理和访问、错误处理将贯穿整个编译过程。

下面的数据流图说明了每一部分的输入输出,及其相互之间的逻辑关系。

image.png

修改和扩展

  • 字符常量的检错与识别(包括周围单引号)放在了词法分析中
  • 词法分析中,数值型常量设置了整数和浮点数两种,及整数和浮点数分别作为两种不同的终结符,UINUM和UFNUM,为unsigned integer number和unsigned float number的缩写
  • 修改了常量的文法,为const_value —-> + IDENTIFIER、const_value —-> - INDENTIFIER、const_value —-> IDENTIFERI、 const_value —-> + UNINUM、const_value —-> - UNINUM、const_value —-> UINUM、const_value —-> + UFNUM、const_value —-> -UFNUM、const_value —-> UFNUM、const_value —-> CHAR,其中CHAR由词法分析器识别
  • 修改了factor的文法产生式,将factor —-> num拆成了factor —-> UNINUM和factor —-> UFNUM两种,并增加了字符常量,即factor —-> CHAR
  • 函数返回值语句支持赋值形式和exit调用两种方法
  • 库程序支持read、write、writeln、exit的调用,read要求实参个数大于等于1,write要求实参个数大于等于1,writeln实参个数无要求,exit在过程中出现时,要求没有实参,exit在函数中出现时,要求实参个数为1。且read的实参只能为普通变量,即能提供可供修改的存储单元地址的简单表达式。
  • 除了for循环,还支持while和repeat-until循环
  • 语义分析非常的详尽,除了常规的语义分析,还考虑了如下内容
    • 规定了所有标识符都不能和库程序名,主程序名,主程序参数名同名,且这三者之间不能同名,并进行了检查
    • 支持整型常量表达式的计算
    • 支持由整型常量表达式指定的数组下标的越界检查
    • 支持/、div、mod由整型常量表达式指定的操作数的除0检查
    • 检查了引用形式参数对应的形参种类,必须是普通变量,即能提供地址的、且可修改的最简单的表达式,包括read库程序调用的实参。而不能是常量、常量标识符、复杂表达式等。
    • 用一种递归的方法,检查了函数定义中,返回值语句的存在性,将其作为警告信息输出,具体方法见语义分析详细设计。
    • 一般情况下支持integer到real的隐式类型转换;传引用参数时,则不支持隐式类型转换,类型必须强一致。
  • 代码生成中,深入分析了引用参数和指针之间的转化,将引用参数以较好的方式转化为了指针。例如可以判断当前变量是否为指针(原PASCAL-S程序中的引用参数),如果是指针,则在scanf中出现该变量时,不需要任何前缀,如果是普通变量出现在scanf中,则需要加取地址符。
  • 原PASCAL-S语法中,可能出现6—3这种表达式,注意该表达式并没有错误!更好的风格应为6-(-3)。在代码生成中,我们深入考虑了运算符之间的优先级,通过添加括号的方法解决了上述的表达式风格问题,编写实现时提供了较好的可扩展性。
  • 支持boolean型表达式的输出,由于C不支持直接输出,所以我们将其转化为了if分支语句,如果原PASCAL-S程序的write调用中,其它类型表达式穿插着boolean类型表达式,可以自动拆分成若干句进行转化。

    开发环境

  • 词法分析器利用LEX编写,所以需要安装flex

  • 语法分析器利用YACC编写,所以需要安装bison
  • LEX和YACC整合为一个工程,支持跨平台开发
  • 整个工程的语言用的是C++,所以需要将LEX和YACC生成的C文件改为CPP文件
  • 整个工程在windows上利用visual studio community 2017搭建

    编译器模块图

    我们的编译器在具体实现时,基本符合需求分析和概要设计中的描述,这里给出一个更加详细的模块图。
    image.png
    由于篇幅限制,更加清晰地版本见附件《编译器模块图.pdf》。