编译器实验报告
emit("0","if",num1,"goto");
nfc=nextq; //if中表达式为假
emit("0","","","goto");
//第一个0已回填
backpatch(ntc,nextq); //ntc链接的所有四元式都回填nextq
}
if(syn==27) //)
scanner();
staBlock(&nChainTemp); //语句块
int nChainTemp;
//<条件>-><表达式><关系运算符><表达式>
if(syn==6) //if
{
scanner();
//strcpy(num1,E());
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,"==");
ID::=字母(字母|d数字)*
字母::=a|b|c…|z|A|B|C…|Z
数字::=0|1|2…|9
<关系运算符> ::=<|<=|>|>=|==|!=
词法分析程序语法分析程序语义分析程序编译器。不断完善,不断改进。渐变的过程。在此给出算法思想。
二、流程图
图 1主函数示意图
图2递归下降分析程序示意图
该函数的功能是生成一个三地址语句送到四元式表中。
void emit(char *res,char *num1,char *op,char *num2)
{strcpy(fourCom[q].result,res);
strcpy(fourCom[q].arg1,num1);
strcpy(fourCom[q].opera,op);
3、char *newTemp()
该函数的功能是会动一个新的临时变量,临时变量名产生的顺序是T1,T2,T3,….
char *newTemp()
{char *p;
char varTemp[10];
p=(char *)malloc(10);
kk++;
itoa(kk,varTemp,10);//整数转换为字符串
strcpy(p+1,varTemp);
p[0]='T';//字符串前加T,便于识别
return p;}
4、int merge(int p1,int p2)
该函数的功能是将以P1,P2为链首的两条链合并成一条链,返回时的函数值作为合并后的链首。
int merge(int p1,int p2) //合并p1和p2
<条件语句>::=if<条件><语句块>
<循环语句>::=do <语句块>while <条件>
<条件>::=<表达式><关系运算符><表达式>
<表达式> ::= <项>{+<项>|-<项>}
<项> ::= <因子>{*<因子>|/<因子>}
<因子> ::=ID|num|(<表达式>)
num::=( +|-|ε)数字*(.数字数字*|ε)( e ( +|-|ε)数字数字*|ε)
需要一台拥有WINDOWS XP、C++软件的计算机。
三、实验内容与步骤:
一、语法结构定义
<程序> ::=main()<语句块>
<语句块> ::= ‘{‘<语句串>’}’//程序用括号括起来
<语句串>::=<语句>{;<语句>};
<语句>::=<赋值语句>|<条件语句>|<循环语句>
<赋值语句>::=ID=<表达式> //赋值语句用”=”号
break;
case 37:
strcpy(op,"!=");
break;
default:
printf("error");
}
}
scanner();
strcpy(num2,E());
strcat(num1,op);
strcat(num1,num2);
//nfc=nextq+1;
ntc=nextq; //记住if语句位置
该函数的功能是把P所链接的每个四元式的第四区段(result段)都回填t。
void backpatch(int p,int t)
{
int w,circle=p;
while(circle) //circle不为0的时候
{
w=atoi(fourCom[circle].result); //四元式circle第四分量内容
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) //(
*nChain=merge(nChainTemp,nfc);
}
}
8、void xunhuan()
该函数的功能是对循环语句进行分析。
//<循环语句>::=do <语句块>while <条件>
void xunhuan()
{
char res[10],num1[10],num2[10],op[10];
int nChainTemp;
//strcpy(fourCom[circle].result,p1);
sprintf(fourCom[circle].result,"%s",p1);
}
//目的是用p1的值覆盖0
}
return nResult; //p2是头,p1覆盖0,接在p2后边
}
5、void backpatch(int p,int t)
图3语句块分析示意图
图4语句串分析示意图
图5语句分析示意图
void scanner(); //扫描
void lrparser();
void staBlock(int *nChain); //语句块
void staString(int *nChain); //语句串
void sta(int *nChain); //语句
emit(res,num,"=","");
}
else
{
printf("缺少=号\n");
}
}
}
7、void tiaojian(int *nChain)
该函数的功能是对条件语句进行分析。
//<条件语句>->if(<条件>)<语句块>
void tiaojian(int *nChain)
{
char res[10],num1[10],num2[10],op[10];
void fuzhi() //赋值语句只有1个操作数
{
char res[10],num[10]; //num操作数
if(syn==10) //字符串
{
strcpy(res,token); //结果
scanner();
if(syn==21) //=
{
scanner();
strcpy(num,E());
甘肃政法学院
本科学生实验报告
姓名学院
专业班级ቤተ መጻሕፍቲ ባይዱ
实验课程名称编译原理
试验时间2012年12月20日
指导教师及职称
实验成绩
开课时间2012-2013学年1学期
甘肃政法学院实验管理中心印制
实验题目
编译器实验报告
小组合作
否
姓 名
班 级
学 号
一、实验目的:
采用递归下降(自上而下)的语法制导翻译法。
二、实验环境:
void fuzhi(); //赋值语句
void tiaojian(int *nChain); //条件语句
void xunhuan(); //循环语句
char* E(); //Expresiion表达式
char* T(); //Term项
char* F(); //Factor因子
char *newTemp(); //自动生成临时变量
strcat(num1,num2);