例子文法
實現步驟
定義每個非終結符的遞迴下降分析程式
從開始符號遞迴下降分析
如遞迴下降能到輸入串的最後乙個符號,則輸入串合法;反之輸入串不合法
**實現
定義全域性變數i用來表示當前輸入串指標所在位置
i=
0
e的遞迴下降分析程式:根據文法有e=t∩g
defe(
):# e->tg
if t(
)and g():
return
true
else
:return
false
t的遞迴下降分析程式:根據文法有t=f∩s
deft(
):# t->fs
if f(
)and s():
return
true
else
:return
false
g的遞迴下降分析程式:根據文法有兩種情況,當前輸入串指標所指的字元是『+』或『-』,將指標前進一位後,返回t∩g
defg(
):# g->+tg|-tg
global i
if line[i]
=='+'
or line[i]
=='-'
: i=i+
1if t(
)and g():
return
true
else
:return
false
else
:return
true
s的遞迴下降分析程式:實現**原理與g類似
defs(
):# s->*fs|/fs
global i
if line[i]
=='*'
or line[i]
=='/'
: i=i+
1if f(
)and s():
return
true
else
:return
false
else
:return
true
f的遞迴下降分析程式:
deff(
):# f->(e)|i
global i
if line[i]
=='i'
: i=i+
1return
true
if line[i]
=='('
: i=i+
1if e(
)and line[i]
==')'
: i=i+
1return
true
return
false
主函式:如果輸入串為q退出程式;若不為q,則在輸入串末尾新增#用於確認是否分析完成;若從e開始遞迴下降分析能到輸入串的最後乙個字元即當前字元為#,則輸入串合法,反之判定為非法字串並輸出錯誤字元所在的位置
if __name__ ==
"__main__"
:print
("遞迴下降分析程式"
)while
true
: i=
0 line=
input
("輸入符號串(包括+-*/()i): "
)if line==
'q':
break
line=line+
'#'if e(
)and line[i]
=='#'
:print
("輸出結果:"
+line[0:
len(line)-1
]+"為合法符號串"
)else
:print
("輸出結果:"
+line[0:
len(line)-1
]+"為非法的符號串"
)print(+
str(i+1)
+"處, 該字元為 "
+line[i]
)
輸出結果
完整**
i=
0defe(
):# e->tg
if t(
)and g():
return
true
else
:return
false
deft()
:# t->fs
if f(
)and s():
return
true
else
:return
false
defg()
:# g->+tg|-tg
global i
if line[i]
=='+'
or line[i]
=='-'
: i=i+
1if t(
)and g():
return
true
else
:return
false
else
:return
true
defs()
:# s->*fs|/fs
global i
if line[i]
=='*'
or line[i]
=='/'
: i=i+
1if f(
)and s():
return
true
else
:return
false
else
:return
true
deff()
:# f->(e)|i
global i
if line[i]
=='i'
: i=i+
1return
true
if line[i]
=='('
: i=i+
1if e(
)and line[i]
==')'
: i=i+
1return
true
return
false
if __name__ ==
"__main__"
:print
("遞迴下降分析程式"
)while
true
: i=
0 line=
input
("輸入符號串(包括+-*/()i): "
)if line==
'q':
break
line=line+
'#'if e(
)and line[i]
=='#'
:print
("輸出結果:"
+line[0:
len(line)-1
]+"為合法符號串"
)else
:print
("輸出結果:"
+line[0:
len(line)-1
]+"為非法的符號串"
)print(+
str(i+1)
+"處, 該字元為 "
+line[i]
)
總結在**實現上,遞迴下降分析法幾乎可以稱得上是最簡單的一種語法分析方法了,但也造成了它的侷限性,它只能用於分析ll(1)文法。 遞迴下降語法分析
看了這篇部落格之後,總算搞明白了以前編譯原理沒搞懂的ll文法的意義。下面用這種方法實現乙個簡單的計算機器程式 其bnf正規化如下 operator operator operator operator expression 0,1,2,3,4,9 expression operator expres...
遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...
遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...