词法分析

实验一、词法分析实验

专业::商业软件工程1班  姓名:罗冠达  学号:201506110095

一、        实验目的

编制一个词法分析程序

二、        实验内容和要求

—输入:源程序字符串

—输出:二元组(种别,单词本身)

—待分析语言的词法规则

三、        实验方法、步骤及结果测试

 

  1. 1.      源程序名:压缩包文件(rarzip)中源程序名词法分析.c

可执行程序名:词法分析.exe

  1. 2.      原理分析及流程图

 

 

  1. 3.      主要程序段及其解释:

#include<stdio.h>

#include<string.h>

#include<iostream.h>

char prog[80],token[8];

char ch;

int syn,p,m=0,n,row,sum=0;

char *rwtab[6]={"begin","if","then","while","do","end"};

void scaner()

{

for(n=0;n<8;n++)

token[n]=NULL;

ch=prog[p++];

while(ch==' ')

{

ch=prog[p];

p++;

}

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

{

m=0;

while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

{

token[m++]=ch;

ch=prog[p++];

}

token[m++]='\0';

p--;

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=prog[p++];

}

}

p--;

syn=11;

if(sum>32767)

syn=-1;

}

else switch(ch)

 

{

case'<':m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='>')

{

syn=21;

token[m++]=ch;

}

else if(ch=='=')

{

syn=22;

token[m++]=ch;

}

else

{

syn=23;

p--;

}

break;

case'>':m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{

syn=24;

token[m++]=ch;

}

else

{

syn=20;

p--;

}

break;

case':':m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{

syn=18;

token[m++]=ch;

}

else

{

syn=17;

p--;

}

break;

case'*':syn=13;token[0]=ch;break;

case'/':m=0;m=0;token[m++]=ch;

if(ch=='*')

{

syn=14;token[0]=ch;}

if(ch=='/')

{

token[m++]=ch;

ch=prog[p++];

}

break;

case'+':syn=15;token[0]=ch;break;

case'-':syn=16;token[0]=ch;break;

case'=':syn=25;token[0]=ch;break;

case';':syn=26;token[0]=ch;break;

case'(':syn=27;token[0]=ch;break;

case')':syn=28;token[0]=ch;break;

case'#':syn=0;token[0]=ch;break;

case'\n':syn=-2;break;

default:syn=-1;break;

}

}

int main()

{

p=0;

row=1;

cout<<"Please input string:"<<endl;

do

{

cin.get(ch);

prog[p++]=ch;

}

while(ch!='#');

p=0;

do

{

scaner();

switch(syn)

{

case 11: cout<<"("<<syn<<","<<sum<<")"<<endl; break;

case -1: cout<<"Error in row"<<row<<"!"<<endl; break;

case -2: row=row++;break;

default: cout<<"("<<syn<<","<<token<<")"<<endl;break;

}

}

while(syn!=0);

}

 

四、        实验总结

通过本次实验,我深刻的学到了很多东西。

通过本次实验,我对词法分析和语法分析原理有了更深刻的理解,

而且对词法分析和语法在实践中的应用有了更深的了解

熟悉了词法分析程序的原理,结合到平时上课学的文法,感觉编译原理真的好难,希望自己能有信心学下去。

原文地址:https://www.cnblogs.com/lg916843/p/5961407.html