編譯原理系列 實驗二自上而下語法分析

2022-06-24 21:24:10 字數 2053 閱讀 3630

系列第二更!

目錄【問題描述】

最基本的要求,能對乙個算術表示式(a+15)*b做自上而下的語法分析,具體內容見實驗指導實驗二的內容,文法在實驗指導最開始幾頁,重點關注以下幾條文法的ebnf,若不習慣看文法的巴科斯正規化ebnf,可先將文法改寫成常規的產生式形式p75:

《表示式》 ::= [+|-]《項》

《項》 ::= 《因子》

《因子》 ::= 《識別符號》|《無符號整數》| 『(』《表示式》『)』

《加法運算子》 ::= +|-

《乘法運算子》 ::= *|/

考慮到大家用的程式語言不同,且實驗一有少數同學沒有得到正確結果,為不影響實驗二的開展,實驗二的輸入統一採用詞法分析器的輸出結果為輸入。輸入形式如下:

【輸入形式】

(lparen,()

(ident,a)

(plus,+)

(number,15)

(rparen,))

(times,*)

(ident,b)

【輸出形式】

對於語法正確的表示式,報告「語法正確」,輸出為「yes,it is correct.」

對於語法錯誤的表示式,報告「語法錯誤」,輸出為「no,it is wrong.」

【樣例輸入】

(lparen,()

(ident,a)

(plus,+)

(number,15)

(rparen,))

(times,*)

(ident,b)

【樣例輸出】

yes,it is correct.
補充說明:學有餘力的同學,可以在完成本實驗後思考如何將詞法分析的程式和語法分析的程式寫在一起?以語法分析程式為主程式,詞法分析程式為被呼叫程式,直接用(a+15)b做輸入。(注意:這個擴充套件的寫法請不要傳到程式設計題!!!可以寫在實驗報告中。因為實驗二的程式設計題的測試輸入形式我給的不是(a+15)b,而是用(a+15)*b的詞法分析的輸出作為實驗二語法分析的輸入,如上面的樣例輸入形式。)

選擇遞迴下降分析方法:

1.設計出每個非終結符的文法識別過程

2.將輸入資料進行處理,提取出單詞的編碼

3.為每個非終結符寫識別遞迴函式

4.函式相互呼叫

資料讀入和錯誤處理部分我處理的不是很妥當,對於這個題目是ok的,但是不健壯。

#include #include #include#define n 8

using namespace std;

string words[n];//每個元素都是「lparen」/「ident」這樣的標誌符

int sym=0;//words的指標

// 函式宣告

void e();

void t();

void f();

// 填充words陣列

void getwords()

}// 指標前進

void advance()

}// 因子分析

void f()

else if(words[sym] == "number")

else if(words[sym] == "lparen")

else

}return;

}// 項分析

void t()

return;

}// 表示式分析

void e()

t();

//cout << "1t返回,e正在分析" << words[sym] << endl;

編譯原理,自上而下非遞迴語法分析自上而下的語法分析

要求 1.使用的文法如下 見編譯陳第三版 e te e te t ft t ft f e id2.對於任意給定的輸入串 詞法記號流 進行語法分析,遞迴下降方法和非遞迴 分析方法可以任選其一來實現。3.要有一定的錯誤處理功能。即對錯誤能提示,並且能在一定程度上忽略盡量少的記號來進行接下來的分析。可以參...

編譯原理筆記8 自上而下語法分析

1.自上而下分析法的一般問題。1 自上而下語法分析定義 從文法的開始符號開始,反覆使用不同產生式進行推導以謀求與輸入符號串相匹配。注 此處的輸入符號串是指詞法分析結果的一串二元式。2 一般方法 a 基本構成 設下推棧的初始狀態包括兩個符號 s 其中 為棧底,s 為文法開始符號。整個分析過程在語法分析...

語法分析 哈工大編譯原理實驗二

1 鞏固對語法分析的基本功能和原理的認識。2 通過對語法分析表的自動生成加深語法分析表的認識。3 理解並處理語法分析中的異常和錯誤。在詞法分析器的基礎上設計實現類高階語言的語法分析器,基本功能如下 1 能識別以下幾類語句 宣告語句 包括變數宣告 陣列宣告 記錄宣告和過程宣告 表示式及賦值語句 包括陣...