我目前在语法中解决这种冲突时遇到了问题:
A -> (A)A'
A -> 0A'
A -> 1A'
A'-> NAND A A'
A'-> eps
问题在于A'是NAND - 以及它的FOLLOW集合的一部分。而且因为A' - > eps规则,这会产生冲突。有没有办法解决这个冲突?替代或因素化不会产生任何结果 - 所以我想我错过了一些东西。
答案 0 :(得分:2)
问题是你的语法含糊不清。例如,0 NAND 0 NAND 0
至少有两个最左边的派生词:
A => 0 A' => 0 NAND A A' => 0 NAND 0 A' A' => 0 NAND 0 NAND A A' A' =>
=> 0 NAND 0 NAND 0 A' A' A' =>* 0 NAND 0 NAND 0
A => 0 A' => 0 NAND A A' => 0 NAND 0 A' A' => 0 NAND 0 A' =>
=> 0 NAND 0 NAND A A' => 0 NAND 0 NAND 0 A' A' =>* 0 NAND 0 NAND 0
使用ELL语法重写它更容易(对我而言)看到有两种可能的递归,NAND A
中的A或者星号(原始语法中的A')
A -> ( '(' A ')' | 0 | 1 ) ( NAND A )*
你可以解决模糊性问题,使得明星成为添加NAND的唯一选择,并使用'(' A ')' | 0 | 1
作为其操作数:
A -> X ( NAND X )*
X -> '(' A ')' | 0 | 1