资源简介
词法分析器、语法分析器、语义分析器的简单程序
代码片段和文件信息
#include /*定义I/O库所用的某些宏和变量*/
#include /*定义字符串库函数*/
void scaner();
char prog[80]token[8];
char ch;
int synpmnsum; /*p是缓冲区prog的指针m是token的指针*/
char *rwtab[6]={“begin““if““then““while““do““end“};
void main()
{ char flag=‘r‘; int count;
while(flag == ‘r‘)
{ for(n=0;n<80;n++) prog[n]=NULL;
p=0;
printf(“\n 请输入源程序字符串(以#号结束): \n“);
printf(“ “);
count=1;
do{
ch=getchar();
if(count==1)
{ if(ch!=‘\n‘) { prog[p++]=ch; } }
else
{ prog[p++]=ch; } //*输入源程序字符串,送到缓冲区prog[p++]中;*/
count++;
}while(ch!=‘#‘);
p=0;
printf(“\n 经词法分析后输出的二元组序列: \n“);
do
{ scaner();
switch(syn)
{
case 11: printf(“ (%d%d)“synsum); break;/*输出(数的二元组);break;*/
case -1: printf(“ error“); break; /*输出(错误);break;*/
default: printf(“ (%d%s)“syntoken); /*输出(其他单词二元组);*/
}
}while(syn!=0);
printf(“\n\n 返回请选择‘r‘退出请选择其他:\n“);
printf(“ “);scanf(“%s“&flag);
}
printf(“\n“);
}
/////////////////////////////////////////////////////////////////////////////
void scaner()
{ for(n=0;n<8;n++) token[n]=NULL;
ch=prog[p++]; /*读下一个字符;*/
while(ch == ‘ ‘) ch=prog[p++]; /*读下一个字符;*/
if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘z‘)) /*ch是字母字符*/
{ m=0;
while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘z‘)||(ch>=‘0‘&&ch<=‘9‘))/*ch是字母字符或数字字符*/
{ token[m++]=ch;
ch=prog[p++]; /*读下一个字符;*/
}
token[m++]=‘\0‘; ch=prog[--p]; /*回退一个字符;*/
syn=10;
for(n=0;n<6;n++)
if(strcmp(tokenrwtab[n]) == 0)
{ syn=n+1; /*给出syn值;*/
break;
}
}
else
if(ch>=‘0‘&&ch<=‘9‘) /*ch是数字字符*/
{ m=0; sum=0;
while(ch>=‘0‘&&ch<=‘9‘) /*ch为数字字符*/
{ sum =sum*10+ch-‘0‘;
ch=prog[p++]; /*读下一个字符;*/
}
token[m++]=‘\0‘; ch=prog[--p]; /*回退一个字符;*/
syn=11;
}
else
switch(ch)
{
case‘<‘: m=0; token[m++]=ch;
ch=prog[p++]; /*读下一个字符;*/
if(ch == ‘>‘)
{ syn=21;
token[m++]=ch; token[m++]=‘\0‘;
}
else if(ch==‘=‘)
{ syn=22;
token[m++]=ch; token[m++]=‘\0‘;
}
else
{ syn=20; token[m++]=‘\0‘; ch=prog[--p];/*回退一个字符;*/}
break;
case‘>‘: m=0; token[m++]=ch;
ch=prog[p++]; /*读下一个字符;*/
if(ch == ‘=‘)
{ syn=24;
token[m++]=ch; token[m++]=‘\0‘;
}
else
{ syn=23;
token[m++]=‘\0‘; ch=prog[--p]; /*回退一个字符;*/
}
break;
case‘:‘: m=0; token[m++]=ch;
ch=prog[p++]; /*读下一个字符;*/
if(ch == ‘=‘)
{ syn=18;
token[m++]=ch;
}
else
{ syn=17;
token[m++]=‘\0‘; ch=prog[--p];/*回退一个字符;*/
}
break;
case‘+‘: syn=13;token[0]=ch;break;
case‘-‘: syn=14;token[0]=ch;break;
case‘*‘: syn=15;token[0]=ch;break;
case‘/‘: syn=16;token[0]=ch;break;
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 198144 2009-06-02 22:58 语义分析\语义分析.doc
文件 7954 2009-06-02 21:49 语义分析\语义分析.cpp
文件 3441 2009-06-02 22:08 词法分析\词法分析.cpp
文件 124928 2009-06-02 22:27 词法分析\词法分析.doc
文件 168448 2009-06-02 22:29 语法分析\语法分析.doc
文件 5127 2009-06-02 22:21 语法分析\语法分析.cpp
目录 0 2009-06-02 23:53 语义分析
目录 0 2009-06-02 23:53 词法分析
目录 0 2009-06-02 23:53 语法分析
----------- --------- ---------- ----- ----
508042 9
- 上一篇:计算机图形学试卷
- 下一篇:微服务架构的分布式事务解决方案完整31讲-龙果学院
评论
共有 条评论