我将如何消除此 CFG 中的左递归?
<RE> -> <RE>'|'<CONCAT> | <CONCAT>
<CONCAT> -> <CONCAT><KLEEN> | <KLEEN>
<KLEEN> -> <KLEEN>'*' | <ELEM>
<ELEM> -> 'a' | 'b' | 'c' | 'd' | '('<RE>')'
我想出了这个:
<RE> -> <CONCAT><re>
<re> -> '|'<CONCAT><re> | (e)
<CONCAT> -> <KLEEN><concat>
<concat> -> <KLEEN><concat> | (e)
<KLEEN> -> <ELEM><kleen>
<kleen> -> '*'<kleen> | (e)
<ELEM> -> 'a' | 'b' | 'c' | 'd' | '('<RE>')'
但似乎,当我尝试将其实现为递归下降解析器并解析诸如“ab”之类的简单字符串时,我得到了由concat
生产引起的无限循环。
我是否错误地消除了左递归?