#語法分析,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...