Parsing 删除左直接和间接递归

Parsing 删除左直接和间接递归,parsing,compiler-construction,context-free-grammar,left-recursion,Parsing,Compiler Construction,Context Free Grammar,Left Recursion,但间接递归仍然存在于“生产”中 那么,如何消除这个问题,还是我做错了什么 这是编译器原则实践和工具中的问题4.3.1在消除左递归后,在推导解析时,语法规则的每个自上而下应用程序都会消耗至少一个输入符号(或在应用ε规则时删除当前项中的一个非终结符)。这保证了进程的终止。将其与左递归语法进行比较。应用左递归规则(无终止)时,NT的数量不会减少,输入符号也不会消耗。在你的例子中,我认为你的语法没有间接的左递归(例如A->Bx,B->Ay)。 S->(L)|a L->L,S|

但间接递归仍然存在于“生产”中

那么,如何消除这个问题,还是我做错了什么


这是编译器原则实践和工具中的问题4.3.1

在消除左递归后,在推导解析时,语法规则的每个自上而下应用程序都会消耗至少一个输入符号(或在应用ε规则时删除当前项中的一个非终结符)。这保证了进程的终止。将其与左递归语法进行比较。应用左递归规则(无终止)时,NT的数量不会减少,输入符号也不会消耗。在你的例子中,我认为你的语法没有间接的左递归(例如A->Bx,B->Ay)。
    S->(L)|a
    L->L,S|S

    //Step 1

    i=1,j=1

    //do nothing



    //Step 2 

    //Substituting S in L production by productions of S
    i=2,j=1 to 1

    S->(L)|a
    L->L,(L)|(L)|L,a|a

    //removing left recursion

    S->(L)|a

    L->aA'|(L)A'             

    A'->,(L)A'|,aA'|epsilon