这是一个如此简单的话题,我为自己感到尴尬。但是在学期开始之前我正在做一些复习问题,而且我已经意识到我完全不知道这个话题。
假设语法:
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)给出答案,以便我可以检查我是否理解了这个过程。 我非常感谢任何帮助!
答案 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