求编译原理课程设计

要求:
翻译 +,-,*, / 四则运算表达式及布尔表达式,翻译包含if语句,while语句及do-while语句及相互间的嵌套。包含词法分析,最终得到汇编语言目标代码。
太难了,只有3天时间,自己搞不定,有的朋友发我邮箱,
Q [email protected],多谢!

第1个回答  2011-06-08

语法规则及函数模块如下所示:
int do_stat()
{
int es=0;
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=statement();
if (es>0) return(es);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if(strcmp(token,"while")==0)
{
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if(strcmp(token,"(")) return(es=5);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
}
else es=3;
return(es);
}
//<声明语句> ::=int <变量>|<变量>;
//<declaration_stat>::=int ID,;
int declaration_stat()
{
int es=0;
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,"ID")) return(es=3); //不是标识符
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
while(strcmp(token,",")==0 )
{
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,"ID")) return(es=3); //不是标识符
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
};
if (strcmp(token,";") ) return(es=4);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
return(es);
}
//<程序>::=
//program::=
int program()
{
int es=0;
fscanf(fp,"%s %s\n",token,token1);
printf("%s %s\n",token,token1);
if(strcmp(token,"main")==0)
{
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,"(")) return(es=5); //少左括号
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,")")) return(es=6); //少右括号
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
}
else
{
es=8;
return(es);
}
if(strcmp(token,"{"))//判断是否'{'
{
es=1;
return(es);
}
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=declaration_list();
if (es>0) return(es);
es=statement_list();
if (es>0) return(es);
if(strcmp(token,"}"))//判断是否'}'
{
es=2;
return(es);
}
return(es);
}
输入如下:
main()
{int a,b,c;
read a;
read b;
c=0;
do{
c=a*b;
b=b+1;
a=a-1;
}while(b<=20)
write c;
}
输出结果如下:
请输入源程序文件名(包括路径):main.txt
词法分析成功!
main main
( (
) )
{ {
int int
ID a
, ,
ID b
, ,
ID c
; ;
read read
ID a
; ;
read read
ID b
; ;
ID c
= =
NUM 0
; ;
do do
{ {
ID c
= =
ID a
* *
ID b
; ;
ID b
= =
ID b
+ +
NUM 1
; ;
ID a
= =
ID a
- -
NUM 1
; ;
} }
while while
( (
ID b
<= <=
ID b
<= <=
NUM 20
) )
write write
ID c
; ;
ID c
; ;
} }
=====语法分析结果!======
语法分析成功!
程序分析成功!!!

别忘了加分啊,呵呵本回答被网友采纳
相似回答