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