我用的是遞迴下降法,當我得到這個**分析表後,我為每個非終結符設計乙個函式,在內部通過判斷讀入的非終結符判斷該用哪乙個產生式進行替換,而主程式中就是最左推導,通過呼叫最左邊的非終結符的遞迴子程式,讓整個過程鏈式執行下去,最後能得到輸入的算術表示式,則識別成功
#
include
#include
#define
inputmax30#
define
reslutmax
100using
namespace std;
char inputstring[inputmax]
;//儲存輸入的字串,用陣列更方便,直接更改下標就可以往右掃瞄下乙個
string resultstring[reslutmax]
;//儲存每一次的中間推導過程
int ptr =0;
//當前輸入符號的下標
int result_length =0;
//resultstring的長度
/* 遞迴子程式法我覺得也可以稱之為遞迴的**分析法,如何選擇產生式是看**分析表的
也就是為每個非終結符設計乙個函式,讓它自己選擇相應的產生式
從開始符號推導的過程中,遇到相應的非終結符就呼叫其函式
*/voide(
);voidt(
);voide1(
);voidf(
);voidt1(
);void
updateresult
(string non_terminal, string replace_str)
;//用於新增每一次的中間推導式
void
showresult()
;//顯示所有中間推導式
void
deal_production
(char production)
;//接受產生式,該函式把它分解成左邊和右邊,並呼叫updateresult(),防止**冗餘
void
trim
(char s)
;int
main()
voide(
)}voidt(
)}voide1(
)else
if(inputstring[ptr]
==')'
|| inputstring[ptr]
=='#'
)deal_production
("e' --> ε");
}voidt1(
)else
if(inputstring[ptr]
==')'
|| inputstring[ptr]
=='#'
|| inputstring[ptr]
=='+'
)deal_production
("t' --> ε");
}voidf(
)else
if(inputstring[ptr]
=='(')}
void
updateresult
(string non_terminal, string replace_str)
else
}void
showresult()
}void
deal_production
(char production)
void
trim
(char s)
for(
int i =
0; i < inputmax; i++
) s[i]
='\0'
;//清空
//但是這種複製有缺陷,比如當str長度不如s時,實際上s後面的字元保留著,是直接加了個\0隔離開
//例如 把複製給就會變成; 而strlen是\0前面的長度
strcpy
(s, str.
c_str()
);//把string複製給陣列是這麼寫的
if(s[
strlen
(s)-1]
!='#'
) s[
strlen
(s)]
='#'
;}
執行結果:
表示式語法分析
表示式語法分析 遞迴子程式法 time limit 1000 ms memory limit 65536 kib problem description 遞迴子程式法是一種確定的自頂向下語法分析方法,要求文法是ll 1 文法。它的實現思想是對應文法中每個非終結符編寫乙個遞迴過程,每個過程的功能是識別...
語法分析 算術表示式遞迴下降分析程式設計
1 實驗目的 1 掌握自上而下語法分析的要求與特點。2 掌握遞迴下降語法分析的基本原理和方法。3 掌握相應資料結構的設計方法。2 實驗內容 程式設計實現給定算術表示式的遞迴下降分析器。算術表示式文法如下 e e t t t t f f f e i 3 設計說明 首先改寫文法為ll 1 文法 然後為每...
語法分析 算術表示式遞迴下降分析程式設計
1 實驗目的 1 掌握自上而下語法分析的要求與特點。2 掌握遞迴下降語法分析的基本原理和方法。3 掌握相應資料結構的設計方法。2 實驗內容 程式設計實現給定算術表示式的遞迴下降分析器。算術表示式文法如下 e e t t t t f f f e i 3 設計說明 首先改寫文法為ll 1 文法 然後為每...