python3 5實現LL 1 文法

2021-08-20 09:00:33 字數 2267 閱讀 7332

"""

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 定義控制台應用程式的...