编译原理-词法分析程序的设计说明

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档