遞迴下降語法分析實驗

2021-07-24 04:56:38 字數 4521 閱讀 3964

通過設計、開發乙個高階語言的遞迴下降語法分析程式,實現

對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,加

深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。

(1)理解語法分析在編譯程式中的作用,以及它與詞法分析程式的

關係;

(2)掌握遞迴下降語法分析方法的主要原理;

(3)理解遞迴下降分析法對文法的要求;

(4)熟練掌握select集合的求解方法;

(5)熟練掌握文法變換方法(消除左遞迴和提取公因子)。

遞迴下降分析法是語法分析中最易懂的一種方法,基本原理

是:對每個非終結符號(分別代表乙個語法單位)按其產生式結

構構造相應語法分析子程式,以完成該非終結符號所對應的語法

單位的分析和識別任務。其中終結符號產生匹配命令,而非終結

符號則產生過程呼叫命令。因為文法可以遞迴,相應子程式也是

遞迴的,所以稱這種方法為遞迴子程式下降法或遞迴下降法。其

中子程式的結構與產生式結構幾乎是一致的。

《編譯原理》實驗指導書

假設乙個文法中的非終結符號a 的全部產生式為

a��α1|α2|……|αn ,則必須滿足以下條件才能保證可以唯一的選

擇合適的產生式,才能採用遞迴下降分析法:

select(a��αi)∩select(a��αj)=φ,其中i≠j

假設文法中有如下的產生式a��β1|β2|…|βn,則應按如下方法

編寫語法分析子程式。

(1)根據s語言bnf形式的語法規則(見附件a),寫出s語言的上下

文無關文法;

(2)求每個產生式的select集:

procedure a( )

begin if token∈select(a��β1) then θ(β1) else

if token∈select(a��β2) then θ(β2) else

…… if token∈select(a��βn) then θ(βn) else

error()

end

其中 βi =x1x2…xn,θ(βi) =θ』(x1); θ』(x2);…; θ』(xn);如果

xi∈vn,θ』(xi)= xi;如果xi∈vt,θ』(xi)= match(xi);如果xi= ε,

θ』(xi) = skip(空語句)。

《編譯原理》實驗指導書

10 select(a��β)= first(β),當 ε∉first(β)

= (first(β)-)∪follow(a),當ε∈first(β)

(3)判斷是否滿足遞迴下降法分析條件,若不滿足用消除左遞迴和

提取公因子等文法等價變換操作對文法進行變換,使其滿足遞

歸下降法的要求;

(4)構造遞迴下降語法分析程式,對文法中的每個非終結符號按其

產生式結構產生相應的語法分析子程式,完成相應的識別任

務。其中終結符號產生匹配命令,非終結符號則產生呼叫命令。

實際的語法分析工作從呼叫主程式(開始符號s對應的程式)

開始,根據產生式遞迴呼叫各個分析子程式;

(5)撰寫實驗報告。

#include

#include

#include

using

namespace

std;

void print();

void scanner();

bool statement();

bool condition();

bool while_statement();

bool expression();

bool item_expression();

bool factor();

bool conditional_statements();

bool assignment_statement();

bool compound_statements();

int syn;//存放單詞的型別

int p;

char ch;

int sum;//用來儲存數字的值

char program[200],token[10];

char *rwtab[9]=;

int m;

bool isdigital(char ch)

bool isalpha(char ch)

void scanner()

m=0;

ch=program[p++];

while(ch==' '||ch=='\n'||ch=='\t')

if(isalpha(ch))while(isalpha(ch)||isdigital(ch));

p--;

syn=10;

token[m++]='\0';

for(int n=0;n<=8;n++)

}return;

}else

if(isdigital(ch))

p--;

syn=11;

if(isalpha(ch))

syn=-1;

return;

}else

else

if(ch=='=')

else

break;

case

'>':ch=program[p++];

if(ch=='=')

else

break;

case

'=':ch=program[p++];

if(ch=='=')

else

break;

case

'+':syn=12;break;

case

'-':syn=13;break;

case

'*':syn=14;break;

case

'/':syn=15;break;

case

';':syn=23;break;

case

'(':syn=24;break;

case

')':syn=25;break;

case

',':syn=26;break;

case

'#':syn=0;break;

default:syn=-1;break;

}return;

}}bool constan_defined()

return

false;

}return

false;

}return

false;

}bool constan_description()

else

if(syn==26)

cout

<<"常量說明錯誤"

return

false;

}bool variable_defined()

else

return

false;

}bool variable_description()

scanner();

if(syn==8)

else

if(syn==26)}}

} bool condition()

expression();

}bool expression()

}while(syn==12||syn==13);

return

true;

}bool item_expression()

} return

false;

}bool factor()

else

if(syn==11)

else

if(syn==24)

else

}else

return

false;

}bool assignment_statement()

else}}

if(syn==9)

else

if(syn==0)

else

}else

}else

}bool while_statement()

// else

// return false;

else

return

false;

}bool statement()

else

if(syn==5)

else

if(syn==1)

else

if(syn==2)

else

}int main()

while(ch!='#');

p=0;

cout

<<"程式開始"

cout

<<"程式結束"

<}

實驗二 遞迴下降語法分析

一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...

實驗二 遞迴下降語法分析

一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...

實驗二 遞迴下降語法分析

一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...