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),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上裝訂線 編譯原理實驗報告 題目: C_minus語言詞法分析器 學(xué) 院 計算機(jī)科學(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é)過的編程語言    &#

2、160; 4.通過實驗了解編譯器詞法分析的工作原理  二、實驗原理        1.文法的概念,DFA的表示方法。                2.詞法分析程序的輸出和輸入:詞法分析程序的功能是讀入源程序,輸出單詞符號。單詞符號是程序設(shè)計語言的比本語法符號,程序設(shè)計語言的單詞符號一般分為如下幾種:關(guān)鍵字,標(biāo)示符,常數(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)鍵字都是保留字,并且必須是小寫; 標(biāo)識符:識別與C語言詞法規(guī)定相一致的標(biāo)識符,通過下列正則表達(dá)式定義:ID = letter (letter | digit)*

5、; 常數(shù):NUM = 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、160;>= = != =  , ( )     /* */; 2、分析器的輸入為由上述幾類單詞構(gòu)成的程序,輸出為該段程序的機(jī)內(nèi)表示形式,即關(guān)鍵字、運算符、界限符變?yōu)槠鋵?yīng)的機(jī)內(nèi)符,常數(shù)使用二進(jìn)制形式,標(biāo)識符使用相應(yīng)的標(biāo)識符表指針表示。 3、詞法分析器應(yīng)當(dāng)能夠指出源程序中的詞法錯誤,如不可識別的符號、錯誤的詞法等。四、實驗結(jié)果(程序)及分析  #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;/關(guān)鍵字輸出文件 FILE *badgetxt;/標(biāo)識符輸出文件 FILE *othertxt;/其他單詞輸出文件 FILE *number; int error_count;/錯誤的個數(shù) int addr_count;/標(biāo)識符表的指針 int lineof;/行號 token current;/  暫時存放讀入的字符 token za

10、ncun;  symbol currentsymbol; symbol symboltableN;/標(biāo)識符表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();/判斷關(guān)鍵字void isOthers() /判斷其他單詞 void output_1();/關(guān)鍵字輸出文件   void output_2();/標(biāo)識符輸出文件 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)   /打開關(guān)鍵字文

13、件printf("file open error/n");   exit(0);      if(badgetxt=fopen("badge.txt","w")=NULL)  /打開標(biāo)識符文件 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論