问题描述
我很困惑 FirsT SET 可以包含相同的终端两次.. 例如我有语法
E->T+E|T FirsT(E)={a,a}
T->a FirsT(T)={a}
..
这是正确的吗?或者我应该写
FirsT(E)={a}
解决方法
根据定义,集合不能多次包含相同的元素 - 这适用于第一个集合和任何其他集合一样。所以 {a}
是正确的写法。
我猜您正在尝试计算 First 和 Follow 集,以构建最终的预测表,但通常,您需要先解决所有冲突,即:
ε-derivation
Direct Left Recursion
Indirect Left Recursion
Ambiguous prefixes
在您的示例中(或者我猜是其中的一部分),您需要排除模棱两可的前缀,即 T。
E -> T E'
E' -> + E | ε
T -> a
形式上,对于任何具有 A → αβ 形式的推导规则的非终结符 | αγ
1- Remove these 2 derivation rules
2- Create a rule A′ → β | γ
3- Create a rule A → α A′
看看这个Paper about Conflicts,它对我很有帮助,如果你对自顶向下的解析有任何问题,你不妨看看这个slide和this。