如果我有一个语法的作品,既包含左递归又包含左侧的保理

美元

哪个有优先级,左递归或左侧保理?

有帮助吗?

解决方案

诸如左理由或删除左递归之类的转换没有优先规则。显然,由此产生的语法可能有所不同,但它们会认识到相同的语言。

问题的示例语法比典型的本科作业问题更加困难。因此,展示我们的工作将很有用。

左递归

让我们定义一个去除左递归的转换。

给出

$ qquad displayStyle a to a alpha_0 mid a alpha_1 mid dots dots mid a alpha_n arpha_n mid b beta_0 beta_0 mid b beta_1 beta_1 beta_1 mid mid dot

我们这样删除了左递归:

美元alpha_n a_ {t^+}& to a_t a_ {t^+} mid a_t a_t a& to a_h a_h a_ {t^+}

以上的通用性通常不在编译器文本中给出,但是诸如Grune&Jacobs之类的解析文本确实涵盖了这一点。左侧分解可以应用于上述转换的语法,但将只是引入不会改变答案的额外规则。所以我们会的 简化 演示文稿没有额外的左保理。

在此答案中,我们不会涵盖间接的左递归问题,因为我们只关心一个非终端规则。请注意,可以处理间接左递归。 (打开一个单独的问题是否重要。)

剩下的考虑

在大多数介绍性编译器文本中,删除左侧保理。给出

$ qquad displayStyle a to xy mid xz $

左侧分解产量:

美元

现在,这是两种订购中的转换。

首先要考虑

让我们离开问题的语法

美元

然后删除左递归:

美元f_t f_s& to ds mid varepsilon f& to f_h f_h f_ {t^+} mid f_h end f_h end end {align} $

首先删除左记录

对于另一个订购,让我们从问题的语法中删除左递归

美元f& to f_h f_ {t^+} mid f_h end {align} $

然后将终端$ c $的因子留下来:

美元 to f_t f_ {t^+} mid f_t f& to f_h f_h f_ {t^+} mid f_h end f_h end {align} $

啊哈,由此产生的语法是相同的!

通常,证明两个语法是不可决定的。因此,如果一系列语法转换可能会影响 被认可的语言 然后,这将是灾难性的。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top