語法分析 算術表示式 C 實現

2021-10-24 11:51:51 字數 2868 閱讀 2320

我用的是遞迴下降法,當我得到這個**分析表後,我為每個非終結符設計乙個函式,在內部通過判斷讀入的非終結符判斷該用哪乙個產生式進行替換,而主程式中就是最左推導,通過呼叫最左邊的非終結符的遞迴子程式,讓整個過程鏈式執行下去,最後能得到輸入的算術表示式,則識別成功

#

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 文法 然後為每...