【发布时间】:2012-10-17 21:40:19
【问题描述】:
我正在尝试制作自己的 LR(0) 解析器,但遇到了一些语法问题。
基本上,对于语法
exp: mexp
mexp: '1'
mexp: mexp '*' '1'
我的解析器正在输出
State 0: • 1
| • mexp
| • exp
| • mexp * 1
State 1: 1 •
State 2: exp •
State 3: mexp • * 1
| mexp •
State 4: mexp * • 1
State 5: mexp * 1 •
警告
(state 3, *) already has reduction: exp: mexp
我的程序为此语法导出的 LR(0) 表是:
'1' exp mexp '*' $
State 0: s1 s2 s3
State 1: r3 r3 r3
State 2: acc
State 3: r2 s4 r2
State 4: s5
State 5: r4 r4 r4
其中 $ 表示文件的结尾。
警告源于这样一个事实,即状态 3(对应于mexp • * 1 | mexp •)具有两个减少r2 和状态转换s4对于输入*。
但看起来像according to Wikipedia,这不应该发生——我应该只有减少:
如果一个项目集 i 包含一个 A → w • 形式的项目,并且 A → w 是规则 m 且 m > 0那么动作表中状态i的行完全被reduce动作rm填充。
有趣的是,当我删除规则 exp: mexp 时,我没有遇到任何此类冲突。
所以我无法弄清楚的是,这确实是语法中的真正问题吗?
(换句话说,这个语法实际上不是LR(0)吗?)
我不认为是这种情况,但我不确定。
如果是这样,为什么?如果没有,那有什么问题? (是我的桌子错了,还是我做错了什么?)
【问题讨论】:
-
我认为您实际上想让 exp 规则包含“$”标记,因为它是开始生产。
-
... 或类似的东西 :) 建议的答案。
标签: parsing language-agnostic grammar lr