【发布时间】:2014-09-25 13:57:32
【问题描述】:
我正在编写一个受 Bison 启发的解析框架,但 Bison 手册中有一些我不太了解的内容。
来自 Bison 手册 5.3.5 How Precedence Works:
...每个规则从组件中提到的最后一个终端符号获取其优先级。
和
并非所有规则和令牌都具有优先权。如果规则或前瞻标记没有优先级,则默认为移位。
据我所知,这归结为:
- 令牌有优先权,规则没有 -> 转移
- 规则优先,令牌不 -> 移位
- 两者都没有优先级 -> shift
- 两者都有优先级:
- 令牌具有更高的优先级 -> 移位
- 规则具有更高的优先级 -> 减少
- 同等优先级 -> 使用优先级的关联性来确定操作
但这是否意味着不包含任何具有声明优先级的终端符号的规则永远不会被减少?我错过了什么?
例如,下面的语法:
S -> E + E
E -> foo1
E -> foo2
给出一个具有七个状态的 dfa,前两个是:
- 状态 0
- 项目:
- S' -> 。新元
- S->。 E + E
- E->。 foo1
- E->。 foo2
- 边缘:
- E -> 3
- S -> 4
- foo1 -> 1
- foo2 -> 2
- 项目:
- 状态 1
- 项目:
- E -> foo1 。前瞻:+,$
- 项目:
当解析字符串 foo1 + foo2 时,解析器移动标记 foo1 并最终进入状态 1。下一个前瞻标记是 +,'+' 和规则 E -> foo1 都没有任何声明的优先级,这意味着解析器应该移位,但状态1没有这样的边缘,导致解析器返回语法错误。
提前致谢
【问题讨论】: