侯东升 尹李甜 唐梦兰
摘要: 掌握计算机语言的词法分析程序的开发方法以及计算机语言的语法分析程序设计与属性文法应用的实现方法。培养“计算思维能力”——模型化、抽象思维能力、逻辑思维能力以及算法设计与分析能力,程序设计与实现能力和计算机系统的认知、分析、设计和应用能力。
关键字:语法分析 计算机系统
中图分类号:G623文献标识码: A
1实现的功能
编制一个能够分析证书、标示符、主要运算符和主要关键字的词法分析程序。
2需求分析
给出类扩充的样本S语言的词法和语法定义,并根据对应的语法定义写出一些属性文法和语法制导。根据词法和语法的定义,构造一个编译程序,它主要可以完成如下功能:
1、读入某个已经编辑好的类S语言源程序文件。
2、语法分析器将产生的二元组作为输入,进行语法分析,同时检查语法错误;
3、在语法分析同时,利用属性文法和语法制导技术,产生具体的语意动作,并对符号表进行操作;
4、根据语义动作产生整个源程序的四元式序列;
5、将产生的四元式序列连同符号表一起输出,作为编译程序的最终输出结果;
6、对最后的代码优化和目标代码生成要有所考虑,必须留有一定的接口供以后扩展;
7、增大程序的可移植性,努力做到整个系统方便移植。
3问题及解决方法
1. 本次的实验我们采用了LL(1)文法,做的时候,首先求出项目集规范族,然后根据项目集规范族画出状态转移图,进而根据状态转移图形成分析表。
2.为打出3 地址码有两种方法,一是利用回填技术,二是先构造出语法树,之后再通过自顶向下遍历这棵语法树打出3 地址码。我采用了第2 种方法。
4详细设计
4.1函数子程序
1)char *newTemp()
该函数的功能是会动一个新的临时变量,临时变量名产生的顺序是T1,T2,T3,….
2)int merge(int p1,int p2)
该函数的功能是将以P1,P2为链首的两条链合并成一条链,返回时的函数值作为合并后的链首。
3)void backpatch(int p,int t)
该函数的功能是把P所链接的每个四元式的第四区段(result段)都回填t。
4)void fuzhi()
该函数的功能是对赋值语句进行分析。
5)void tiaojian(int *nChain)
该函数的功能是对条件语句进行分析。
6)void xunhuan()
该函数的功能是对循环语句进行分析。
//<循环语句>::=do <语句块>while <条件>
void xunhuan()
char res[10],num1[10],num2[10],op[10];
int nChainTemp;
if(syn==8) //do {
nnc=nextq; //记住if语句位置,emit之后nextq就变了
//emit("0","if",num1,"goto");
scanner();
staBlock(&nChainTemp); //语句块
if(syn==9) //while
{
scanner();
if(syn==26) //(
{
scanner();
strcpy(num1,E());
if((syn<=37)&&(syn>=32))
{
switch(syn)
{
case 32:
strcpy(op,">");
break;
case 33:
strcpy(op,">=");
break;
case 34:
strcpy(op,"<");
break;
case 35:
strcpy(op,"<=");
break;
case 36:
strcpy(op,"==");
break;
case 37:
strcpy(op,"!=");
break;
default:
printf("error");
}
}
scanner();
strcpy(num2,E());
strcat(num1,op);
strcat(num1,num2);
nnb=nextq;
emit("0","if",num1,"goto");
backpatch(nnb,nnc);
nna=nextq;
emit("0","","","goto");
backpatch(nna,nextq);
}
if(syn==27)//)
scanner();
}
}
}
参考文献:
1 徐国定《编译原理》 2007-6-1高等教育出版社
2 孟宪福 《c++语言程序设计》 2011.12 清华大学出版社