编译器设计 - 需要帮助以消除 CFG 中的间接左递归



我有以下处理数学和逻辑表达式的语法:

A ==> B A'
A' ==> | B A'
A' ==> epsilon
B ==> C B'
B' ==> ^ C B'
B' ==> epsilon
C ==> D C'
C' ==> & D C'
C' ==> epsilon
D ==> E D'
D' ==> << E D' | >> E D'
D' ==> epsilon
E ==> F E'
E' ==> + F E' | - F E'
E' ==> epsilon
F ==> G F'
F' ==> * G F' | / G F' | % G F'
F' ==> epsilon
G ==> +H | -H | ++H | --H | ~H | !H | &H 
G ==> H
H ==> (A) | A T
T ==> -- | ++ | epsilon
H ==> number

发生以下派生时,会出现此问题:

A ==> B ==> C ==> D ==> E ==> F ==> G ==> H ==> A

并且JavaCC不会编译语法文件,因为间接左递归。

那么应该采取哪些步骤来消除先前语法中的这种间接左递归呢?

因此,在我盯着这个语法大约半小时后,我意识到在特殊情况下:

H ==> A

同样的特例会产生:

A ==> H

所以我改写了语法,使非终端H的第一个生产规则会导致左递归,而第二个生产规则不会导致任何左递归,所以语法是这样的:

H ==> A T
T ==> -- | ++ | epsilon
H ==> (A) | number

如前所述,我们在第一个生产规则中将A替换为H

H ==> H T
H ==> (A) | number
T ==> -- | ++ | epsilon

现在消除左递归是微不足道的,这是最终语法的样子:

H ==> (A)H' | number H'
H' ==> T H' | epsilon
T ==> -- | ++ | epsilon

相关内容

  • 没有找到相关文章

最新更新