编译原理词法分析实验报告1

实验1  词法分析实验报告

一、      实验目的

调试并完成一个词法分析程序,加深对词法分析原理的理解。

。。。。。

二、      实验要求

1、             待分析的简单语言的词法

(1)    关键字:

begin  if   then   while   do   end

所有关键字都是小写。

(2)    运算符和界符:

:=   +      *   /   <   <=   <>   >   >=   =   ;   (   )   #

(3)    其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:

ID=letter(letter| digit)*

NUM=digit digit *

(4)    空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。

。。。。

2、             各种单词符号对应的种别码

   

3、             词法分析程序的功能

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

。。。。

三、        源程序代码:

#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'/':syn=14;token[0]=ch;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;

       }

}

void 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);

}

。。。。。

四、        结果验证

1、给定源程序

begin  x:=9;  if  x>0  then  x:=2*x+1/3;  end#

输出结果

2、源程序(包括上式未有的while、do以及判断错误语句):

begin

x<=$;

while

a<0

do

b<>9-x;

end

#

输出结果

五、      收获(体会)与建议

通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。比如:main()函数中,用cin>>ch;语句得到ch值的话,给定源程序的结果第一行得到的是(10,beginx),因为得到的字符串中省略了空格,改用cin.get(ch);问题便解决了。另外,我在程序中加入了row变量,以便能够准确得到错误所在。

实验二时发现怎么出结果都会出现一个缺:=错误,便回头检查代码才发现实验一时的scaner()函数最后的:和:=的种别码互相写错了,所以回过头来重新修正了代码和实验结果图。

实验1  词法分析实验报告

六、      实验目的

调试并完成一个词法分析程序,加深对词法分析原理的理解。

七、      实验要求

1、             待分析的简单语言的词法

(1)    关键字:

begin  if   then   while   do   end

所有关键字都是小写。

(2)    运算符和界符:

:=   +      *   /   <   <=   <>   >   >=   =   ;   (   )   #

(3)    其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:

ID=letter(letter| digit)*

NUM=digit digit *

(4)    空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。

2、             各种单词符号对应的种别码

   

3、             词法分析程序的功能

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;

token为存放的单词自身字符串;

sum为整型常数。

八、        源程序代码:

#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'/':syn=14;token[0]=ch;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;

       }

}

void 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);

}

。。。。。

九、        结果验证

1、给定源程序

begin  x:=9;  if  x>0  then  x:=2*x+1/3;  end#

输出结果

2、源程序(包括上式未有的while、do以及判断错误语句):

begin

x<=$;

while

a<0

do

b<>9-x;

end

#

输出结果

十、      收获(体会)与建议

通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。比如:main()函数中,用cin>>ch;语句得到ch值的话,给定源程序的结果第一行得到的是(10,beginx),因为得到的字符串中省略了空格,改用cin.get(ch);问题便解决了。另外,我在程序中加入了row变量,以便能够准确得到错误所在。

实验二时发现怎么出结果都会出现一个缺:=错误,便回头检查代码才发现实验一时的scaner()函数最后的:和:=的种别码互相写错了,所以回过头来重新修正了代码和实验结果图。

相关推荐