編譯原理 語法分析3 LR分析器

2021-08-30 17:43:31 字數 3668 閱讀 5327

#語法分析,lr分析器

import pandas as pd

data=

slr=pd.dataframe(data,index=

['0'

,'1'

,'2'

,'3'

,'4'

,'5'

,'6'

,'7'

,'8'

,'9'

,'10'

,'11'])

#slr分析表

grammer=

[' '

,'e→e+t'

,'e→t'

,'t→t*f'

,'t→f'

,'f→(e)'

,'f→id'

]#文法的各個產生式

stk=

'0'#用字串模擬棧

sub=

""#當前待處理記號被處理後的輸入

defnexttoken()

:#獲取下乙個詞法記號

global sub

if(sub[0:

2]=="id"):

sub=sub[2:

]return

"id"

else

: s=sub[0:

1]sub=sub[1:

]return s

defshownexttoken()

:#檢視下乙個詞法記號

global sub

if(sub[0:

2]=="id"):

return

"id"

else

: s = sub[0:

1]return s

deftop()

:#獲取棧頂元素

global stk

if(stk[-2

:]=='10'

or stk[-2

:]=='id'

or stk[-2

:]=='11'):

return stk[-2

:]else

:return stk[-1

:]defpop()

:#彈出棧頂元素

global stk

if(stk[-2

:]=='id'

or stk[-2

:]=='10'

or stk[-2

:]=='11'):

stk=stk[:-

2];else

: stk=stk[:-

1]defpush

(s):

#產生式→右邊的逆序入棧

global stk

stk=stk+s

defrightlenth

(s):

#計算產生式→右邊的長度

index=s.find(

'→')

ss=s[index+1:

]if ss==

'id'

:return

1else

:return

len(s[index+1:

])defleftpro

(s):

#計算產生式→左邊的非終結符

index = s.find(

'→')

return s[

:index]

defhandle

(t,head)

:#分析程式

global slr

global stk

action=slr[head]

[t]#print("head=",head,'t=',t,"action=",action,end=" ")

if action==

'acc'

:print

("%-10s"

%stk,

"%+9s"

%sub,

' 接受'

)return

true

else

:if action[0]

=='s'

:#要移進

print

("%-10s"

%stk,

"%+9s"

%sub,

" 移進"

) push(nexttoken())

push(action[1:

])elif action[0]

=='r'

:#要歸約

production=grammer[

ord(action[1:

])-ord

('0')]

print

("%-10s"

%stk,

"%+9s"

%sub,

" 按"

,production,

"歸約"

) lenth=rightlenth(production)

for i in

range

(lenth*2)

: pop(

) t=top(

) left=leftpro(production)

push(left)

push(slr[left]

[t])

else

:#出錯

print

("%-10s"

%stk,

"%+9s"

%sub,end='')

print

(" error"

,end=

', '

)print

('多輸入了乙個'

,head)

head=nexttoken(

)return

false

if __name__==

'__main__'

:print

("---------------------------------------"

) sub=

input()

sub+=

'$'print

("---------------------------------------"

)print

("%-8s"

%"棧"

,"%+8s"

%"輸入"

," 動作"

LR 語法分析器

lr語法分析器算是基本完成了,只需要乙個文法定義檔案 syntax 就可以進行對應語言的語法分析,最後形成語法樹。詞法分析是固定的,採用c 的詞法定義。以後將加入動態的詞法分析。壓縮包中檔案的描述 lrtable.exe 是用文法定義檔案 syntax檔案 生成lr動作表檔案 action檔案 使用...

編譯原理 基於LR分析表編寫語法分析器

問題描述 已知文法g e e e t t t e id id e 設計lr分析表,並用c 語言編寫語法分析器。輸入形式 乙個句子 輸出形式 句子語法結構正確,輸出 syntax analysis is right 反之輸出 error on syntax analysis 樣例輸入 a1 a2 樣例...

編譯原理語法分析器

採用至少一種句法分析技術 ll 1 slr 1 lr 1 或lalr 1 對類高階語言中的基本語句進行句法分析。闡述句法分析系統所要完成的功能。1 能識別以下幾類語句 宣告語句 包括變數宣告 陣列宣告 記錄宣告和過程宣告 表示式及賦值語句 包括陣列元素的引用和賦值 分支語句 if then else...