语义分析程序
来源:互联网 发布:gta5美女捏脸详细数据 编辑:程序博客网 时间:2024/05/16 15:55
一:总体设计思路。
先分析简单语言的词法,也就是识别c语言中各单词符号对应的种别码;再用递归下降分析发进行语法分析,需要文法成功;之后采用递归下降语法制导翻译技术,在语法的基础上进行语义动作:将输入串翻译成四元式序列。
二:语义分析
在语法分析的基础上,将输入串翻译成四元式序列。
算法思想:
1、设置语义过程。
(1)emit(char*result,char *ag1,char *op,char *ag2)
该函数的功能是生成一个三地址语句送到四元式表中。
四元式表的结构如下:
struct
{ char result[8];
char ag1[8];
char op[8];
char ag2[8];
}quad[20];
(2) char *newtemp()
该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,…
char *newtemp(void)
{ char *p;
char m[8];
p=(char *)malloc(8);
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]=’t’;
return(p);
}
2、函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。
三:附源程序代码
#include "stdio.h"
#include "string.h"
char prog[100],token[8],ch;
char *rwtab[6]={"begin","if","then","while","do","end"};
int syn,p,m,n,sum,q;
int kk;
struct { char result1[8];
char ag11[8];
char op1[8];
char ag21[8];
} quad[20];
char *factor();
char *expression();
int yucu();
char *term();
int statement();
int lrparser();
char *newtemp();
scaner();
emit(char *result,char *ag1,char*op,char *ag2);
main()
{ int j;
q=p=kk=0;
printf("\n**************************************");
printf("\nplease input a string (end with'#'): ");
do
{ scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
scaner();
lrparser();
if(q>19)printf(" too longsentense!\n");
else for(j=0;j<q;j++)printf(" %s = %s%s %s \n\n",quad[j].result1,quad[j].ag11,quad[j].op1,quad[j].ag21);
getch();
}
int lrparser()
{ int schain=0;
kk=0;
if (syn==1)
{ scaner();
schain=yucu();
if(syn==6)
{ scaner();
if((syn==0)&&(kk==0)) printf("Success!\n");
}
else { if(kk!=1)printf("short of 'end'!\n");
kk=1;
getch();
exit(0);
}
}
else { printf("short of 'begin' !\n");
kk=1;
getch();
exit(0);
}
return (schain);
}
int yucu()
{ int schain=0;
schain=statement();
while(syn==26)
{ scaner();
schain=statement();
}
return (schain);
}
int statement()
{ char tt[8],eplace[8];
int schain=0;
if (syn==10)
{ strcpy(tt,token);
scaner();
if(syn==18)
{ scaner();
strcpy(eplace,expression());
emit(tt,eplace,"","");
schain=0;
}
else { printf("short of sign ':='!\n");
kk=1;
getch();
exit(0);
}
return (schain);
}
}
char *expression()
{ char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);
strcpy(eplace,term());
while((syn==13)||(syn==14))
{ if(syn==13)strcpy(tt,"+");
else strcpy(tt,"-");
scaner();
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
char *term()
{ char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);
strcpy(eplace,factor());
while((syn==15)||(syn==16))
{ if (syn==15)strcpy(tt,"*");
else strcpy(tt,"/");
scaner();
strcpy(ep2,factor());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
char *factor()
{ char *fplace;
fplace=(char *)malloc(12);
strcpy(fplace,"");
if(syn==10)
{ strcpy(fplace,token);
scaner();
}
else if(syn==11)
{ itoa(sum,fplace,10);
scaner();
}
else if(syn==27)
{ scaner();
fplace=expression();
if(syn==28) scaner();
else { printf("error on ')'!\n");
kk=1;
getch();
exit(0);
}
}
else { printf("error on '(' !\n");
kk=1;
getch();
exit(0);
}
return (fplace);
}
char *newtemp()
{ char *p;
char m[8];
p=(char *)malloc(8);
kk++;
itoa(kk,m,10);
strcpy(p+1,m);
p[0]='t';
return(p);
}
scaner()
{ sum=0;
for(m=0;m<8;m++)token[m++]=NULL;
m=0;
ch=prog[p++];
while(ch==' ')ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
token[m++]='\0';
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{ syn=n+1;
break;
}
}
else if((ch>='0')&&(ch<='9'))
{while((ch>='0')&&(ch<='9'))
{ sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{ case '<':m=0;
ch=prog[p++];
if(ch=='>')
{ syn=21;
}
else if(ch=='=')
{ syn=22;
}
else
{ syn=20;
p--;
}
break;
case '>':m=0;
ch=prog[p++];
if(ch=='=')
{ syn=24;
}
else
{ syn=23;
p--;
}
break;
case ':':m=0;
ch=prog[p++];
if(ch=='=')
{ syn=18;
}
else
{ syn=17;
p--;
}
break;
case '+': syn=13; break;
case '-': syn=14; break;
case '*': syn=15;break;
case '/': syn=16;break;
case '(': syn=27;break;
case ')': syn=28;break;
case '=': syn=25;break;
case ';': syn=26;break;
case '#': syn=0;break;
default: syn=-1;break;
}
}
emit(char *result,char *ag1,char*op,char *ag2)
{
strcpy(quad[q].result1,result);
strcpy(quad[q].ag11,ag1);
strcpy(quad[q].op1,op);
strcpy(quad[q].ag21,ag2);
q++;
}
- 语义分析程序
- 词法语法语义分析程序
- 语义分析
- 语义分析
- 一个简单的编译原理词法语法语义分析程序
- 语义分析语义关联挖掘
- 语义检查lint程序
- 语义分析课程设计
- 编译原理语义分析
- 值语义的分析
- 语义分析资料
- SNL编译器,语义分析
- 潜在语义分析
- 编译语义分析实验
- 编译原理---语义分析
- 语法和语义分析
- LSA潜在语义分析
- 语义分析若干知识
- 第三十九题 关于C++中类的对象的大小
- Android界面刷新
- 内存管理中的三种地址
- Qt移动应用开发(一):适配不同的屏幕
- 设计模式六大原则(1):单一职责原则
- 语义分析程序
- SQL Server 2008 各种DateTime的取值范围
- Solaris字符集的设置和FTP的使用
- mysql性能优化-慢查询分析、优化索引和配置
- 类之间的关系
- windows常用命令总结
- Winphone开发之异步任务处理
- 桶排序
- 设计模式六大原则(2):里氏替换原则(Liskov Substitution Principle)