一个对c语言进行编译的程序完成对赋值语句,if语句,while语句,do while语句的编译,要求将含有上述语句的c语言源程序进行编译生成中间代码和汇编指令序列。
SLR分析表为:
1.赋值语句的SLR分析表
状态 | ACTION | GOTO | |||||||
i | + | - | * | / | ( | ) | # | E | |
0 | S3 |
|
|
|
| S2 |
|
| 1 |
1 |
| S4 | S5 | S6 | S7 |
|
| Acc |
|
2 | S3 |
|
|
|
| S2 |
|
|
|
3 |
| R6 | R6 | R6 | R6 |
| R6 | R6 |
|
4 | S3 |
|
|
|
| S2 |
|
| 9 |
5 | S3 |
|
|
|
| S2 |
|
| 1 |
6 | S3 |
|
|
|
| S2 |
|
| 11 |
7 | S3 |
|
|
|
| S2 |
|
| 12 |
8 |
| S4 | S5 | S6 | S7 |
| S13 |
|
|
9 |
| R1 | R1 | S6 | S7 |
| R1 | R1 |
|
10 |
| R2 | R2 | S6 | S7 |
| R2 | R2 |
|
11 |
| R3 | R3 | R3 | R3 |
| R3 | R3 |
|
12 |
| R4 | R4 | R4 | R4 |
| R4 | R4 |
|
13 |
| R5 | R5 | R5 | R5 |
| R5 | R5 |
|
2.BOOL 表达式的SLR分析表
| i | r | ! | && | || | ( | ) | # | E | A | O |
0 | 1 | -1 | 4 | -1 | 5 | -1 | -1 | -1 | 13 | 7 | 8 |
1 | -1 | 2 | -1 | 101 | -1 | 101 | 101 | 101 | -1 | -1 | -1 |
2 | 3 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
3 | -1 | -1 | -1 | 102 | -1 | 102 | 102 | 102 | -1 | -1 | -1 |
4 | 1 | -1 | 4 | -1 | 5 | -1 | -1 | -1 | 11 | 7 | 8 |
5 | 1 | -1 | 4 | -1 | 5 | -1 | -1 | -1 | 6 | 7 | 8 |
6 | -1 | -1 | -1 | 104 | -1 | 104 | 104 | 104 | -1 | -1 | -1 |
7 | 1 | -1 | 4 | -1 | 5 | -1 | -1 | -1 | 14 | 7 | 8 |
8 | 1 | -1 | 4 | -1 | 5 | -1 | -1 | -1 | 15 | 7 | 8 |
9 | 105 | -1 | 105 | -1 | 105 | -1 | -1 | -1 | -1 | -1 | -1 |
10 | 107 | -1 | 107 | -1 | 107 | -1 | -1 | -1 | -1 | -1 | -1 |
11 | -1 | -1 | -1 | 12 | -1 | 9 | 10 | -1 | -1 | -1 | -1 |
12 | -1 | -1 | -1 | 103 | -1 | 103 | 103 | 103 | -1 | -1 | -1 |
13 | -1 | -1 | -1 | -1 | -1 | 9 | 10 | 2 | -1 | -1 | -1 |
14 | -1 | -1 | -1 | 106 | -1 | 106 | 106 | 106 | -1 | -1 | -1 |
15 | -1 | -1 | -1 | 108 | -1 | 9 | 108 | 108 | -1 | -1 | -1 |
主要数据结构说明
struct SqStack//栈的定义
{int *base;
int *top;
int stacksize;
};
struct node //关键字和相应的代号
{char symbol[30];//符号
char code[5];//代号
};
struct node1
{char name[30];//变量名
char cat[20];
char type[20];
int value;//变量值
};
struct node2//存放四元式
{char op[10];//操作符
char arg1[10];//操作数1
char arg2[10];//操作数2
char result[10];//结果
};
struct node3//程序的每个单词及相应的代号
{char sign[10];//单词名
int code;//单词的代号
};
struct node4//存放汇编结果
{ int L;//判断是否需要标志符
char label[10];//记录标号
int num;
char op[10];
char arg1[10];
char arg2[10];
};
struct node5
{ int i;
int ci;
};
struct node0//存放二元式
{
int num;
char code[20];
int type;//0:error,1:id,2:num,3:keyword and operator,-1:end note
};
struct node6
{
int L;//判断是否需要标志符
int num;//标志符号
char op[10];//操作符
char arg1[10];//操作数1
char arg2[10];//操作数2
};
struct node7
{
int num;
int value;
};
struct InterfaceType//源程序和前台可视化用户界面的接口
{
node0 *cifa;//存放二元式
node2 *yuyi;//存放四元式
char * SourseBuffer;//存放源程序
USER_TYPE_cha100 ErrorMessageTable;//出错信息表
int ErrorCount;//语法语义错误数
int ErrorNumber[number];//错误代码
int ErrorAddress;//出错信息在源程序中的地址
node4 *compile;//存放汇编指令 格式一
node6 *compile_next;//存放汇编指令 格式二
int quad_num;//四元式的个数
int com_num;//汇编指令条数
int com_num_next;//汇编指令条数2
};
主要功能函数说明
public:
InterfaceType * GetTable();//源程序和用户界面的接口
CCompiler();//构造函数
virtual ~CCompiler();//析构函数
void Pushback(char c);//返回上一个字符
char GetC( );//获起一个字符
int SearchKey( );//匹配关键字
void GetNextWord( );//词法分析
void Initial();//进行变量初始化
void InitStack(SqStack *S);//初始化栈
void Push(SqStack *S,int e);//入栈
int Pop(SqStack *S,int *e);//出栈
char GetTop(SqStack *S);//获起栈顶元素
int changestring(char *p); //把数字字符转化为数值
int findstring(int x); //查找单词在symbol中的位置
void Create();//此函数为把文件中的转化到结构体中propertytable
int entry(char *p); //查SLR分析表函数
void findcreate(char *p);
int newtemp(char op,int E1_place,int E2_place); //产生标号函数
void find(char *p); //相当于翻译程序,把程序中的单词和相应的代码存入结构体symbol中
void test(char *p);
int precede1(int a); //查找所查符号在对应的action1数组中列号
int precede2(int a); //查找所查符号在对应的action2数组中列号
void gen(char *op,int arg1,int arg2,char *result); //产生四元式函数
bool E();//算术表达式的翻译函数
int Merg(int p1,int p2); //并链函数
void Backpatch(int p,int t); //回填函数
bool EB();//布尔表达式的翻译函数
void Program();/if,while,do-while,变量定义和赋值语句的实现
void yuyifx();//进行语义分析,产生四元式
void init();//存放汇编指令结构体数组的初始化
void huibianzhilin();//产生汇编指令格式一
void compile();//产生汇编指令格式二
int com_num(int x);//跟踪标志
void equal(int num);//产生MOV指令
void add(int num);//产生加法指令
void sub(int num);//产生减法指令
void mul(int num);//产生乘法指令
void div(int num);//产生除法指令
void jnz(int num);//产生JNZ跳转指令
void jmp(int num); /产JMP跳转指令
void jb(int num); /产生JB跳转指令
void jbe(int num); /产生JBE跳转指令
void ja(int num); /产生JA跳转指令
void jae(int num); /产生JAE跳转指令
void je(int num); /产生JE跳转指令
void jne(int num); /产生JNE跳转指令
界面