左递归和左侧保理 - 哪一个首先?
-
16-10-2019 - |
题
如果我有一个语法的作品,既包含左递归又包含左侧的保理
美元
哪个有优先级,左递归或左侧保理?
解决方案
诸如左理由或删除左递归之类的转换没有优先规则。显然,由此产生的语法可能有所不同,但它们会认识到相同的语言。
问题的示例语法比典型的本科作业问题更加困难。因此,展示我们的工作将很有用。
左递归
让我们定义一个去除左递归的转换。
给出
$ 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} $
啊哈,由此产生的语法是相同的!
通常,证明两个语法是不可决定的。因此,如果一系列语法转换可能会影响 被认可的语言 然后,这将是灾难性的。