左派生和右派生用于以下语法

时间:2013-08-31 16:36:46

标签: c parsing compiler-construction

这是一个如此简单的话题,我为自己感到尴尬。但是在学期开始之前我正在做一些复习问题,而且我已经意识到我完全不知道这个话题。

假设语法:

int = int digit | digit
digit = 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19

写出左派生和右派生:

15 14 13 12

我知道它应该看起来像:

int => int digit
=> int digit digit
=> int digit digit digit
=> digit digit digit digit

......但后来我不知道该怎么做(或者即使那么多是正确的),也不知道如何在另一个方向上做到这一点!

如果有人能向我解释a)将来如何做到这一点会很好,并且b)给出答案,以便我可以检查我是否理解了这个过程。 我非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

在这种情况下,最左边和最右边的派生是相同的,如你所示。

最左边的推导首先展开最左边的非终结符号;最右边的派生首先扩展最右边的非终结。

Wikipedia has good examples.语法

S → S + S
S → 1
S → a

这是最左边的推导:

S → S + S
  → 1 + S
  → 1 + S + S
  → 1 + 1 + S
  → 1 + 1 + a

这是最正确的推导:

S → S + S
  → S + a
  → S + S + a
  → S + 1 + a
  → 1 + 1 + a