构造lr(0)分析表课程设计
时间: 2024-01-01 12:04:58 浏览: 40
1. 确定文法
首先,我们需要确定要进行LR(0)分析的文法。可以选择一个已有的文法,或者自己设计一个。
例如,我们选择以下文法:
S -> E
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> id
2. 构造LR(0)自动机
根据文法,我们可以构造LR(0)自动机。首先,我们需要添加一个起始状态,将文法的开始符号S加入其中。
S' -> .S
然后,我们需要计算出每个状态可以转移到的其他状态。对于每个状态,我们需要扫描其产生式中的点号,看看是否可以进行移入或规约操作。
例如,对于初始状态S' -> .S,我们可以进行移入操作,将输入符号E移入该状态,得到S' -> S.和E -> .E+T。
我们可以继续计算下一个状态S' -> S.,在其产生式中,我们可以进行移入操作,将输入符号+移入该状态,得到S' -> S.+和E -> E.+T。
我们可以继续计算下一个状态E -> E.+T,我们可以进行移入操作,将输入符号T移入该状态,得到E -> E.T+.
我们可以继续计算下一个状态T -> F.,我们可以进行移入操作,将输入符号(移入该状态,得到T -> (.E)和F -> .(E)。
我们可以继续计算下一个状态F -> (.E),我们可以进行移入操作,将输入符号E移入该状态,得到F -> (E.)。
我们可以继续计算下一个状态T -> T.*F,我们可以进行移入操作,将输入符号F移入该状态,得到T -> T*.F和F -> .(E)。
我们可以继续计算下一个状态F -> id.,我们无法进行移入或规约操作,因此该状态是最终状态。
最终得到的LR(0)自动机如下:
状态 | 产生式
----|----
0 | S' -> .S E -> .E+T
1 | S' -> S. E -> E.+T
2 | E -> E.T+.
3 | T -> F.
4 | F -> (.E) T -> (.E)
5 | F -> (E.)
6 | T -> T*.F F -> .(E)
7 | F -> id.
3. 构造LR(0)分析表
根据LR(0)自动机,我们可以构造LR(0)分析表。分析表中的每个条目都表示在某个状态下,如果输入符号是某个终结符号或$,就应该进行移入操作或规约操作,或者进行错误处理。
对于每个状态,我们需要计算出其可以进行移入或规约操作的符号及其对应的操作。如果该状态是最终状态,我们需要将该状态对应的产生式加入规约表中。
例如,对于状态0,我们可以进行移入操作,将输入符号E移入该状态,得到状态1。因此,在状态0和E之间的表格中,我们可以填入S。在状态0和$之间的表格中,我们可以填入acc,表示分析成功。
对于状态1,我们可以进行移入操作,将输入符号+移入该状态,得到状态2。因此,在状态1和+之间的表格中,我们可以填入shift 2。在状态1和$之间的表格中,我们可以填入acc。
对于状态2,我们可以进行移入操作,将输入符号T移入该状态,得到状态3。因此,在状态2和T之间的表格中,我们可以填入S。在状态2和$之间的表格中,我们可以填入R2,表示使用产生式E -> E+T进行规约。
对于状态3,我们可以进行移入操作,将输入符号*移入该状态,得到状态4。因此,在状态3和*之间的表格中,我们可以填入shift 4。在状态3和+之间的表格中,我们可以填入R2,表示使用产生式E -> T进行规约。在状态3和$之间的表格中,我们可以填入R2。
对于状态4,我们可以进行移入操作,将输入符号F移入该状态,得到状态5。因此,在状态4和F之间的表格中,我们可以填入S。在状态4和(之间的表格中,我们可以填入S。
对于状态5,我们可以进行规约操作,使用产生式F -> (E)进行规约。因此,在状态5和)之间的表格中,我们可以填入R6,表示使用产生式T -> F进行规约。
对于状态6,我们可以进行移入操作,将输入符号*移入该状态,得到状态4。因此,在状态6和*之间的表格中,我们可以填入shift 4。在状态6和+之间的表格中,我们可以填入R1,表示使用产生式E -> E+T进行规约。在状态6和$之间的表格中,我们可以填入R1。
对于状态7,我们无法进行移入或规约操作,因此在状态7和任何终结符之间的表格中,我们可以填入error,表示出现语法错误。
最终得到的LR(0)分析表如下:
状态 | id | + | * | ( | ) | $ | S | E | T | F
----|-------|-------|-------|-------|-------|-------|------|------|------|------
0 | shift 7| | | shift 6| | acc | S | | |
1 | | shift 2| | | | acc | | | |
2 | shift 7| | | shift 6| | R2 | S | | S |
3 | shift 7| shift 2| shift 4| shift 6| | R2 | | R2 | |
4 | shift 7| | | shift 6| | R6 | | | S | S
5 | shift 7| | | shift 6| shift 8| R6 | | | |
6 | shift 7| shift 2| shift 4| shift 6| | R1 | | R1 | |
7 | error | error | error | error | error | error | | | |
4. 进行分析
最后,我们可以使用构造出的LR(0)分析表进行分析。对于给定的输入符号串,我们从状态0开始,按照表格中的指示,进行移入或规约操作,直到分析成功或出现语法错误。
例如,对于输入符号串id*id+id,我们可以进行如下的分析:
状态 | 符号栈 | 输入符号 | 操作
----|------|------|----
0 | | id*id+id$ | shift 7
7 | id | *id+id$ | shift 4
4 | id* | id+id$ | shift 7
7 | id*id| +id$ | shift 2
2 | id*E | +id$ | S
7 | id*E+| id$ | shift 7
7 | id*E+i| d$ | shift 7
7 | id*E+id| $ | R6
4 | id*T | $ | R6
3 | E | $ | R2
1 | S | $ | acc
因此,输入符号串id*id+id是合法的,可以被文法S -> E -> T -> F -> id和T -> T * F正确规约。
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)