C-minus语言词法分析器实验报告_第1页
C-minus语言词法分析器实验报告_第2页
C-minus语言词法分析器实验报告_第3页
C-minus语言词法分析器实验报告_第4页
C-minus语言词法分析器实验报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上装订线 编译原理实验报告 题目: C_minus语言词法分析器 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 xxxx 指导教师 xxxx 20xx年xx月xx日C_minus语言词法分析器一、实验目的      1.理解词法分析器的设计方法:利用DFA编写相应的程序。 2.掌握手工编写词法分析程序的方法。     3.复习熟悉以前学过的编程语言    &#

2、160; 4.通过实验了解编译器词法分析的工作原理  二、实验原理        1.文法的概念,DFA的表示方法。                2.词法分析程序的输出和输入:词法分析程序的功能是读入源程序,输出单词符号。单词符号是程序设计语言的比本语法符号,程序设计语言的单词符号一般分为如下几种:关键字,标示符,常数,运算符,界符,单词的输出是二元式的形

3、式,需要知道二元式的表示方法,把得到的二元式写入输出文件。   转化图如下:        源程序 词法分析程序 记号文件       3.熟悉单词的描述工具,如正规文法,正规式,以及知道正规文法和正规式的等价性以及他们之间的互相转化。熟悉把正规文法转化为正规式,把正规式转化为NFA以及把NFA转为相应的DFA,最后再把DFA简化,DFA的状态转化为相应的子程序,最后得到词法分析器  &

4、#160;       4.C语言的基本语法。   三、实验要求  1、该个词法分析器要求至少能够识别以下几类单词: 关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写; 标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*

5、; 常数:NUM = digit digit*(.digit digit* |)(e(+ | - |) digit digit* |),letter = a|.|z|A|.|Z|,digit = 0|.|9,包括整数,如123等;小数,如123.45等;科学计数法表示的常数,如1.23e3,2.3e-9等; 专用符号:+ - * / < <= >&#

6、160;>= = != =  , ( )     /* */; 2、分析器的输入为由上述几类单词构成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变为其对应的机内符,常数使用二进制形式,标识符使用相应的标识符表指针表示。 3、词法分析器应当能够指出源程序中的词法错误,如不可识别的符号、错误的词法等。四、实验结果(程序)及分析  #include<stdio.h> #include&l

7、t;stdlib.h>#include<string.h> #define N 100 typedef struct    char name30;   int code;   int addr; token;/存储刚从文件中读取的字符typedef struct    char name30;  int code; K

8、eyword; typedef struct    char name30;  int code;  int addr;symbol; Keyword key6="else",1,"if",2,"int",3,"return",4,"void",5,"where",6; char ch;/接受字符 FILE&

9、#160;*source;/源文件 FILE *keytxt;/关键字输出文件 FILE *badgetxt;/标识符输出文件 FILE *othertxt;/其他单词输出文件 FILE *number; int error_count;/错误的个数 int addr_count;/标识符表的指针 int lineof;/行号 token current;/  暂时存放读入的字符 token za

10、ncun;  symbol currentsymbol; symbol symboltableN;/标识符表void error(int i); void main()        void scan();  error_count=0;  addr_count=0;  error_count=0;  lineof=0; &#

11、160;scan(); void scan()   int i=0; void iskeyword();/判断关键字void isOthers() /判断其他单词 void output_1();/关键字输出文件   void output_2();/标识符输出文件 void output_others();/其他单词输出文件void Iszhushi();    v

12、oid isnumber();  if(source=fopen("Source.txt","r")=NULL)   /打开源文件printf("file open error/n");   exit(0);     if(keytxt=fopen("key.txt","w")=NULL)   /打开关键字文

13、件printf("file open error/n");   exit(0);      if(badgetxt=fopen("badge.txt","w")=NULL)  /打开标识符文件 printf("file open error/n");   exit(0);   if(othertxt

14、=fopen("others.txt","w")=NULL)    printf("file open errorn");   exit(0);     if(number=fopen("number.txt","w")=NULL)    printf("file open errorn"

15、);  exit(0);       ch=fgetc(source);     while(ch!=EOF)        for(i=0;i<30;i+)       i='0' if(ch>='a' && ch<='z'

16、;) |(ch>='A' && ch<='Z') | ch='_' )       iskeyword();     if(ch='')       Iszhushi();      if(ch>='0'&

17、amp;& ch<='9') isnumber();     else        isOthers();      ch=fgetc(source);      fclose(source);      fclose(keytxt);   

18、60;  fclose(badgetxt);   fclose(othertxt);   fclose(number);  void iskeyword()  int i=0,k=0,j=0;  int h=0;  while(ch>='a') && (ch<='z') |(ch>='A') &&&#

19、160;(ch<='Z') | ch='_' | (ch>'0' && ch<'9')              i=ch;       i+;     &#

20、160;      ch=fgetc(source);     zancun=current;  for(i=0;i<6;i+)     for(j=0;j<30;j+)    if(j=j)     h=0; else    

21、; h=1;    break;    if(h=0)    break;    if(h=0)         current.code=keyi.code;        output_1();  else    &

22、#160;        strcpy(symboltableaddr_,);         symboltableaddr_count.code=10;          symboltableaddr_count.addr=addr_count;   

23、;    addr_count+;      output_2();     void isOthers()char ch1;int i;        for(i=0;i<30;i+)       i='0'   

24、0;    switch(ch)            case '+':                   0='+'       

25、0;       current.code=13;               current.addr=-1;               output_others();       &

26、#160;          break;                    case '-':             0='-'

27、;            current.code=14;           current.addr=-1;            output_others();         &#

28、160; break;             case '*':             0='*'            current.code=15;  &

29、#160;         current.addr=-1;           output_others();            break;              

30、 case '/':             0='/'   current.code=16;            current.addr=-1;          &#

31、160;  output_others();            break;                 case'<':          ch1=fgetc(source);  

32、0;         if(ch1='=')            0='<'           1='='       current

33、.code=17;            output_others();                break;        else     fseek(source,-1,1);    &

34、#160;        0='<'             current.code=18;             current.addr=-1;       

35、0;     output_others();             break;                    case'>':       ch1=fgetc(so

36、urce);       if(ch1='=')         0='>'        1='='        current.code=19;       &#

37、160;output_others();        break;       else    fseek(source,-1,1);      0='>'     current.code=20;    output_others();  

38、    break;              case'=': ch1=fgetc(source); if(ch1='=')0='='1='='current.code=21;current.addr=-1;output_others();break;else 0='=&#

39、39; current.code=22; current.addr=-1; output_others(); fseek(source,-1,1);break;case '!': ch1=fgetc(source); if(ch1='=')0='!'1='='current.code=23;current.addr=-1;output_others();break;elsefseek(source,-1,1);&#

40、160; 0='!' current.code=24; current.addr=-1;output_others();break;case '':  0='' current.code=25;  current.addr=-1; output_others();      break;   case 

41、',':  0=',' current.code=26;   current.addr=-1;  output_others();         case '(':        int i=ftell(source);   

42、   char ch1=ch;      char ch2;     while(ch!=')')      ch=fgetc(source);         if(ch=')')     0

43、=ch1;    1=ch;    current.code=27;    current.addr=-1;    output_others();    fseek(source,i,0);    ch2=fgetc(source);    ch2=fgetc(source); &#

44、160;  break;  else    error_count+;    error(1);   fseek(source,i,0);   ch2=fgetc(source);  ch2=fgetc(source);   break;       case '':

45、60;0=''  current.code=28;   current.addr=-1; output_others();   break;  case '': 0=''    current.code=28;    current.addr=-1; output_others();

46、    break;    case '':            0=''        current.code=29;       current.addr=-1;   

47、;     output_others();     break;   case '':             0=''        current.code=29;   

48、;     current.addr=-1;       output_others(); break;    case'10':      lineof+;    break;     void Iszhushi()   char 

49、ch1;  ch1=ch;ch=fgetc(source);  if(ch='*')    for(;) ch=fgetc(source);  if(ch=EOF)    error(2);     break;   if(ch='*')      ch1=ch;     ch=fgetc(source);     if(ch='')       ch=fgetc(source);      break; &

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论