2020編譯原理練習記錄(4)--------算符優先文法

掌握了那道40分的大題之後,今天展示的是一道算符優先文法題。
題目如下:
對於文法G[N]:
V->N
V->N[E]
E->V
E->V+E
N->i
(1)構造G[V]的優先關係表,判斷G[V]是否爲算符優先文法
(2)判斷i[i+i+i]#是否符合上述的文法

解析:
(1)第一步就是根據文法求出各個非終結符的FirstVT和LastVT表,所謂FirstVT就是從前到後看見的第一個終結符,因爲這個文法是關於N的,所以從N開始找,N->i,所以N的FirstVT只有i,V->N,V->N[E],所以V的FirstVT有[,i,LastVT就是FirstVT的相反,就是從後向前看的第一個終結符,以此類推,可以得到下表:

非終結符 FirstVT LastVT
V [,i ],i
E +,[,i +,],i
N i i

(2)得到FirstVT和LastVT表之後我們就不再關注非終結符了,判斷各個終結符的優先級,首先找的是=關係,就是兩個終結符之間夾着一個非終結符的情況,所以這道題中[和]是=關係,然後看的是<關係,找的是終結符+非終結符的形式,就是[E,+E,可以得出[<FirstVT(E),+<FirstVT(E),相比較而言,>關係就是找非終結符+終結符的形式,N[,E,],V+,可以得出LastVT(N)>[,LastVT(E)>],LastVT(V)>+,由此便可以得出下表:

終結符 + [ ] i #
+ < < > < >
[ < < = < >
] > > >
i > > > >
# < < < < =

第一問的優先關係表就求完了,根據算符優先文法的定義也能看出這個文法是算符優先文法。
(3)然後就開始判斷那個句子是否符合這個算符優先文法
方法就是不斷取輸入字符串的棧頂和當前符號比較優先級,若是<或者=的關係就是移進的操作,如果是>的關係就是規約的關係。這道題的過程見下圖:
在這裏插入圖片描述
這道題據說也是非常重要的,如果有想討論的可以找我討論哈哈哈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章