词法分析程序设计

学习总结 专栏收录该内容
10 篇文章 0 订阅

【实验目的】

(1)理解词法分析在编译程序中的作用

(2)加深对有穷自动机模型的理解

(3)掌握词法分析程序的实现方法和技术

【实验内容】

对下述单词表定义的语言设计编制一个词法分析器。

各种单词符号对应的种别码如下表:

 

单词符号

种别编码

begin

1

if

2

then

3

while

4

do

5

end

6

l(l|d)*

10

dd*

11

+

13

-

14

*

15

/

16

:

17

:=

18

20

<> 

21

<=

22

23

>=

24

=

25

;

26

(

27

)

28

#

0

【设计代码如下】

#include<stdio.h>
#include<string.h>
#define max 200
char pro[max], lin[20];
int  n,i,syn;
char   *word[6]={ "begin", "if" , "then", "while", "do" ,"end" };   // 关键字
char   ch ;
scaner( )
{
int j=0;
for ( n=0; n<20; n++ )
lin[n]=NULL;                                               //临时数组初始化
    ch=pro[i++];
    while (ch==' ')                                               //跳过空字符
ch=pro[i++];
    if  ((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57))        //判断是否是字母或字母
    {
   if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))                       //判断标示符和关键字
{
lin[j++]=ch;
ch=pro[i++];
   while((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>=48&&ch<=57))
             { lin[j++]=ch;
               ch=pro[i++];
             }
            lin[j]='\0';
i--;
syn=10;
            for (n=0;n<6 ;n++ )
            if(strcmp(lin,word[n])==0)
{
syn=n+1;
                break ;
}


}


        else                                           //判断数字
{
while (ch>=48&&ch<=57)
{ lin[j++]=ch;
 ch=pro[i++];
}
i--;
            lin[j]='\0';
syn=11;
}
}
   else                                               //判断其它符号
   {
      /判断<,<=,<>
 if(ch=='<')
 {
lin[j++]=ch;
        ch=pro[i++];
        if (ch=='>')
{
  syn=21;
      lin[j++]=ch;
  lin[j]='\0';
}
   else if(ch=='=')
{
  syn=22;
      lin[j++]=ch;
  lin[j]='\0';
        }
   else
{
  syn=20;
      lin[j]='\0';
           i--;
}
 }
 ///判断>,>=
     else if(ch=='>')
{
lin[j++]=ch;
         ch=pro[i++];
    if (ch=='=')
{
   syn=24;
            lin[j++]=ch;
lin[j]='\0';
}
    else
{
   syn=23;
       lin[j]='\0';
i--;
}
}
判断 :,:=
      else if(ch==':')
 {
 lin[j++]=ch;
          ch=pro[i++];
     if (ch=='=')
{
     syn=18;
              lin[j++]=ch;
 lin[j]='\0';
}
     else
{
 syn=17;
         lin[j]='\0';
 i--;
}
 }
 //判断其它符号
 else if(ch=='+')
 {syn=13; lin[j++]=ch;lin[j]='\0';}
      else if(ch=='-')
 {syn=14; lin[j++]=ch;lin[j]='\0';}
      else if(ch=='*')
 {syn=15; lin[j++]=ch;lin[j]='\0';}
      else if(ch=='/')
 {syn=16; lin[j++]=ch;lin[j]='\0';}
 else if(ch=='=')
 {syn=25; lin[j++]=ch;lin[j]='\0';}
      else if(ch==';')
 {syn=26; lin[j++]=ch;lin[j]='\0';}
 else if(ch=='(')
 {syn=27; lin[j++]=ch;lin[j]='\0';}
 else if(ch==')')
 {syn=28; lin[j++]=ch;lin[j]='\0';}
      else if(ch=='#')
 {syn=0; lin[j++]=ch;lin[j]='\0';}
      else
 syn=-1;
   }
   return syn;
}
void read()   //定义从文件读入数据函数
{
FILE *fp;
int k;
fp=fopen("shi_yan.txt","r");
for(k=0;k<max-1;k++)
{
fscanf(fp,"%c",&pro[k]);
}
pro[k]='\0';
fclose(fp);
}
void main()
{      int i=0 ;
       printf("**************************************************************************\n");
       printf("*********************************种别编码*********************************\n");
  printf("**************************************************************************\n");
  printf("(1,begin)       (2,if)                 (3,then)         (4,while)    (5,do)\n");
  printf("(6,end)         (10,基本标示符)        (11,数字)        (13,+)       (14,-)\n");
  printf("(15,*)          (16,/)                 (17,:)           (18,:=)      (20,<)\n");
  printf("(21,<>)         (22,<=)                (23,>)           (24,>=)      (25,=)\n");
  printf("(26,;)          (27,()                 (28,))           (0,#)\n");
       read();
  printf( "\n\n读入的字符串如下: \n\n" );
  puts(pro);
  printf( "\n词法分析结果如下:\n" );
  printf( "\n" );
  do
  {     scaner();
             switch(syn)
{
    case 11:   printf ("(%d,%s)\n",syn,lin); break;
                 case -1:  printf("错误符号\n"); break;
                 default:   printf ("(%d,%s)\n",syn,lin);
}
} while (syn!=0);
  printf( "\n词法分析结束\n" );
  scanf("%c",&i);


}


  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值