編譯原理四則表達式試驗_第1頁
編譯原理四則表達式試驗_第2頁
編譯原理四則表達式試驗_第3頁
編譯原理四則表達式試驗_第4頁
編譯原理四則表達式試驗_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本文格式為Word版,下載可任意編輯——編譯原理四則表達式試驗1、前序

這是編譯原理的試驗,自認為是上大學以來做過的最難的一個試驗。所以寫篇博客記錄一下。

試驗用到的基礎知識:C語言、數(shù)據(jù)結(jié)構(gòu)、匯編(只需簡單的了解)。開發(fā)工具:VC

2、問題描述

編譯整數(shù)四則運算表達式,將整數(shù)四則運算表達式翻譯為匯編語言代碼。消除左遞歸后的文法:E→TE'E'→+TE'|εT→FT'T'→*FT'|ε

F→(E)|i

消除左遞歸后的翻譯模式:E::=T{E'.i:=T.nptr}E'{E.nptr:=E'.s}

E'::=+T{E'1.i:=mknode(‘+’,E'.i,T.nptr)}E'1{E'.s:=E1.s}

E'::=-T{E'1.i:=mknode(‘-’,E'.i,T.nptr)}E'1{E'.s:=E1.s}

E'::=ε{E'.s:=E'.i}T::=F{T'.i:=F.nptr}T'{T.nptr:=T'.s}

T'::=*F{T'1.i:=mknode(‘*’,T'.i,F.nptr)}T'1{T'.s:=T1.s}

T'::=/F{T'1.i:=mknode(‘/’,T'.i,F.nptr)}T'1{T'.s:=T1.s}T'::=ε{T'.s:=T'.i}F::=(E){F.nptr:=E.nptr}

F::=num{F.nptr:=mkleaf(num,num.val)}

3、全局定義

test.c文件

#ifndefTEST_C#defineTEST_C/**

*全局變量和全局函數(shù)文件**/

#include#include#include#include

/*************************以下是全局變量(函數(shù))的定義*******************/

//輸入的表達式最大長度,可以看做是緩沖區(qū)的長度#defineMAX_EXPRESSION_LENGTH50

//存放輸入的表達式

charexpression[MAX_EXPRESSION_LENGTH];

//表達式字符數(shù)組的下標intexpression_index=0;

//存放一個單詞符號

charstrToken[MAX_EXPRESSION_LENGTH/2];

//判斷是否是數(shù)字

intisNum(char*strToken){

inti=0;

while(strToken[i]){}

returnstrToken[i]==0;

2

if(!isdigit(strToken[i]))i++;

break;

}

//錯誤處理程序

voiderror(char*errerMessage){

printf(\exit(0);

}

/*************************以上是全局變量(函數(shù))的定義******************/#endif

4、詞法分析

詞法分析的要求是:接受一個表達式,輸出該表達式中的各類單詞符號

一般有兩種方法來進行詞法分析,一種是用狀態(tài)圖來實現(xiàn),一種是用狀態(tài)轉(zhuǎn)換表。下面采用狀態(tài)圖實現(xiàn)

首先定義單詞符號的種類和所屬類型

typedefenumSymbol{ERR=-1,END,NUM,PLUS,MINUS,TIMES,SLASH,LPAREN,RPAREN}Symbol;

然后轉(zhuǎn)態(tài)轉(zhuǎn)換圖如下所示:

3

test1.c文件用代碼表示如下:

#ifndefTEST1_C#defineTEST1_C/**

*采用狀態(tài)圖進行詞法分析以及測試詞法分析***/

#include\

//枚舉類型

typedefenumSymbol{ERR=-1,END,NUM,PLUS,MINUS,TIMES,SLASH,LPAREN,RPAREN}Symbol;

//獲取一個單詞符號,該單詞符號存放在strToken中。返回該單詞符號的枚舉類型

SymbolgetToken();

//根據(jù)傳入的枚舉類型輸出對應的單詞符號voidprintToken(Symboli);

//測試詞法分析

voidtestLexAnalyse();

//獲取一個單詞符號,該單詞符號存放在strToken中。返回該單詞符號的枚舉類型

SymbolgetToken(){

charch;

intstate=0;//每次都是從狀態(tài)0開始intj=0;

//表達式遍歷完成,單詞符號為'#'

if(expression[expression_index]=='\\0'){

strToken[0]='#';strToken[1]='\\0';

returnEND;

4

}

while(1){

switch(state){

case0:

//讀取一個字符

ch=strToken[j++]=expression[expression_index++];

if(isspace(ch)){j--;//注意退格}

elseif(isdigit(ch))state=1;elseif(ch=='+')elsebreak;

returnERR;state=2;state=3;state=4;state=5;state=6;state=7;

elseif(ch=='-')

elseif(ch=='*')elseif(ch=='/')elseif(ch=='(')elseif(ch==')')

state=0;

case1:

ch=strToken[j++]=exp

溫馨提示

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

最新文檔

評論

0/150

提交評論