编译原理词法分析器和语法分析器(急急急!!!)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告
词法分析器
实验目的
1.熟练掌握词法分析程序的基本原理
2.掌握词法分析程序的设计和实现
实验内容
1.针对一个简化的C语言子集完成对它的词法分析程序的设计与实现2.C语言子集的单词符号挤内码值
程序代码:
#include "stdio.h"
#include "string.h"
int i,j,k;
char s;
char a[20],token[20];
int letter()
{
if((s>=97)&&(s<=122))
return 1;
else return 0;
}
int digit()
{if((s>=48)&&(s<=57))
return 1;
else return 0;
}
void get()
{
s=a[i];
i=i+1;
}
void retract()
{i=i-1;}
int lookup()
{
if(strcmp(token, "while")==0)return 1;
else if(strcmp(token, "if")==0)return 2;
else if(strcmp(token,"else")==0)return 3;
else if(strcmp(token,"switch")==0)return 4;
else if(strcmp(token,"case")==0)return 5;
else return 0;
}
void main()
{printf("输入源程序,结束用'#':\n");
i=0;
do{i++;
scanf("%c",&a[i]);
}while(a[i]!='#');
i=1;
memset(token,0,sizeof(char)*20);
j=0;
get();
while(s!='#')
{if(s==' ')
get();
else
{switch(s){
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
case'g':
case'h':
case'i':
case'j':
case'k':
case'l':
case'm':
case'n':
case'o':
case'p':
case'q':
case'r':
case's':
case't':
case'u':
case'v':
case'w':
case'x':
case'y':
case'z':
while(letter(s)||digit(s))
{token[j]=s;
j++;
get();
}
retract();
k=lookup();
if(k==0)printf("(%d,%s)\n",6,token); else printf("(%d,unll)\n",k); break;
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
while(digit(s)){
token[j]=s;
j=j+1;
get();
}
retract();
printf("(%d,%s)\n",7,token); break;
case'+':printf("(+,null)\n"); break;
case'-':printf("(-,null)\n");
break;
case'*':printf("(*,null)\n");
break;
case'<':
get();
if(s=='=')
printf("(relop,LE)\n");
else {
retract();
printf("(relop,LT)\n");
}
break;
case'=':
get();
if(s=='=')printf("(relop,EQ)\n");
else{
retract();
printf("(=,null)\n");
}
break;
case';':printf("(;,null)\n");
break;
default:printf("(%c,error)\n",s);
break;
}
memset(token,0,sizeof(char)*10);
j=0;
get();
}
}
}
运行结果: