語法分析 Python實現遞迴下降分析程式

2021-10-08 08:50:02 字數 4247 閱讀 5143

例子文法

實現步驟

定義每個非終結符的遞迴下降分析程式

從開始符號遞迴下降分析

如遞迴下降能到輸入串的最後乙個符號,則輸入串合法;反之輸入串不合法

**實現

定義全域性變數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集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...