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