什么是编译器设计中的自顶向下回溯分析?


在自顶向下回溯分析中,分析器将尝试使用多个规则或产生式来识别输入字符串的匹配项,并在推导的每一步都进行回溯。因此,如果应用的产生式没有得到所需的输入字符串,或者与所需的字符串不匹配,则可以撤消该移位。

示例 1 - 考虑以下语法

S → a A d

A → b c | b

为字符串 a bd 创建语法树。此外,当选择错误的备选方案时,显示需要回溯时的语法树。

解决方案

字符串 abd 的推导将是 -

S ⇒ a A d ⇒ abd(所需字符串)

如果将bc替换为非终结符 A,则获得的字符串将是 abcd。

S ⇒ a A d ⇒ abcd(错误的备选方案)

图 (a) 表示 S → aAd

图 (b) 表示使用产生式 A → bc 扩展树,该产生式生成字符串 abcd,该字符串与字符串 abd 不匹配。因此,它回溯并选择另一个备选方案,即图 (c) 中的 A → b,该方案与 abd 匹配。

回溯算法

示例 2 - 为以下语法的自顶向下回溯分析编写算法。

S → a A d

A → bc| b

解决方案

在以下算法中,每个非终结符 S 和 A 都有一个过程。语法中的终结符 a、b、c、d 是分析器要读取的输入符号或前瞻符号。

advance( ) - 它是一个用于将输入指针移动到下一个输入符号的函数。

自顶向下回溯分析的局限性

以下是自顶向下回溯分析中出现的一些问题。

  • 回溯 - 回溯看起来非常简单易于实现,但选择不同的备选方案会导致很多问题,如下所示 -

    • 撤消语义操作需要大量开销。

    • 在分析期间在符号表中创建的条目必须在回溯时删除。

由于这些原因,回溯不用于实际编译器。

左递归 - 如果语法具有以下形式的产生式,则该语法是左递归的。

A → Aα|β

这会导致分析器进入无限循环。

  • 选择正确的产生式 - 测试备选方案的顺序可以改变接受的语言。

  • 难以定位错误 - 发生故障时,很难知道错误发生在哪里。

更新于: 2021 年 10 月 30 日

8K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告