| 课程名称 | 编程语言原理与编译 |
|---|---|
| 实验项目 | 语法分析 LR 分析 |
简介构造:
构造NFA

构造DFA
直接构造:
构造DFA
在LR(0)文法基础上增加增广文法,使分析器只有一个接收状态
在某个LR(0)文法的所有LR(0)项目中,点后面是非终结符的项目存在重复项目,这些项目集合称为项目集闭包,对应着DFA的一个状态(使用CLOSURE()函数)
从增广文法开始,遍历DFA状态里每个项目的后继LR(0)项目(使用GOTO()函数),每遍历一个就作为一个状态,并使用该符号链接。例如:
如果遇到归约项目,则该分支结束;当所有都结束后,构建DFA结束
如果没有冲突就为LR(0)文法,否则为LR(1)文法
图3-13 LR 状态表,找到其中的冲突项在状态9、11、13、15均存在移进/归约冲突
Action Table(动作表) ,Goto Table(状态转换表)的定义什么是左/右结合/非结合 ,如何在语法说明文件里面声明 p53
如何用 %prec 指示,自定义某规则的优先级 p53
http://mdaines.github.io/grammophone/# 核对你的作业
S -> S A b .
S -> a c b .
A -> b B c .
A -> b c .
B -> b a .
B -> A c .
分析栈上的内容如下,请分别写出可归约串是什么(▽ 表示栈底):
(a)▽SSAb
(b)▽SSbbc
(c)▽SbBc
(d)▽Sbbc
(a)可归约串:SAb
(b)可归约串:bc
(c)可归约串:bBc
(d)可归约串:bc
请按ppt 中 构造表格,列出分析栈,输入流, shift/reduce操作 的内容

(a) acb
(b) acbbcb
(c) acbbbacb
(d) acbbbcccb
(e) acbbcbbcb
| 步骤 | 栈 | 输入字符串 |
|---|---|---|
| 0 | $ | acb$ |
| 2 | $a | cb$ |
| 5 | $ac | b$ |
| 11 | $acb | $ |
| acc | $ | $ |
| 步骤 | 栈 | 输入字符串 |
|---|---|---|
| 0 | $ | acbbcb$ |
| 2 | $a | cbbcb$ |
| 5 | $ac | bbcb$ |
| 11 | $acb | bcb$ |
| 0 | $ | bcb$ |
| 1 | $S | bcb$ |
| 4 | $Sb | cb$ |
| 8 | $Sbc | b$ |
| 1 | $SA | b$ |
| 3 | $SA | b$ |
| 6 | $SAb | $ |
| acc | $ | $ |
| 步骤 | 栈 | 输入字符串 |
|---|---|---|
| 0 | $ | acbbbacb$ |
| 2 | $a | cbbbacb$ |
| 5 | $ac | bbbacb$ |
| 11 | $acb | bbacb$ |
| 0 | $ | bbacb$ |
| 1 | $S | bbacb$ |
| 4 | $Sb | bacb$ |
| 9 | $Sbb | acb$ |
| 13 | $Sbba | cb$ |
| 4 | $Sb | cb$ |
| 7 | $SbB | cb$ |
| 12 | $SbBc | b$ |
| 1 | $S | b$ |
| 3 | $SA | b$ |
| 6 | $SAb | $ |
| acc | $ | $ |
| 步骤 | 栈 | 输入字符串 |
|---|---|---|
| 0 | $ | acbbbcccb$ |
| 2 | $a | cbbbcccb$ |
| 5 | $ac | bbbcccb$ |
| 11 | $acb | bbcccb$ |
| 0 | $ | bbcccb$ |
| 1 | $S | bbcccb$ |
| 4 | $Sb | bcccb$ |
| 9 | $Sbb | cccb$ |
| 15 | $Sbbc | ccb$ |
| 4 | $Sb | ccb$ |
| 10 | $SbA | ccb$ |
| 16 | $SbAc | cb$ |
| 4 | $Sb | cb$ |
| 7 | $SbB | cb$ |
| 12 | $SbBc | b$ |
| 1 | $S | b$ |
| 3 | $SA | b$ |
| 6 | $SAb | $ |
| acc | $ | $ |
| 步骤 | 栈 | 输入字符串 |
|---|---|---|
| 0 | $ | acbbcbbcb$ |
| 2 | $a | cbbcbbcb$ |
| 5 | $ac | bbcbbcb$ |
| 11 | $acb | bcbbcb$ |
| 0 | $ | bcbbcb$ |
| 1 | $S | bcbbcb$ |
| 4 | $Sb | cbbcb$ |
| 8 | $Sbc | bbcb$ |
| 1 | $S | bbcb$ |
| 3 | $SA | bbcb$ |
| 6 | $SAb | bcb$ |
| 0 | $ | bcb$ |
| 1 | $S | bcb$ |
| 4 | $Sb | cb$ |
| 8 | $Sbc | b$ |
| 1 | $S | b$ |
| 3 | $SA | b$ |
| 6 | $SAb | $ |
| acc | $ | $ |
S -> S a b .
S -> b A .
A -> b b .
A -> b A .
A -> b b c .
A -> c .
输入串
(a) b c
(b) b b c a b
(c) b a c b

| 步骤 | 栈 | 输入字符串 |
|---|---|---|
| 0 | $ | bc$ |
| 2 | $b | c$ |
| 6 | $bc | $ |
| 2 | $b | $ |
| 4 | $bA | $ |
| acc | $ | $ |
| 步骤 | 栈 | 输入字符串 |
|---|---|---|
| 0 | $ | bbcab$ |
| 2 | $b | bcab$ |
| 5 | $bb | cab$ |
| 6 | $bbc | ab$ |
| 5 | $bb | ab$ |
| 9 | $bbA | ab$ |
| 2 | $b | ab$ |
| 4 | $bA | ab$ |
| 0 | $ | ab$ |
| 1 | $S | ab$ |
| 3 | $Sa | b$ |
| 7 | $Sab | $ |
| acc | $ | $ |
| 步骤 | 栈 | 输入字符串 |
|---|---|---|
| 0 | $ | bacb$ |
| 2 | $b | acb$ |
| err |
存在reduce/reduce 冲突,但情况3并不是因为这个报错,而是一个非产生式报错
阅读 calcvar 中

fsyacc 工具添加 -v 参数,查看生成语法分析器的 LR 状态表// calcvar.fsproj
<FsYacc *Include*="parser.fsy">
<OtherFlags> -v --module Parser</OtherFlags>
</FsYacc>
注意下特定状态的

fsyacc工具添加 -v查看 LR 分析状态表
C 语言的指针,数组语法分析比较复杂,构造语法树时用到了比较高级的函数式编程技巧