编译原理实验语义分析_「编译原理」LL(1)文法分析,简单优先分析
首先我們來介紹一下LL(1)文法分析。
LL(1)文法是一種自頂向下的分析方式,是從非終結(jié)符到終結(jié)符的分析方式,這種方式和我們之前說的LR(0)分析方式是剛好相反的,在我們使用LR(0)分析方式的時候。我們可以看到這個符號棧是由開始空的而后變?yōu)榻K結(jié)符之后再變?yōu)榉墙K結(jié)符的過程。
下面介紹一下用LL(1)文法進行分析句子的過程。
首先要寫出FIRST集和FOLLOW集。
之后根據(jù)FIRST集和FOLLOW集來進行預(yù)測分析表的構(gòu)造
預(yù)測分析表構(gòu)造的時候若FIRST集沒有推出ε那么就可以直接在預(yù)測分析表的FIRST集的位置填入原非終結(jié)符所對應(yīng)的定義項。如果推出了ε,那么就要在FOLLOW集的位置填入ε。
當然,我們要注意的一個地方就是如果表中的一個空格中填入了兩個元素(select集交集非空),那么就說明這個文法不適合用LL(1)文法來分析,就要改變分析方式。
下面講一下具體的分析過程
符號棧的開始是非終結(jié)符S
輸入串的棧中的內(nèi)容是輸入串的從尾部逐個輸入棧。
之后我們要從之前填好的預(yù)測分析表中來找到對應(yīng)的規(guī)則,從這個非終結(jié)符開始,將非終結(jié)符變?yōu)榻K結(jié)符和非終結(jié)符的和。之后,一旦這個符號棧和這個輸入串的棧的棧頂相同,那么就可以進行彈出棧頂元素。因為我們彈出的結(jié)果肯定是終結(jié)符,所以剩下的結(jié)果肯定是一個非終結(jié)符。當棧頂?shù)脑乇徊粩嗟貜棾鲋?#xff0c;之后如果這個符號棧和輸入串的棧均為空的時候,就可以表明現(xiàn)在的分析是成功的。
之后我們來介紹一下簡單優(yōu)先分析
簡單優(yōu)先分析是按照終結(jié)符和非終結(jié)符之間的優(yōu)先關(guān)系來確定句柄的。
這里首先給出優(yōu)先關(guān)系的定義,這里的優(yōu)先關(guān)系的定義要在原先的“>”,“
當兩個符號直接連在一塊的時候例如……XYZ……則XYZ的優(yōu)先關(guān)系相等。如果Y還可以繼續(xù)向下推,則有XZ
若兩個都能繼續(xù)向下推,由于我們從最左下角的句柄開始進行規(guī)約,所此時左邊推出的優(yōu)先級要大于右邊的優(yōu)先級。關(guān)于句柄的概念我們在下一章的算符優(yōu)先分析中再進行介紹。
這里知道了關(guān)系之后我們就可以根據(jù)它們的關(guān)系來構(gòu)造關(guān)系矩陣表。簡單優(yōu)先分析的關(guān)系矩陣中是出現(xiàn)過得所有的元素,包含終結(jié)符和非終結(jié)符。
從文法的第一個句子開始向后找關(guān)系,之后把關(guān)系矩陣寫出來,需要注意的是這里的大于號和小于號是不能交換的比如A>B并不等于B
簡單優(yōu)先分析方法的步驟
首先這里分為符號棧,關(guān)系,輸入串棧,規(guī)則,四個對應(yīng)的
符號棧開始為#,輸入串的棧為我們要分析的字符串的逆序入棧。當關(guān)系為小于和等于的時候輸入棧的棧頂彈出進入符號棧,關(guān)系為大于的時候進行規(guī)約。
我們直接查表來進行比較要注意,此時文法的開始符號的旁邊有這個“#”,也可以由此得到“#”和文法開始符號之間的關(guān)系。
在進行規(guī)約的時候,我們要在后面的規(guī)則中寫出對應(yīng)的文法。之后一直是這個過程直到規(guī)約到文法的初始符。
總結(jié)
以上是生活随笔為你收集整理的编译原理实验语义分析_「编译原理」LL(1)文法分析,简单优先分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO Find X6系列正式官宣:将
- 下一篇: 央视315点名景区高空项目不安全 景区回