词法分析程序课程设计

实验报告<>

一.  词法分析程序设计

一.              实验目的

加深对词法分析理论的理解,培养动手实践的能力。词法分析的功能:扫描源程序字符流,按照源语言的词法规则识别出各类单词版本号,并产生用于语法分析的符号序列,即将字符串源程序转换成符号串源程序.

.实验内容与设计思想

内容: 编写一个小的词法分析程序,并进行简单的词法进行分析.

设计思想:字符指针数组保存所有保留字,然后,每输入一个字符就检测是否匹配,若匹配则进行组合标识符,并促留在token,否则组合标识符结束,如此循环,直至输出结束.

.实验环境

Microsoft Windows XP Professional SP2下的VC+6.0

.实验程序代码

//词法分析程序

//TESTscan.cpp

#include <stdio.h>

#include <ctype.h>

#include <string.h>

#define keywordSum  9

char *keyword[keywordSum]={"if","else","for","while","do","int","read","write","real"};

char singleword[50]="+-*(){};,:&";

char doubleword[10]="><=!||";

extern char Scanin[300], Scanout[300];

extern FILE *fin,*fout;

int TESTscan()

{

   char ch,token[40];

   int es=0,j,n;

   printf("请输入源程序文件名(包括路径):");

   scanf("%s",Scanin);

   printf("请输入词法分析输出文件名(包括路径):");

   scanf("%s",Scanout);

   if((fin=fopen(Scanin,"r"))==NULL)

   {

      printf("/n打开词法分析输入文件出错!/n");

      return(1);//输入文件出错返回错误代码1

   }

   if((fout=fopen(Scanout,"w"))==NULL)

   {

      printf("/n创建词法分析输出文件出错!/n");

      return(2);

   }

   ch=getc(fin);

   while(ch!=EOF)

   {

      while(ch==' '||ch=='/n'||ch=='/t')

    ch=getc(fin);

      if(isalpha(ch))  

      {

   token[0]=ch;

   j=1;

   ch=getc(fin);

   while(isalnum(ch)) 

   {

   token[j++]=ch; 

   ch=getc(fin); 

   }

   token[j]='/0'; 

      n=0;

   while((n<keywordSum) && strcmp(token,keyword[n]))

    n++;

   if(n>=keywordSum) 

   fprintf(fout,"%s/t%s/n","ID",token);

  else

   fprintf(fout,"%s/t%s/n",token,token);

   }

   else if(isdigit(ch))

   {

   token[0]=ch;

   j=1;

   ch=getc(fin);  

   while(isdigit(ch)) 

   {

   token[j++]=ch; 

   ch=getc(fin);   

   }

   token[j]='/0';    

   fprintf(fout,"%s/t%s/n","NUM",token);

      }

   else if(strchr(singleword,ch)>0)

      {

   token[0]=ch;

   token[1]='/0';

   ch=getc(fin);

   fprintf(fout,"%s/t%s/n",token,token);   

      }

   else if(strchr(doubleword,ch)>0) 

      {

   token[0]=ch;

   ch=getc(fin); 

   if(ch=='=') 

   {

   token[1]=ch;token[2]='/0'; 

      ch=getc(fin); 

   }

   else

   token[1]='/0';

   fprintf(fout,"%s/t%s/n",token,token); 

      }

   else if(ch=='/')

      {

   ch=getc(fin); 

   if(ch=='*') 

   {  char ch1;

   ch1=getc(fin); 

   do

   {ch=ch1;ch1=getc(fin);}   

   while((ch!='*' || ch1!='/')&&ch1!=EOF);   

   ch=getc(fin);

   }

   else 

   {

    token[0]='/'; token[1]='/0';

    fprintf(fout,"%s/t%s/n",token,token); 

   }

   }

   else

   {

   token[0]=ch;token[1]='/0';

   ch=getc(fin);   

   es=3; 

   fprintf(fout,"%s/t%s/n","ERROR",token); 

      }

   }

   fclose(fin);

   fclose(fout);

   return(es); 

}

//TESTmain.cpp

//主程序

#include <stdio.h>

#include <ctype.h>

extern int TESTscan();

char Scanin[300],Scanout[300];

FILE *fin,*fout;

void main()

{

 int es=0;

 es=TESTscan();

    if (es>0) printf("词法分析有错,编译停止!");

 else printf("词法分析成功!/n");

}

.简单的词法分析

步骤:首先将{

 if(a=1||b=1)

 cout<<real;

}3.T的文件形式保存在D盘路径下,然后用C++语言编写的词法分析器进行词法分析,如下图示:

最后打用记事本打开4.T,结果如下:

{   {

if  if

(   (

ID  a

=   =

NUM 1

|   |

|   |

ID  b

=   =

NUM 1

)   )

ID  cout

<   <

<   <

real   real

;   ;

}   }

词法分析完成.

而对于此词法分析器不能识别的符号时则进行词法分析分出错,如在记事本内输入: {

       int a[2];

       a[0]=10;

       b[1]=100;

     }并以C.T文件形式保存在D盘中.

进行词法分析时如图:

用记事本打开D.T文件,会发现词法分析器无法识别”[]”!

D.T:

 {  {

int int

ID  a

ERROR  [

NUM 2

ERROR  ]

;   ;

ID  a

ERROR  [

NUM 0

ERROR  ]

=   =

NUM 10

;   ;

ID  b

ERROR  [

NUM 1

ERROR  ]

=   =

NUM 100

;   ;

}   }

实验完成.

.实验中遇到的问题及解决方法

鉴于第一次实验没有输入输出文件名的路径名的错误,第二次实验时末发现错误.

.实验心得

通过这次实验,我认识到在做实验前一定要熟读课本以确定实验要我们实现什么,怎么实现,每一步的步骤都要认真的去完成,做实验来不得半点马虎.通过这次实验,我也发现了学习编译原理的重要性,这次是第一次实验,日后的学习还需要更加努力!

附加词法分析的状态图(1)和词法分析程序流程图(2),如下图:

 

                                                                      图1

 

                                        

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值