推导(Derivation)和归约(Reduction)


在编译原理中,推导(Derivation)和归约(Reduction,有时也称为规约)是两个核心概念,用于描述如何根据形式文法的规则来生成或识别字符串。它们是基于形式语言理论中的上下文无关文法(Context-Free Grammars, CFGs)进行的操作。


推导(Derivation)

推导是从文法的初始符号(通常是起始非终结符)开始,通过反复应用文法的产生式规则,最终生成一个只包含终结符的字符串的过程。每一步推导都涉及将某个非终结符替换为其产生式右侧的内容。

例如,如果有产生式 A -> BC,且当前字符串中包含非终结符 A,那么可以将 A 替换为 BC,从而进行一步推导。

推导通常分为最左推导和最右推导,取决于替换的非终结符在字符串中的位置。最左推导每次替换最左边的非终结符,而最右推导则替换最右边的非终结符。最右推导也称为规范推导(Canonical Derivation),在某些类型的解析算法(如LR解析)中特别重要。


归约(Reduction)

归约是推导的逆过程。它从包含终结符和非终结符的字符串开始,通过反向应用文法的产生式规则,逐步将字符串归约为文法的初始符号。每一步归约都涉及将产生式右侧的内容替换为其左侧的非终结符。

继续上面的例子,如果有产生式 A -> BC 且当前字符串中包含子串 BC,那么可以将 BC 归约为 A,从而进行一步归约。

同样地,归约也分为最左归约和最右归约,取决于被归约的子串在字符串中的位置。最左归约每次归约最左边的可归约子串,而最右归约则归约最右边的子串。最左归约在某些解析算法(如预测解析)中特别重要。


在实际的编译过程中,推导和归约是语法分析器(Parser)工作的基础。语法分析器通常使用推导来生成可能的解析树(Parse Trees),并使用归约来从多个可能的解析中选择一个正确的或最优的解析。这两个过程共同确保了编译器能够正确理解和处理源代码的语法结构。

参考

posted @   guanyubo  阅读(750)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示