解决语法中的第一次跟随冲突

时间:2015-05-11 19:45:37

标签: grammar formal-languages ll

我目前在语法中解决这种冲突时遇到了问题:

A -> (A)A'
A -> 0A'
A -> 1A'
A'-> NAND A A'
A'-> eps

问题在于A'是NAND - 以及它的FOLLOW集合的一部分。而且因为A' - > eps规则,这会产生冲突。有没有办法解决这个冲突?替代或因素化不会产生任何结果 - 所以我想我错过了一些东西。

1 个答案:

答案 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