哈尔滨工业大学计算机科学与技术学院
实验报告
课程名称:编译原理
课程类型:必修
实验项目名称: 编译器前端
实验题目: 大作业
班级:10703107
学号:1070310701
姓名:郭辰
设计成绩
报告成绩
指导老师
一、实验目的
通过实现一个可以把类似c语言的源代码转变为中间代码的编译器,更好地理解编译的过程,锻炼自己的编程能力。
二、实验要求及实验环境
要求:完成类高级语言的编译器前端的设计与实现
环境:格物208机房,自己的的笔记本电脑。
三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)
1.逻辑设计
语言文法设计:
1.
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式
E→E+T|T
T→T*F|F
F→(F)|id
2.布尔表达式
B→B or C|C
C→B and B|H
H→not A|A
A→i > i|i
26 =
27 ==
28 :
29 ;
30 {
31 }
进行词法分析后,选用自顶向下递归下降的方法,分析语法的同时进行语义动作。终结非终结符的属性用结构体定义。
/*单词词类编码*/
char bm[32][10] = {"","and","bool","char","do","else","FALSE","float","for","if",
"int","not","or","then","TRUE","while","标识符","整常数","实常数","(",")","*",
"+",",","<",">","=","==",":",";","{","}"};
/*初始化标识符符表*/
char bzfb1[MAXSIZE][10] = {};
/*初始化整常数表*/
int zcsb1[MAXSIZE] = {};
属性:
struct
{
char id_stead;
} id_bzf;
struct
{
char type[10];
int width;
}Z_syn;
struct
{
char addr[10];
}E_syn,T_syn,F_syn,T__syn,T_1_syn,E__syn,E_1_syn,id_bzf_syn;
struct
{
char addr[10];
}B_syn,C_syn,B__syn,B_1_syn,H_syn,C__syn,C_1_syn,H__syn,id1,id2;
token字 中间代码
2.物理设计
词法分析:
逐字读文件,与词汇表比较,相同的用对应编码替换输出。遇到数字和标识符时,多存一个编码,记录其
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
。
语法语义分析:
采用递归下降方法,把消除左递归的文法逐码判断,递归调用非终结符命名的函数。
修改后的文法:
说明语句:
P → D
D → id:ZD’’|ε
D’ → D|S
D’’ → ;D’D’’|ε
语句文法:
S → id=E|if B then S S’|while B do S|{L}
S’ → else S|ε
L → SL’
L’ → ;SL’|ε
表达式:
E → TE’
E’ → +TE’|ε
T → FT’
T’ → *FT’|ε
F → (E)|id
布尔表达式:
B → CB’
B’ → or CB’|ε
C → HC’
C’ → and HC’|ε
H → not B|id H’
H’ → id|==id
四、测试结果
试验用程序:
a:int;
b:int;
{
if a>0 and c>0 then a=0 else a=1;
while a<5 do
a=a+1}
输出结果:
五、系统不足与经验体会
没有处理浮点数的功能,输出不太标准。
要编出一个完善的编译器是很不容易的!!
六、附录:源代码(带注释)
#include
#include
#include
#include
#define FILENAME "D:\\test.txt" /*文件的路径*/
#define RESULTFILE "D:\\token.txt" /*结果文件路径*/
#define MAXSIZE 30 /*最大变量个数*/
/*单词词类编码*/
char bm[32][10] = {"","and","bool","char","do","else","FALSE","float","for","if",
"int","not","or","then","TRUE","while","标识符","整常数","实常数","(",")","*",
"+",",","<",">","=","==",":",";","{","}"};
/*初始化标识符符表*/
char bzfb1[MAXSIZE][10] = {};
/*初始化整常数表*/
int zcsb1[MAXSIZE] = {};
/*初始化实常数表*/
float scsb[MAXSIZE] = {};
int func1(char str[10]);
int main1()
{
/*打开文件*/
int fh;
fh = open(FILENAME, O_RDONLY);
FILE* fp = fopen(RESULTFILE, "w");
if(fh == -1)
{
fprintf(fp, "File open failed!\n");
return -1;
}
char buf[10];
int i;
int j;
int k;
int n;
int numofbzf,numofzcs,numofscs,numofzero;
numofbzf = 0; numofzcs = 0; numofscs = 0; numofzero = 0;
while(1)
{
k = 0;
sym1:for(i=0;i<10;i++)
{
buf[i] = '\0';
}
i = 0;
do
{
read(fh, &buf[i], 1);
if(k >= 20)
{
goto sym5;
}
k++;
}while(buf[i] == ' ' || buf[i] == '\0' || buf[i] == '\n');
do
{
k = 0;
for(j=1;j<32;j++)
{
if(!strcmp(buf, bm[j]))
{
if( j >= 19 && j<= 31)
{
if(buf[0] == '=')
{
read(fh, &buf[1], 1);
if(buf[1] == '=')
{
j++;
}
else
{
lseek(fh, -1L, SEEK_CUR);
}
}
fprintf(fp, "<%d, >\n", j);
goto sym1;
}
break;
}
}
n = j;
i++;
read(fh,&buf[i], 1);
if(buf[i] == '(' || buf[i] == ')'|| buf[i] == '*'|| buf[i] == '+'|| buf[i] == ','|| buf[i] == '<'
|| buf[i] == '>'|| buf[i] == '='|| buf[i] == ';'|| buf[i] == ':'|| buf[i] == '{' || buf[i] == '}')
{
lseek(fh, -1L, SEEK_CUR);
goto sym4;
}
}while(buf[i] != ' ' && buf[i] != '\0' && buf[i] != '\n');
sym4:
buf[i] = '\0';
if(n < 19)
{
fprintf(fp, "<%d, >\n", n);
goto sym1;
}
if((buf[0]>=65 && buf[0]<=90)||(buf[0]>=97 && buf[0]<=122))
{
for(k=0;k<=numofbzf;k++)
{
if(!strcmp(bzfb1[k], buf))
{
fprintf(fp, "<16, %d>\n", k);
goto sym2;
}
}
for(k=1;k=65 && buf[k]<=90)||(buf[k]>=97 && buf[k]<=122)||(buf[k]>=48 && buf[k] <= 57)))
{
fprintf(fp, "invalid symbol\n");
goto sym1;
}
}
strcpy(bzfb1[numofbzf], buf);
fprintf(fp, "<16, %d>\n", numofbzf);
numofbzf++;
sym2:;
}
if(buf[0]>=48 && buf[0]<=57)
{
int ppp = 0;
int pppp = 0;
for(k=0;k=48 && buf[k]<=57))
{
fprintf(fp, "invalid symbol\n");
goto sym1;
}
else
{
ppp = (int)buf[k]-48;
for(j=0;j<(i-k-1);j++)
{
ppp = ppp*10;
}
pppp = pppp + ppp;
}
}
for(k=0;k<=numofzcs;k++)
{
if(pppp == zcsb1[k])
{
fprintf(fp, "<17, %d>\n", k);
if(pppp == 0 && numofzero == 0)
{
numofzcs++;
numofzero++;
}
goto sym3;
}
}
zcsb1[numofzcs] = pppp;
fprintf(fp, "<17, %d>\n", numofzcs);
numofzcs++;
sym3:;
}
}
sym5: close(fh);
fclose(fp);
return 0;
}
int token[200] = {};
int token_cur;
char current_char;
int i=0;
int j=0;
int k=0;
/*初始化标识符符表*/
int bzfb[MAXSIZE] = {};
/*初始化整常数表*/
int zcsb[MAXSIZE] = {};
int num_of_bzf = 0;
int num_of_zcs = 0;
int offset;
struct
{
char id_stead;
} id_bzf;
struct
{
char type[10];
int width;
}Z_syn;
struct
{
char addr[10];
}E_syn,T_syn,F_syn,T__syn,T_1_syn,E__syn,E_1_syn,id_bzf_syn;
struct
{
char addr[10];
}B_syn,C_syn,B__syn,B_1_syn,H_syn,C__syn,C_1_syn,H__syn,id1,id2;
int get_token();
void advanced();
void P();
void D();
void D_();
void D__();
void Z();
void S();
void S_();
void L();
void L_();
void E();
void E_();
void T();
void T_();
void F();
void B();
void B_();
void C();
void C_();
void H();
void H_();
int main()
{
main1();
get_token();
i = -1;
// FILE* fp2 = fopen(RESULTFILE, "w");
num_of_bzf = 0;
num_of_zcs = 0;
P();
// fclose(fp2);
return 0;
}
int get_token()
{
int ppp;
FILE* fp1 = fopen(RESULTFILE, "r");
fseek(fp1, 0, SEEK_SET);
while(1)
{
sym1:do
{
current_char = fgetc(fp1);
if(feof(fp1) != 0)
{
fclose(fp1);
return 0;
}
}while(current_char != '<');
ppp = 0;
ppp = (int)(fgetc(fp1)-48);
current_char = fgetc(fp1);
if(current_char>=48 && current_char<=57)
{
ppp = ppp*10 + (int)(current_char-48);
}
token[i] = ppp;
if(token[i] == 16)
{
fgetc(fp1);
fgetc(fp1);
current_char = fgetc(fp1);
bzfb[num_of_bzf] = current_char+17;
num_of_bzf++;
}
if(token[i] == 17)
{
fgetc(fp1);
fgetc(fp1);
current_char = fgetc(fp1);
zcsb[num_of_zcs] = (int)(current_char-48);
num_of_zcs++;
}
i++;
goto sym1;
}
fclose(fp1);
}
void advanced()
{
i++;
token_cur = token[i];
}
void P()
{
// printf("P -> D\n");
offset = 0;
D();
}
void D()
{
advanced();
if(token_cur == 16)
{
id_bzf.id_stead = bzfb[num_of_bzf];
num_of_bzf++;
advanced();
if(token_cur == 28)
{
// printf("D -> id:TD__\n");
Z();
printf("enter(%c, %s, %d)\n", id_bzf.id_stead, Z_syn.type, offset);
offset = offset + Z_syn.width;
D__();
}
else
{
printf("error in D()\n");
}
}
else
{
// printf("D -> $\n");
i = i - 1;
}
}
void D_()
{
advanced();
if(token_cur == 30)
{
// printf("D_ -> S\n");
i = i-1;
S();
}
else
{
// printf("D_ -> D\n");
i = i-1;
D();
}
}
void D__()
{
advanced();
if(token_cur == 29)
{
// printf("D__ -> ;D_D__\n");
D_();
D__();
}
else
{
// printf("D__ -> $\n");
i = i-1;
}
}
void Z()
{
advanced();
int i;
for(i=0;i<10;i++)
{
Z_syn.type[i] = '\0';
}
Z_syn.width = 0;
if(token_cur == 10)
{
// printf("Z -> int\n");
Z_syn.type[0] = 'i'; Z_syn.type[1] = 'n'; Z_syn.type[2] = 't';
Z_syn.width = 4;
}
else
{
printf("error in Z()\n");
}
}
void S()
{
advanced();
if(token_cur == 16)
{
id_bzf_syn.addr[0] = bzfb[num_of_bzf];
num_of_bzf++;
advanced();
if(token_cur == 26)
{
// printf("S -> id = E\n");
E();
printf("{'=', '%s', '', '%s'}\n", E_syn.addr, id_bzf_syn.addr);
}
else
{
printf("error in S()\n");
}
}
else if(token_cur == 9)
{
// printf("S -> if B then S S_\n");
B();
printf("{'jnz', '%s', '', 'K+2'}\n", B_syn.addr);
printf("{'j', '', '', ''}\n");
advanced();
if(token_cur == 13)
{
S();
S_();
}
else
{
printf("error in S()\n");
}
}
else if(token_cur == 15)
{
// printf("S -> while B do S\n");
B();
printf("{'jnz', '%s', '', 'L%d+2'}\n", B_syn.addr, k);
printf("{'j', '', '', ''}\n");
advanced();
if(token_cur == 4)
{
S();
printf("{'j', '', '', 'L%d'}", k);
}
else
{
printf("error in S()\n");
}
}
else if(token_cur == 30)
{
// printf("S -> {L}\n");
L();
advanced();
if(token_cur != 31)
{
printf("error in S()\n");
}
}
else
{
printf("error in S()\n");
}
}
void S_()
{
advanced();
if(token_cur == 5)
{
// printf("S_ -> else S\n");
printf("{'jz', '%s', '', 'K+2'}\n", B_syn.addr);
printf("{'j', '', '', ''}\n");
S();
}
else
{
// printf("S_ -> $\n");
i = i - 1;
}
}
void L()
{
// printf("L -> SL_\n");
S();
L_();
}
void L_()
{
advanced();
if(token_cur == 29)
{
// printf("L_ -> ;SL\n");
S();
L_();
}
else
{
// printf("L_ -> $\n");
i = i - 1;
}
}
void E()
{
// printf("E -> TE_\n");
T();
strcpy(E__syn.addr,T_syn.addr);
E_();
strcpy(E_syn.addr, E__syn.addr);
}
void E_()
{
advanced();
if(token_cur == 22)
{
// printf("E_ -> +TE_\n");
T();
printf("{'+', '%s', '%s', 't%d'}\n", E__syn.addr, T_syn.addr, j);
E_1_syn.addr[0] = 't';
E_1_syn.addr[1] = (char)(j+48);
j++;
E_();
strcpy(E__syn.addr, E_1_syn.addr);
}
else
{
// printf("E_ -> $\n");
i = i - 1;
}
}
void T()
{
// printf("T -> FT_\n");
F();
strcpy(T__syn.addr,F_syn.addr);
T_();
strcpy(T_syn.addr, T__syn.addr);
}
void T_()
{
advanced();
if(token_cur == 21)
{
// printf("T_ -> *FT_\n");
F();
printf("{'*', '%s', '%s', 't%d'}\n", T__syn.addr, F_syn.addr, j);
T_1_syn.addr[0] = 't';
T_1_syn.addr[1] = (char)(j+48);
j++;
T_();
strcpy(T__syn.addr,T_1_syn.addr);
}
else
{
// printf("T_ -> $\n");
i = i - 1;
}
}
void F()
{
advanced();
if(token_cur == 19)
{
// printf("F -> (E)\n");
E();
strcpy(F_syn.addr, E_syn.addr);
advanced();
if(token_cur != 20)
{
printf("error in F()\n");
}
}
else if(token_cur == 16 || token_cur == 17)
{
// printf("F -> id\n");
if(token_cur == 16)
{
F_syn.addr[0] = bzfb[num_of_bzf];
num_of_bzf++;
}
if(token_cur == 17)
{
F_syn.addr[0] = (char)(zcsb[num_of_zcs]+48);
num_of_zcs++;
}
}
else
{
printf("error in F()\n");
}
}
void B()
{
// printf("B -> CB_\n");
C();
strcpy(B__syn.addr,C_syn.addr);
B_();
strcpy(B_syn.addr,B__syn.addr);
}
void B_()
{
advanced();
if(token_cur == 12)
{
// printf("B_ -> or CB_\n");
C();
printf("{'or', '%s', '%s', 't%d'}\n", B__syn.addr, C_syn.addr, j);
B_1_syn.addr[0] = 't';
B_1_syn.addr[1] = (char)(j+48);
j++;
B_();
strcpy(B__syn.addr,B_1_syn.addr);
}
else
{
// printf("B_ -> $\n");
i = i - 1;
}
}
void C()
{
// printf("C -> HC_\n");
H();
strcpy(C__syn.addr,H_syn.addr);
C_();
strcpy(C_syn.addr,C__syn.addr);
}
void C_()
{
advanced();
if(token_cur == 1)
{
// printf("C_ -> and HC_\n");
H();
printf("{'and', '%s', '%s', 't%d'}\n", C__syn.addr, H_syn.addr, j);
C_1_syn.addr[0] = 't';
C_1_syn.addr[1] = (char)(j+48);
j++;
C_();
strcpy(C__syn.addr,C_1_syn.addr);
}
else
{
// printf("C_ -> $\n");
i = i - 1;
}
}
void H()
{
advanced();
if(token_cur == 11)
{
// printf("H -> not B\n");
B();
printf("{'not', '%s', , 't%d'}\n", B_syn.addr, j);
H_syn.addr[0] = 't';
H_syn.addr[1] = (char)(j+48);
j++;
}
else if(token_cur == 16 || token_cur == 17)
{
// printf("B -> idH_\n");
if(token_cur == 16)
{
id1.addr[0] = bzfb[num_of_bzf];
num_of_bzf++;
}
if(token_cur == 17)
{
id1.addr[0] = (char)(zcsb[num_of_zcs]+48);
num_of_zcs++;
}
H_();
strcpy(H_syn.addr,H__syn.addr);
}
else
{
printf("error in H()");
}
}
void H_()
{
advanced();
if(token_cur == 24)
{
// printf("H_ -> >i\n");
advanced();
if(token_cur == 17)
{
id2.addr[0] = (char)(zcsb[num_of_zcs]+48);
num_of_zcs++;
}
printf("{'>', '%s', %s, 't%d'}\n", id1.addr, id2.addr, j);
H__syn.addr[0] = 't';
H__syn.addr[1] = (char)(j+48);
j++;
if(token_cur != 17)
{
printf("error in H_()\n");
}
}
else if(token_cur == 27)
{
// printf("H_ -> ==i\n");
advanced();
if(token_cur == 17)
{
id2.addr[0] = (char)(zcsb[num_of_zcs]+48);
num_of_zcs++;
}
printf("{'==', '%s', %s, 't%d'}\n", id1.addr, id2.addr, j);
H__syn.addr[0] = 't';
H__syn.addr[1] = (char)(j+48);
j++;
if(token_cur != 17)
{
printf("error in H_()\n");
}
}
else
{
printf("error in H_\n");
}
}
原始代码
词法分析器
语法语义分析器