编译原理实验 词法分析&语法分析程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验
词
法
分
析
程
序
实验一:词法分析程序
1、实验目的
从左至右逐个字符的对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号形式的中间程序。
2、实验内容
表C语言子集的单词符号及内码值
单词符号种别编码助记符内码值
while 1 while --
if 2 if --
else 3 else --
switch 4 switch --
case 5 case --
标识符 6 id id在符号表中的位置
常数7 num num在常数表中的位置
+ 8 + --
- 9 - --
* 10 * --
<= 11 relop LE
< 11 relop LT
== 11 relop LQ
= 12 = --
; 13 ; --
输入源程序如下
if a==1 a=a+1;
else a=a+2;
输出对应的单词符号形式的中间程序
3、实验过程
实验上机程序如下:
#include "stdio.h"
#include "string.h"
int i,j,k;
char s ,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("please input you source program,end('#'):\n");
i=0;
do
{
i=i+1;
scanf("%c",&a[i]);
}while(a[i]!='#');
i=1;
memset(token,0,sizeof(char)*10);
j=0;
get();
while(s!='#')
{
if(s==' '||s==10||s==13)
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(Digit()||letter())
{
token[j]=s;
j=j+1;
get();
}
retract();
k=lookup();
if(k==0)
printf("(6,%s)\n",token); else
printf("(%d,null)\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())
{
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);