Parsing 如何实现左递归消除器?

Parsing 如何实现左递归消除器?,parsing,compiler-construction,topdown,Parsing,Compiler Construction,Topdown,我如何为这个实现一个消除器 A := AB | AC | D | E ; 这是一个所谓的立即左递归示例,如下所示: A := DA' | EA' ; A' := ε | BA' | CA' ; 基本思想是首先注意,在解析A时,必须从D或E开始。在D或E之后,您将结束(尾部为ε)或继续(如果我们处于AB或AC构造中) 实际算法的工作原理如下: A := DA' | EA' ; A' := ε |

我如何为这个实现一个消除器

 A := AB |
      AC |
      D  |
      E  ;

这是一个所谓的立即左递归示例,如下所示:

A := DA' |
     EA' ;

A' := ε   |
      BA' |
      CA' ;
基本思想是首先注意,在解析
A
时,必须从
D
E
开始。在
D
E
之后,您将结束(尾部为ε)或继续(如果我们处于
AB
AC
构造中)

实际算法的工作原理如下:

A := DA' |
     EA' ;

A' := ε   |
      BA' |
      CA' ;
对于任何像这样的左递归生成:
A->a1 |…|一个ak | b1 | b2 | | | | | | | | | | | | | |bm
A->b1 A'| b2 A'|…|替换生产bm A'
并添加生产量
A'->ε| a1 A'|…|ak A'


有关消除算法(包括间接左递归的消除)的更多信息,请参阅。

这是一个所谓立即左递归的示例,如下所示:

A := DA' |
     EA' ;

A' := ε   |
      BA' |
      CA' ;
基本思想是首先注意,在解析
A
时,必须从
D
E
开始。在
D
E
之后,您将结束(尾部为ε)或继续(如果我们处于
AB
AC
构造中)

实际算法的工作原理如下:

A := DA' |
     EA' ;

A' := ε   |
      BA' |
      CA' ;
对于任何像这样的左递归生成:
A->a1 |…|一个ak | b1 | b2 | | | | | | | | | | | | | |bm
A->b1 A'| b2 A'|…|替换生产bm A'
并添加生产量
A'->ε| a1 A'|…|ak A'


有关消除算法(包括消除间接左递归)的更多信息,请参阅。

另一种可用形式是:

A := (D | E) (B | C)*

这样做的机制大致相同,但一些解析器可能会更好地处理该表单。也要考虑采取行动规则和语法本身的需要;另一个表单需要factoring工具为
a'
规则生成一个新类型,以返回此表单没有返回的位置。

另一个可用表单是:

A := (D | E) (B | C)*

这样做的机制大致相同,但一些解析器可能会更好地处理该表单。也要考虑采取行动规则和语法本身的需要;另一种形式需要分解工具为
a'
规则生成一个新类型,以返回此形式没有返回的位置。

嗨,Mahdi,我是新手,我很感兴趣,你在尝试什么?你能解释一下我正在尝试构建一个解析器吗?它会接受语法并检查是否存在左递归或左分解。如果是这样,则尝试消除它们,以便它可以使用ll(1)语法。整个过程是关于将ll(k)语法转换为ll(1)语法。ll(k)语法不能包含左递归,因为ll(k)解析器中的左递归规则将以与ll(1)完全相同的方式将其发送到无限递归调用中。此外,ll(k)比ll(1)更强大,因此您无法将任何ll(k)转换为ll(1)。嗨,Mahdi,我是新来的,对您尝试的内容感兴趣。您能解释一下我正在尝试构建一个解析器吗?该解析器将使用语法并检查是否存在左递归或左因子分解。如果是这样,则尝试消除它们,以便它可以使用ll(1)语法。整个过程是关于将ll(k)语法转换为ll(1)语法。ll(k)语法不能包含左递归,因为ll(k)解析器中的左递归规则将以与ll(1)完全相同的方式将其发送到无限递归调用中。此外,ll(k)比ll(1)更强大,因此无法将任何ll(k)转换为ll(1)。