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

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、.編譯原理實驗報告word 資料.實驗一一、實驗名稱: 詞法分析器的設計二、實驗目的: 1,詞法分析器能夠識別簡單語言的單詞符號2 ,識別出并輸出簡單語言的基本字 . 標示符 . 無符號整數 . 運算符 . 和界符。三 、實驗要求: 給出一個簡單語言單詞符號的種別編碼詞法分析器四、實驗原理:1、詞法分析程序的算法思想算法的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據掃描到單詞符號的第一個字符的種類,拼出相應的單詞符號。2、程序流程圖( 1)主程序輸入要分析的語句判斷讀入字符是否為“#”調用掃描、分析程序輸出單詞符號二元組結束word 資料.( 2)掃描子程序T

2、oken 清空Get()當前字符 =?標示符常數表中查找結束Error ()基本字用戶標示符輸出二元式結束3、各種單詞符號對應的種別碼單詞符號種別碼助記符碼值while1while-if2if-else3else-switch4switch-case5case-標識符6idid 在符號表中的位置常數7numnum在常數表中的位置+8+-9-word 資料.*10*-<=11relopLE<11relopLT=11relopEQ=12=-;13;-五、實驗容:1、實驗分析編寫程序時,先定義幾個全局變量a 、token(均為字符串數組),c,s(char 型) ,i,j,k(int型)

3、, a 用來存放輸入的字符串,token另一個則用來幫助識別單詞符號,s 用來表示正在分析的字符。字符串輸入之后,逐個分析輸入字符,判斷其是否#,若是表示字符串輸入分析完畢,結束分析程序,若否則通過int digit(char c)、 int letter(char c)判斷其是數字,字符還是算術符, 分別為用以判斷數字或字符的情況,算術符的判斷可以在switch語句中進行,還要通過函數int lookup(char token)來判斷標識符和保留字。2實驗詞法分析器源程序:#include <stdio.h>#include <math.h>#include <

4、string.h>int i,j,k;char c,s,a20,token20='0'int letter(char s)if(s>=97)&&(s<=122) return(1);else return(0);int digit(char s)if(s>=48)&&(s<=57) return(1);else return(0);void get()s=ai;i=i+1;void retract()i=i-1;int lookup(char token20)if(strcmp(token,"while&q

5、uot;)=0) return(1);else if(strcmp(token,"if")=0) return(2);else if(strcmp(token,"else")=0) return(3);else if(strcmp(token,"switch")=0) return(4);else if(strcmp(token,"case")=0) return(5);word 資料.else return(0);void main()printf("please input string :n&quo

6、t;);i=0;doi=i+1;scanf("%c",&ai);while(ai!='#');i=1;j=0;get();while(s!='#') memset(token,0,20);switch(s)case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':case 'g':case 'h':case 'i':case 'j

7、9;:case 'k':case 'l':case 'm':case 'n':case 'o':case 'p':case 'q':case 'r':case 's':case 't':case 'u':case 'v':case 'w':case 'x':case 'y':case 'z':while(letter(s)|digit(s)t

8、okenj=s;word 資料.j=j+1;get();retract();k=lookup(token);if(k=0)printf("(%d,%s)",6,token);else printf("(%d,-)",k);break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '

9、9':while(digit(s)tokenj=s;j=j+1;get();retract();printf("%d,%s",7,token);break;case '+':printf("('+',NULL)");break;case '-':printf("('-',null)");break;case '*':printf("('*',null)");break;case '<':ge

10、t();if(s='=') printf("(relop,LE)");elseretract();printf("(relop,LT)");break;case '=':get();if(s='=')printf("(relop,EQ)");elseretract();printf("('=',null)");break;word 資料.case '':printf("(;,null)");break;case &#

11、39; ':break;default:printf("!n");j=0;get();六:實驗結果:實驗二一、實驗名稱:語法分析器的設計二、實驗目的:用 C 語言編寫對一個算術表達式實現語法分析的語法分析程序, 并以四元式的形式輸出,以加深對語法語義分析原理的理解,掌握語法分析程序的實現方法和技術。三、 實驗原理:word 資料.1、算術表達式語法分析程序的算法思想首先通過關系圖法構造出終結符間的左右優先函數f(a),g(a)。在分析的過程中,通過左右優先函數比較當前讀入終結符與前一個讀入終結符間的優先關系,分析后適時的以四元式形式輸出相關的符號。2、通過優先函數關

12、系圖構造優先函數優先函數表+*i()f46626g35772優先函數關系圖f+f*fif(f)g+g*gig(g)四、實驗容:1、 實驗分析本實驗所用文法是:GE:E->E+E|E-E|E*E|E/E|(E)E->0|1|2|3|9根據此文法編寫程序時,算術表達式的求解過程需要用到算術符號的優先判斷,定義兩個字符串數組 optr、opnd 用來模擬棧,存放算術符和操作數, 用 a 來存放表達式字符串,在分析時還要通過函數 int f(char c)和 int g(char c),判斷運算符之間的優先關系,根據不同情況作各種不同操作。流程圖如下:word 資料.輸入算數表達式,以#結

13、束初始化 loptr1= #用 get()取一個待分析字符 sOptr1 和 s 是否同時為 #判斷 S 是否為運算量存入 opndget()其他情況 error()Floptrj<g(s)Floptrj=g(s)Floptrj>g(s)當前字符棧optr棧頂元素出棧結束2,實驗程序源代碼:#include<stdio.h>char a21,optr10,op,s;int opnd10,i,j,k,x1,x2,x3;int operand(char s)if(s>=48)&&(s<=57) return 1;else return 0;int

14、 f(char s)switch(s)case '+':return 4;break;case '*':return 6;break;case 'i':return 6;break;case '(':return 2;break;case ')':return 6;break;default:return 0;word 資料.int g(char s)switch(s)case '+':return 3;break;case '*':return 5;break;case '

15、i':return 7;break;case '(':return 7;break;case ')':return 2;break;default:return 0;void get()s=ai;i+;void main()printf("請輸入表達式(以#結束): n");i=0;doi+;scanf("%c",&ai);while(ai!='#');i=j=k=1;optrj='#'get();while(!(optrj='#')&&(s='#')if(operand(s) opndk=s-48;k+;get();else if (f(optrj)<g(s) j+;optrj=s;get();else if (f(optrj)>g(s)op=optrj;j-;x1=opndk-1;x2=opndk-2;k=k-2;switch(op)case '+':x3=x1+x2;break;case '*':x3=x1*x2;break;default:break;opndk=x3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論