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)然后就开始判断那个句子是否符合这个算符优先文法
方法就是不断取输入字符串的栈顶和当前符号比较优先级,若是<或者=的关系就是移进的操作,如果是>的关系就是规约的关系。这道题的过程见下图:
在这里插入图片描述
这道题据说也是非常重要的,如果有想讨论的可以找我讨论哈哈哈

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