表示式語法分析——遞迴子程式法
time limit: 1000 ms memory limit: 65536 kib
problem description
遞迴子程式法是一種確定的自頂向下語法分析方法,要求文法是ll(1)文法。它的實現思想是對應文法中每個非終結符編寫乙個遞迴過程,每個過程的功能是識別由該非終結符推出的串,當某非終結符的產生式有多個候選式時能夠按ll(1)形式唯一地確定選擇某個候選式進行推導。請根據下面的表示式ll(1)文法,構造遞迴子程式,完成對表示式的語法分析。
表示式文法如下:
e→tg
g→+tg | ε
t→fs
s→*fs | ε
f→(e) | i
對於給定的輸入串(長度不超過50個符號),請輸出分析過程中用到的所有產生式,並指明該輸入串是否為該文法能生成的表示式,輸出共11行,前10行每行兩個資料用空格隔開,表示推導時所用產生式順序號(從0開始),最後一行是accept,表示i+i*i是文法能生成的合法表示式。注:其中&符號代表文法中的ε符號。
例如:i+i*i是文法能生成的乙個表示式,輸出格式如下:
0 e–>tg
1 t–>fs
2 f–>i
3 s–>&
4 g–>+tg
5 t–>fs
6 f–>i
7 s–>*fs
8 f–>i
9 s–>&
10 g–>&
accept
i@i不是文法能生成的表示式,輸出共5行,前5行每行兩個資料用空格隔開,表示推導時所用產生式序號(從0開始),最後一行是error,表示i@i不是文法能生成的表示式。@不是合法的文法符號,輸出格式舉例:
0 e–>tg
1 t–>fs
2 f–>i
3 s–>&
4 g–>&
error
(i+i*i不是文法能生成的表示式,存在括號不匹配的語法錯誤,輸出格式舉例:
0 e–>tg
1 t–>fs
2 f–>(e)
3 e–>tg
4 t–>fs
5 f–>i
6 s–>&
7 g–>+tg
8 t–>fs
9 f–>i
10 s–>*fs
11 f–>i
12 s–>&
13 g–>&
error
input
輸入資料只有一行,代表待分析的符號串,以#號結束
output
輸出推導過程中所有的產生式,按照使用順序給出。輸出詳細說明見題目描述中的例子。
sample input
i+i*i#
sample output
0 e–>tg
1 t–>fs
2 f–>i
3 s–>&
4 g–>+tg
5 t–>fs
6 f–>i
7 s–>*fs
8 f–>i
9 s–>&
10 g–>&
accept
hint
/*********************
此程式用於輸出分析每個語句表示式時用到的所有產生式。
*********************/
#include
using
namespace std;
char str[
100]
;int num =0;
int cur =0;
voide(
);voidg(
);voidt(
);voids(
);voidf(
);voidg(
)else
printf
("%d g-->&\n"
,num++);
}voids(
)else
printf
("%d s-->&\n"
,num++);
}voidf(
)else
if(str[cur]
=='('
)else
}else
}voide(
)else
}voidt(
)else
}int
main()
語法分析 算術表示式 C 實現
我用的是遞迴下降法,當我得到這個 分析表後,我為每個非終結符設計乙個函式,在內部通過判斷讀入的非終結符判斷該用哪乙個產生式進行替換,而主程式中就是最左推導,通過呼叫最左邊的非終結符的遞迴子程式,讓整個過程鏈式執行下去,最後能得到輸入的算術表示式,則識別成功 include include defin...
語法分析 算術表示式遞迴下降分析程式設計
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 文法 然後為每...