编译原理 词法分析程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验1 词法分析程序设计【实验目的】
(1)理解词法分析在编译程序中的作用
(2)加深对有穷自动机模型的理解
(3)掌握词法分析程序的实现方法和技术
【实验内容】
对一个简单语言的子集编制一个一遍扫描的词法分析程序。
【设计思路】
图1.1 词法分析主程序示意图
2、源程序代码
(1)scan.h //头文件-----扫描程序
#include
#include
#define CLEAR memset(token,'\0',sizeof(token))//清空数组token
char prog[80],token[8];
char ch;
int syn,p,m,n,sum; //p是缓冲区prog的指针,m是token的指针char *rwtab[6]={"begin","if","then","while","do","end"};
void scanner() //词法扫描程序
{
CLEAR;m=0;
while(ch==' ')
{
++p;ch=prog[p]; //读下一个字符;
}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
m=0;
while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
{
token[m++]=ch;
++p;ch=prog[p];//读下一个字符;
}
token[m++]='\0';
syn=10;
for(n=0;n<6;++n)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else
if(ch>='0'&&ch<='9')
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum*10+ch-'0';//将ch转换为数字
++p;
ch=prog[p];
}
syn=11;
}
else
switch(ch)//其他字符情况
{
case'<':
m=0;token[m++]=ch;
++p;
ch=prog[p];
if(ch=='>')
{
syn=21;
++m;
token[m]=ch;
}
else if(ch=='=')
{
syn=22;
++m;
token[m]=ch;
}
{
syn=20;
}
break;
case'>':
token[0]=ch;
++p;
ch=prog[p];
if(ch=='=')
{
syn=24;
token[0]=ch;
}
else
{
syn=23;
}
break;
case':':
token[0]=ch;
++p;
ch=prog[p];
if(ch=='=')
{
syn=18;
++m;
token[m]=ch;
++p;
ch=prog[p];
}
else
{
syn=17;
}
break;
case'+':
syn=13;token[0]=ch;ch=prog[++p];
break;
case'-':
syn=14;token[0]=ch;ch=prog[++p];
break;
case'*':
syn=15;token[0]=ch;ch=prog[++p];
case'/':
syn=16;token[0]=ch;ch=prog[++p];
break;
case'=':
syn=25;token[0]=ch;ch=prog[++p];
break;
case';':
syn=26;token[0]=ch;ch=prog[++p];
break;
case'(':
syn=27;token[0]=ch;ch=prog[++p];
break;
case')':
syn=28;token[0]=ch;ch=prog[++p];
break;
case'#':
syn=0; token[0]=ch;ch=prog[++p];
break;
default:
syn=-1;
}
}
(2)word.cpp // 词法分析主程序
#include"scan.h"
void main(void)
{
p=0;
printf("\n please input string:\n");
do{
ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
ch=prog[0];
if(ch>='0'&&ch<='9')
printf("error!\n");
else
{
do
{
scanner();//调用扫描子程序
switch(syn)