加载中…
个人资料
IT视野
IT视野
  • 博客等级:
  • 博客积分:0
  • 博客访问:281,862
  • 关注人气:91
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

词法分析器实验报告1

(2011-05-02 11:13:20)
标签:

词法分析器

it

分类: c和c 知识和代码

 

 

 

词法分析器实验报告

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一.目的与要求:通过编写并上机调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将其分解后各类单词的词法分析方法。

二.实验内容:

对于如下文法所定义的PASCAL语言子集,试编写并上机调试一个词法分析程序:

<程序>PROGRAM <标识符>;<分程序>.

<分程序><变量说明>BEGIN<语句表>END

<变量说明>VAR<变量表><类型><>

<变量表><变量表><变量<变量>

<类型>INTEGER

<语句表><语句表><语句<语句>

<语句><赋值语句<条件语句<WHILE语句<复合语句<过程定义>

<赋值语句><变量>=<算术表达式>

<条件语句>IF<关系表达式>THEN<语句>ELSE<语句>

<WHILE语句>WHILE<关系表达式>DO<语句>

<复合语句>BEGIN<语句表>END

<过程定义>PROCEDURE<标识符><参数表>

BEGIN<语句表>END

<参数表>→(<标识符表><>

<标识符表><标识符表><标识符<标识符>

<算术表达式><算术表达式>+<<>

<><>*<初等量<初等量>

<初等量>→(<算术表达式><变量<无符号数>

<关系表达式><算术表达式><关系符><算术表达式>

<变量><标识符>

<标识符><标识符><字母<标识符><数学<字母>

<无符号数><无符号数><数字<数字>

<关系符><= >= <>

<字母>··· Z

<数字>··· 9

<所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段则是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该整数的二进制形式。)。对于保留字和分隔号,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。

 

 

 

 

 

为便于查看由词法(一)单词的分类:构造上述语言中的各类单词符号及其分类码表如下:

单词符号

类别码

单词符号

类别码

main

1

=

10

int

2

<> 

11

if

3

12

then

4

>=

13

return

5

,

14

标识符

6

;

15

整数

7

 

 

8

 

 

<=

9

 

 

(二)状态转移矩阵

 

l

d

ld

d

=

=

=>

其他

0

1

3

 

 

5

9

10

 

 

13

1

1

1

2

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

3

 

3

 

4

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

6

7

 

8

 

6

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

 

 

8

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

 

 

 

 

 

 

10

 

 

 

 

 

11

 

12

 

 

11

 

 

 

 

 

 

 

 

 

 

12

 

 

 

 

 

 

 

 

 

 

13

 

 

 

 

 

 

 

 

 

 

()词法分析过程

 

 

 

四、词法分析程序的功能

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

输出:二元数组。

如:main() int x,y; x=9; x>=y; return; }#

输出结果为:

(1, main)

error!

error!

(17, {)

(2, int)

(6,x)

(14,,)

(6,y)

(15,;)

(6,x)

(13,>=)

(6,return)

(15,;)

(18,})

 

 

 

 

 

五.源程序

#include<string.h>

#include<stdio.h>

#include<stdlib.h>

#include<ctype.h>

char *table[7]={" ","main","int","if","then","else","return"},TOKEN[20],ch;  //定义关键字

int lookup(char *TOKEN){       //关键字匹配函数

      int m,i;

      for(i=1;i<6;i++){

           if((m=strcmp(TOKEN,table[i]))==0)

               return(i);

      }

      return(0);

}

void out(int c,char *TOKEN){      //输出函数

      printf("(%d,%s)\n",c,TOKEN);

}

void scanner(FILE *fp){            //扫描函数

      char TOKEN[20]={'\0'};

      char ch;

      int i,c;

      ch=fgetc(fp);               //获取字符,指针fp并自动指向下一个字符

      if(isalpha(ch)){               //判断该字符是否是字母

           TOKEN[0]=ch;

           ch=fgetc(fp);

          i=1;

           while(isalnum(ch)){        //判断该字符是否是字母或数字

                 TOKEN[i]=ch;

                 i++;

                 ch=fgetc(fp);

           }

           TOKEN[i]='\0';

           fseek(fp,-1,1);            //回退一个字符

           c=lookup(TOKEN);

           if(c==0)

                 out(6,TOKEN);        //输出标识符

           else out(c,TOKEN);         //输出关键字

      }

      else

           if(isdigit(ch)){           //判断是否是数字

                 TOKEN[0]=ch;

                 ch=fgetc(fp);

                 i=1;

                 while(isdigit(ch)){

                      TOKEN[i]=ch;

                      i++;

                      ch=fgetc(fp);

                 }

                 TOKEN[i]='\0';

                 fseek(fp,-1,1);

                 out(7,TOKEN);

           }

           else

            {

               TOKEN[0]=ch;

               switch(ch){

                     case'{':out(17,TOKEN);

                            break;

                      case'}':out(18,TOKEN);

                            break;

                     case',':out(14,TOKEN);

                            break;

                      case';':out(15,TOKEN);

                            break;

                     case'<':ch=fgetc(fp);

                            TOKEN[1]=ch;

                          if(ch=='='){

                            out(9,TOKEN);

                      }

                          else if(ch=='>'){

                            out(11,TOKEN);

                      }

                          else {

                            fseek(fp,-1,1);

                            out(8,TOKEN);

                      }

                          break;

                     case'=':out(10,TOKEN);

                          break;

                    case'>':ch=fgetc(fp);

                            TOKEN[1]=ch;

                          if(ch=='=') out(13,TOKEN);

                          else {

                                fseek(fp,-1,1);

                                out(12,TOKEN);

                            }

                          break;

                     default:printf("error!\n");

                          break;

                 }

           }

}

main()

{

      FILE *fp;

      if((fp=fopen("E:\\222.txt","r"))==NULL){   //读取文件内容,并返回文件指针,该指针指向文件的第一个字符

           fprintf(stderr,"error opening.\n");

           exit(1);

      }

      do{

          ch=fgetc(fp);

           if(ch=='#')                //文件以#结尾,作为扫描结束条件            

                 break;

           if(ch==' ')                //如果是空格,自动跳到下个字符

                 scanner(fp);

           else{

                 fseek(fp,-1,1);        //如果不是空格,则回退一个字符并扫描

               scanner(fp);

           }

      }while(ch!='#');

      return(0);

}

六.函数说明

1. int lookup(char *TOKEN)  关键字匹配函数,查询所述程序中的关键字

2. void out(int c,char *TOKEN)  输出函数

3. void scanner(FILE *fp)  扫描函数,扫描程序中的字符串并调用lookup函数检查是否是关键字,再调用out函数输出二元组

4.fseekfp-11) 回退一个字符

5.isalphach) 字母判断函数,若ch指的是字母,返回非0,否则返回0

6.isalnumh) 字母或数字判断函数,若ch指的是字母或数字,返回非0,否则返回0

7.isdigitch) 数字判断函数,若ch指的是数字,返回非0,否则返回0

8.fgetcfp) 从数据流中区下一个字符

9.fopen  文件打开函数,返回指向文件第一个字符的指针

七.实验结果及截图

 file:///C:/DOCUME~1/gph/LOCALS~1/Temp/ksohtml/wps_clip_image-12308.png


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有