将语法修改为LR(0)

时间:2016-02-12 10:31:57

标签: parsing

问题:

鉴于以下语法,将其修复为LR(O)语法:

S -> S' $
S'-> aS'b | T
T -> cT | c

思想 我已经尝试了很长一段时间,使用自动工具检查我的固定语法,但没有成功。我们的教授喜欢在测试时询问这类问题而不给我们一个接近这个问题的方法(除了重复尝试)。有没有什么方法可以用来回答这类问题?任何人都可以证明这个方法可以应用于这个例子吗?

1 个答案:

答案 0 :(得分:0)

我不知道自动程序,但基本的想法是推迟决定。也就是说,如果在解析中的特定状态下,移位和减少操作都是可能的,那么找到一种方法来推迟减少。

在LR(0)解析器中,您可以根据刚移动的令牌做出决定,但不能根据您(可能)即将移动的令牌做出决定。因此,您需要以某种方式将决策移至制作结束。

例如,您的语言的LR(0)语法是:

S -> S' $.
S' -> U | a S' b.
U -> a c T.
T -> b | c T.

(非常感谢@templatetypedef检查原始答案,并确定缺陷。更正后的语法稍微复杂一点,可能存在简化,但原理是相同的。)

在原始语法中,在包含T -> c .T -> c . T的项目集中,移位和缩小都是可能的:转移c并在b之前缩小。通过将b移动到T的生产中,我们将决定推迟到轮班之后:在转移b之后,需要减少;在c之后,减少是不可能的。