什么是编译器设计中带有回溯的自顶向下解析?
在使用回溯的自顶向下解析中,解析器将尝试多个规则或产生式,通过在推导的每一步回溯来识别输入字符串的匹配。因此,如果应用的产生式没有根据需要给出输入字符串,或者它与所需的字符串不匹配,那么它可以撤消该转变。
Example1 - 考虑语法
S → a A d
A → bc | b
为字符串 a bd 制作解析树。Also, show parse Tree when Backtracking is required when the wrong alternative is chosen.
解决方案
字符串abd 的推导将是 -
S ⇒ a A d ⇒ abd (必填字符串)
如果用bc代替非终结符 A,则获得的字符串将是 abcd。
S ⇒ a A d ⇒ abcd(错误选择)
图(a)代表S→aAd
图 (b) 表示具有产生式 A → bc 的树的扩展,它给出了与字符串 abd 不匹配的字符串 abcd。因此,它回溯并选择另一个替代方案,即图(c)中与abd匹配的A→b。
回溯算法
Example2 - 为以下语法编写一个带有回溯的自上而下解析的算法。
S → a A d
A → bc| b
解决方案
在下面的算法中,每个非终结符 S & A 都有一个过程。语法中的终结符号 a、b、c、d 是 Parser 读取的输入符号或前瞻符号。
advance( )− 用于将输入指针移动到下一个输入符号的函数。
回溯自顶向下解析的局限性
以下是一些问题,这些问题发生在使用回溯的自顶向下解析中。
回溯- 回溯看起来非常简单且易于实现,但选择不同的替代方案会导致很多问题,如下所示 -
撤消语义操作需要大量开销。
在解析期间在符号表中创建的条目必须在回溯时删除。
由于这些原因,实际编译器不使用回溯。
Left Recursion - 如果语法产生形式,则它是左递归的。
A → Aα|β
这导致解析器进入无限循环。
选择正确的生产- 测试替代品的顺序可以改变接受的语言。
难以定位错误- 发生故障时,很难知道错误发生在哪里。
以上是 什么是编译器设计中带有回溯的自顶向下解析? 的全部内容, 来源链接: utcz.com/z/363358.html