語法分析:將切分的單詞序列組合成各類短語短語,常見的方法:自上而下,自下而上。
ll(1):左掃瞄,左推導。
大體步驟:
1.從檔案或其他方式匯入\儲存文法(實質就是幾行符號流) 並把其中的終結字元和非終結字元存在陣列\列表裡
2.把文法每行的「或」(|)切分成兩個即a->b|c 切分為a->b和a->c
for i in gramma:
ss=i[0:1]
j=0while j':
break
j+=1
j+=1 #找到->後的第乙個位置
while j3.根據文法建立first集和follow 集
(1)first:在切分後的文法中 如果a->a…… (a為終結字元)則把a放入a的follow中 如果a->b ……(b為非終結) 則先遞迴求b的first,然後放入a的first
(2)follow::先把『$』放入開始字元(e)的follow;存在 ……ab(b為非終結),則把b放入a的follow ;存在ab(b為非終結),則把b的first放入a的follow;存在b=eac,且c的first中含有『ε』,則把b的follow放入a的follow;若a為某段的最後字元,則把『$』放入a的follow;若b=……a,則把b的follow放入a的follow
def getfirst(stack_item):
if stack_item[1] in vt:#產生式第乙個為終結
first[stack_item[0]].add(stack_item[1])#將其放入第乙個的first
else:
for find_item in stack:
if find_item[0]==stack_item[1]:
getfirst(find_item)
first[stack_item[0]]=first[stack_item[1]]|first[stack_item[0]]
def getfollow(vi_item):
for i in stack:
j=1while j4.求**分析表(**使用雙重字典)
對於每個產生式a->alpha 執行(1)(2)
(1)對first(alpha)中的每乙個終結字元a,把a->alpha放入m[a,a]
(2)如果ε在first(alpha)中,對於follow(alpha)的每乙個終結字元b,把a->alpha放入m[a,b](包括$)
寫了半天並沒有寫出來 於是就手動建了。。。
6.對輸入的記號流進行分析:
設w為記號流 ip為指向第乙個符號 設s為棧 初始只有開始元素e和$($在最低)
while(棧頂不是$))
else:
thedict.update(})
def getfirst(stack_item):
if stack_item[1] in vt:#產生式第乙個為終結
first[stack_item[0]].add(stack_item[1])#將其放入第乙個的first
else:
for find_item in stack:
if find_item[0]==stack_item[1]:
getfirst(find_item)
first[stack_item[0]]=first[stack_item[1]]|first[stack_item[0]]
def getfollow(vi_item):
for i in stack:
j=1while j':
break
j+=1
j+=1 #找到->後的第乙個位置
while jte')
addtwodimdict(ana_table, 'e', '(', 'e->te')
addtwodimdict(ana_table, 'e', '+', 'e->+te')
addtwodimdict(ana_table, 'e', ')', 'e->ε')
addtwodimdict(ana_table, 'e', '$', 'e->ε')
addtwodimdict(ana_table, 't', 'i', 't->ft')
addtwodimdict(ana_table, 't', '(', 't->ft')
addtwodimdict(ana_table, 't', '+', 't->ε')
addtwodimdict(ana_table, 't', '*', 't->*ft')
addtwodimdict(ana_table, 't', ')', 't->ε')
addtwodimdict(ana_table, 't', '$', 't->ε')
addtwodimdict(ana_table, 'f', 'i', 'f->i')
addtwodimdict(ana_table, 'f', ')', 'f->(e)')
sen="i*i+i$"
ip=0
ss=['$','e']
while ss[len(ss)-1]!='$':
print(ss)
print(sen[ip])
if ss[len(ss)-1]==sen[ip]:
ss.pop()
ip+=1
elif ss[len(ss)-1] in vt:
print("error1")
break
elif sen[ip] not in ana_table[ss[len(ss)-1]]:
print("error2")
break
elif sen[ip] in ana_table[ss[len(ss)-1]]:
strings=ana_table[ss[len(ss)-1]][sen[ip]]
print(strings)
ss.pop()
j=len(strings)-1
while j>2:
if strings[j]!='ε':
j-=1
使用的文法為《編譯原理》高等教育出版社第三章3.8文法 其中為了方便考慮e『表示為e t』同理
文法(gramma):
切分後(stack):->已經省略
first集與follow集合:(不知道為啥多了一行 ,但沒有value ,還沒來得及修改)
最後分析結果:
LL(1)語法分析
ll 1 分析法的功能是利用ll 1 控制程式根據顯示棧棧頂內容 向前看符號以及ll 1 分析表,對輸入符號串自上而下的分析過程。可通過消除左遞迴 提取左因子把非ll 1 文法改造成ll 1 文法。在 ll 1 分析程式設計過程中,最重要的兩個問題是 分析表的構造和相關資料結構的設計。而 分析表的構...
LL 1 語法分析
ll 1 文法分析是自頂向下的分析方法,也可以被看作是輸入串的最左推導過程,ll 1 中1的意思就是可以根據可以根據當前輸入串中的乙個字元來判斷是由哪乙個產生式產生。下面給出文法 e te e ate 代表空集 t ft t mft f i e i 0 1 2 9 a m 首先要構造first集合與...
自上而下語法分析LL(1)
1.語法分析的地位 是編譯程式的核心部分 2.語法分析的任務 識別由詞法分析得出的單詞序列是否是給定文法的句子 3.語法分析的理論基礎 上下文無關文法和下推自動機 4.語法分析的方式 1 自上而下語法分析 反覆使用不同產生式進行推導以謀求與輸入符號串相匹配 2 自下而上語法分析 對輸入符號串尋找不同...