"""created by ws
""""""
文法:e->e+t | t
t->t*f | f
f->(e)|i
消除左遞迴:
e->th
h->+th|e(e替代空)
t->fy
y->*fy|e
f->(e)|i
非終結符:
e,h,t,y,f
終結符:
i,+,*,(,),#
"""# 手動構造**分析表
dists =
# 構造終結符集合
vt = ('i'
, '+'
, '*'
, '('
, ')')
# 構造非終結符集合
vh = ('e'
, 'h'
, 't'
, 'y'
, 'f')
# 獲取輸入棧中的內容
def
printstack(stack):
rtu = ''
for i in stack:
rtu += i
return rtu
# 得到輸入串剩餘串
def
printstr(str, index):
rtu = ''
for i in
range(index,
len(str),
1): rtu += str[i]
return rtu
# 定義error函式
def
error():
print('error')
exit()
# 總控程式
def
masterctrl(str):
'''總控程式,用於程序文法的判斷
'''# 用列表模擬棧
stack =
location = 0
# 將#號入棧
# 將文法開始符入棧
# 將輸入串第乙個字元讀進a中
location += 1
a = str[location]
printstack(stack)
flag = true
count = 0
print('%d
\t\t
%s\t\t
%s' % (count, printstack(stack), printstr(str, location)))
while flag:
if count == 0:
pass
else:
if x in vt:
print('%d
\t\t
%s\t\t
%s' % (count, printstack(stack), printstr(str, location)))
else:
print('%d
\t\t
%s\t\t
%s\t\t
%s->%s' % (count, printstack(stack), printstr(str, location), x, s))
x = stack.pop()
if x in vt:
if x == str[location]:
location += 1
a = str[location]
else:
error()
elif x == '#':
if x == a:
flag = false
else:
error()
elif (x, a) in dists.keys():
s = dists[(x, a)]
for i in
range(len(s) - 1
, -1
, -1):
if s[i] != 'e':
else:
error()
count += 1
def
main():
# str = input()
str = '#i+i*i#'
print("步驟
\t\t
符號棧\t\t
輸入串\t\t\t
所用產生式")
masterctrl(str)
if __name__ == '__main__':
main()
LL 1 文法判斷
ll 1 文法判斷 題型 1.判斷該文法是否是ll 1 文法?2.若是,給出它的ll 1 分析表,否則說明理由。概念 對於產生式 a 1.如果 均不能推導出 空語句 則 first first 2.和 至多有乙個能推導出 3.如果 經過0步或多步可以推導出 則 first follow a 關鍵 求...
LL(1)文法解析
一 問題描述 給定上下文無關文法,對其進行解析,得出first集和follow集。在有能力的情況下,可以求出ll 1 分析表。二 演算法設計 本程式主要分成三塊內容,第一是文法的讀入解析,第二是first集的求解,第三為follow集的求解。文法的解析需要根據整行讀入的文法,生成rulelist 表...
編譯原理實驗 LL(1)文法
目標任務 實現 ll 1 分析中控制程式 表驅動程式 完成以下描述算術表示式的 ll 1 文法的 ll 1 分析程式。g e e te e ate t ft t mft f e i a m 說明 終結符號 i 為使用者定義的簡單變數,即識別符號的定義。compiler3.cpp 定義控制台應用程式的...