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)。