在我的语法中解决左递归
Resolving left-recursion in my grammar
我的语法在第六产生式规则中有一个左递归的情况。
我通过像这样替换规则 6 和 7 解决了这个问题:
我在这个语法中找不到任何间接左递归。
唯一让我困扰的是最终的生产规则,它有一个终端被两个非终端包围。
我的两个问题是:
- 我解决的左递归是否正确?
- 最后的产生式规则是左递归吗?我不知道该怎么做
对待这种特殊情况。
是的,你的分辨率是正确的。您可能想要删除 epsilon 规则以便于使用,但接受的字符串是正确的。
X -> -
X -> -Z
Z -> +
Z -> +Z
Z -> X + Y
... and Y is of the form 0* 1 (no syntax collisions)
作为检查,请注意您现在可以用两个新规则替换这个最终规则,一个用于 X:
的每个扩展
Z -> - + Y
Z -> -Z + Y
这将从 Z 规则中完全删除 X,然后每个 Z 规则都将以终结符开头。
不,你的最终产生式规则不再是左递归的。 X 现在必须解析为以非终结符开头的字符串。
不过,我不得不承认,我很好奇这种语言的用途。 :-)
我的语法在第六产生式规则中有一个左递归的情况。
我通过像这样替换规则 6 和 7 解决了这个问题:
我在这个语法中找不到任何间接左递归。
唯一让我困扰的是最终的生产规则,它有一个终端被两个非终端包围。
我的两个问题是:
- 我解决的左递归是否正确?
- 最后的产生式规则是左递归吗?我不知道该怎么做 对待这种特殊情况。
是的,你的分辨率是正确的。您可能想要删除 epsilon 规则以便于使用,但接受的字符串是正确的。
X -> -
X -> -Z
Z -> +
Z -> +Z
Z -> X + Y
... and Y is of the form 0* 1 (no syntax collisions)
作为检查,请注意您现在可以用两个新规则替换这个最终规则,一个用于 X:
的每个扩展Z -> - + Y
Z -> -Z + Y
这将从 Z 规则中完全删除 X,然后每个 Z 规则都将以终结符开头。
不,你的最终产生式规则不再是左递归的。 X 现在必须解析为以非终结符开头的字符串。
不过,我不得不承认,我很好奇这种语言的用途。 :-)