1.1 代码生成涉及的数据结构

这些数据结构均为全局变量。

1.1.1 头文件

  1. map<string,string> mp_subprogramToHeadFile;//过程、函数到C程序头文件的映射
  2. map<string,bool> mp_headFileShow;//头文件是否出现的映射

事先将过程、函数及其对应的头文件保存到mp_subprogramToHeadFile中;并将所有的头文件作为键值保存到mp_headFileShow中,对应的属性值均初始化为false。

1.1.2 全局常量

  1. vector<string> v_s_constIdList;//常量标识符
  2. vector<string> v_s_constTypeList;//常量类型,"int","float","char","bool"
  3. vector<string> v_s_constValueList;//常量值,不论是哪种类型,均用string表示

常量的存放顺序按照PASCAL-S程序的定义顺序,且默认语义分析已经完成了常量定义区的常数传播。注意常量是数值类型且是负的,则常量值字符串需要在最前面加上一个负号。

1.1.3 全局变量

  1. vector<string> v_s_variantIdList;//变量标识符
  2. vector<string> v_s_variantTypeList;//变量类型,"int","float","char","bool"
  3. vector< vector<int> > v_ArraySizeList;//各数组变量各维的大小

v_ArrayRangeList的size可以用来指明变量是否为数组,若为数组,数组的维数是多少。

1.1.4 原PASCAL-S主程序对应到C程序的接口声明

  1. string subMainFunctionDeclaration;//原PASCAL主程序对应到C程序的声明

该接口声明单独拿出来,区别于其它子过程/子函数的接口声明。

1.1.5 子过程/子函数接口声明

  1. struct subproDef {
  2. string returnType;
  3. //子程序返回值类型,"int","float","char","bool"
  4. string id;
  5. //子程序名称标识符
  6. vector<string> v_paraIdList;
  7. //参数标识符
  8. vector<bool> v_isParaRef;
  9. //参数是否为引用
  10. vector<string> v_paraTypeList;
  11. //参数类型,"int","float","char","bool"
  12. }
  13. ;
  14. vector< struct subproDef > v_subproDefList;
  15. //子程序接口列表

子程序接口列表中的第一个子程序永远是main_function

1.1.6 主程序语句列表

  1. vector< pair<string,int> > v_statementList;

每一个pair的first表示语句本身,second表示语句的缩进,即语句前的制表符个数。

1.1.7 子程序

  1. //子程序定义
  2. struct subproDef {
  3. vector<string> constIdList;
  4. //常量标识符
  5. vector<string> constTypeList;
  6. //常量类型,"int","float","char","bool"
  7. vector<string> constValueList;
  8. //常量值,不论是哪种类型,均用string表示
  9. vector<string> variantIdList;
  10. //变量标识符
  11. vector<string> variantTypeList;
  12. //变量类型,"int","float","char","bool"
  13. vector< vector<int> > arraySizeList;
  14. //各数组变量各维的大小
  15. vector< pair<string,int> > statementList;
  16. //pair的first是语句本身,pair的second控制缩进,即语句前的制表符个数
  17. }
  18. ;
  19. //子程序定义列表
  20. vector< struct subproDef > subproDefList;

子程序定义中,常量定义、变量定义与全局常量定义和全局变量定义类似;statementList是子程序的语句列表,pari的first是语句本身,pair的second控制缩进,即语句前的制表符个数。

1.1.8 符号表指针

  1. extern _SymbolTable *mainSymbolTable;
  2. _SymbolTable* codeGenerateCurrentSymbolTable;

其中mainSymbolTable是主符号表指针,由语义分析程序提供;而codeGenerateCurrentSymbolTable是用于代码生成时表示当前符号表的指针,用于符号表的定位和重定位。