C_minus語言詞法分析器實驗報告_第1頁
C_minus語言詞法分析器實驗報告_第2頁
C_minus語言詞法分析器實驗報告_第3頁
C_minus語言詞法分析器實驗報告_第4頁
C_minus語言詞法分析器實驗報告_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、裝訂線 編譯原理實驗報告 題目: C_minus語言詞法分析器 學(xué) 院 計算機科學(xué)與技術(shù) 專 業(yè) xxxxxxxxxxxxxxxx 學(xué) 號 xxxxxxxxxxxx 姓 名 xxxx 指導(dǎo)教師 xxxx 20xx年xx月xx日C_minus語言詞法分析器一、實驗?zāi)康?#160;     1.理解詞法分析器的設(shè)計方法:利用DFA編寫相應(yīng)的程序。 2.掌握手工編寫詞法分析程序的方法。     3.復(fù)習(xí)熟悉以前學(xué)過的編程語言      4.通過實驗了解

2、編譯器詞法分析的工作原理  二、實驗原理        1.文法的概念,DFA的表示方法。                2.詞法分析程序的輸出和輸入:詞法分析程序的功能是讀入源程序,輸出單詞符號。單詞符號是程序設(shè)計語言的比本語法符號,程序設(shè)計語言的單詞符號一般分為如下幾種:關(guān)鍵字,標示符,常數(shù),運算符,界符,單詞的輸出是二元式的形式,需要知道二元式的表示方

3、法,把得到的二元式寫入輸出文件。   轉(zhuǎn)化圖如下:        源程序 詞法分析程序 記號文件       3.熟悉單詞的描述工具,如正規(guī)文法,正規(guī)式,以及知道正規(guī)文法和正規(guī)式的等價性以及他們之間的互相轉(zhuǎn)化。熟悉把正規(guī)文法轉(zhuǎn)化為正規(guī)式,把正規(guī)式轉(zhuǎn)化為NFA以及把NFA轉(zhuǎn)為相應(yīng)的DFA,最后再把DFA簡化,DFA的狀態(tài)轉(zhuǎn)化為相應(yīng)的子程序,最后得到詞法分析器    &#

4、160;     4.C語言的基本語法。   三、實驗要求  1、該個詞法分析器要求至少能夠識別以下幾類單詞: 關(guān)鍵字:else if int return void while共6個,所有的關(guān)鍵字都是保留字,并且必須是小寫; 標識符:識別與C語言詞法規(guī)定相一致的標識符,通過下列正則表達式定義:ID = letter (letter | digit)*; 常數(shù):NUM

5、 = digit digit*(.digit digit* |)(e(+ | - |) digit digit* |),letter = a|.|z|A|.|Z|,digit = 0|.|9,包括整數(shù),如123等;小數(shù),如123.45等;科學(xué)計數(shù)法表示的常數(shù),如1.23e3,2.3e-9等; 專用符號:+ - * / < <= > >=

6、0;= != =  , ( )     /* */; 2、分析器的輸入為由上述幾類單詞構(gòu)成的程序,輸出為該段程序的機內(nèi)表示形式,即關(guān)鍵字、運算符、界限符變?yōu)槠鋵?yīng)的機內(nèi)符,常數(shù)使用二進制形式,標識符使用相應(yīng)的標識符表指針表示。 3、詞法分析器應(yīng)當能夠指出源程序中的詞法錯誤,如不可識別的符號、錯誤的詞法等。四、實驗結(jié)果(程序)及分析  #include<stdio.h> #include<stdlib.h>

7、;#include<string.h> #define N 100 typedef struct    char name30;   int code;   int addr; token;/存儲剛從文件中讀取的字符typedef struct    char name30;  int code; Keyword; 

8、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 *source;

9、/源文件 FILE *keytxt;/關(guān)鍵字輸出文件 FILE *badgetxt;/標識符輸出文件 FILE *othertxt;/其他單詞輸出文件 FILE *number; int error_count;/錯誤的個數(shù) int addr_count;/標識符表的指針 int lineof;/行號 token current;/  暫時存放讀入的字符 token zancun; &#

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

11、160;void scan()   int i=0; void iskeyword();/判斷關(guān)鍵字void isOthers() /判斷其他單詞 void output_1();/關(guān)鍵字輸出文件   void output_2();/標識符輸出文件 void output_others();/其他單詞輸出文件void Iszhushi();    void isnu

12、mber();  if(source=fopen("Source.txt","r")=NULL)   /打開源文件printf("file open error/n");   exit(0);     if(keytxt=fopen("key.txt","w")=NULL)   /打開關(guān)鍵字文件printf("

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

14、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') |(ch&

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

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

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

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

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

21、160;   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、;  switch(ch)            case '+':                   0='+'          

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

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

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

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

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

30、60;'/':             0='/'   current.code=16;            current.addr=-1;             ou

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

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

33、0;           output_others();                break;        else     fseek(source,-1,1);      &#

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

35、;   output_others();             break;                    case'>':       ch1=fgetc(source); &

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

37、hers();        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='=' curr

39、ent.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);  cur

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

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

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

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

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

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

46、#160; 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 ch1; 

49、60;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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論