编译原理【3】语法分析概述

本文详细解析了最左推导的过程及其在自顶向下分析中的应用,通过实例说明了如何选择非终结符进行替换,以及面临的挑战与解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

推导需要完成的两个选择:选择替换当前句型的哪个非终结符,以及用哪个候选式去替换。
在这里插入图片描述


最左推导与最右规约
(由于自顶向下的分析器自左向右扫描串,因此采用最左推导方式)
最左推导:替换每个句型最左端的非终结符
在这里插入图片描述
最右推导与最左规约(规范推导与规范规约)
正好与上面描述的相反。
在这里插入图片描述


最左推导与最右推导的唯一性:
由于最左推导和最右推导总是选择一端的非终结符进行替换,因此最左推导和最右推导的结果都是唯一的。


重点!!
一个最左推导的例子详解
在这里插入图片描述
分析上面的例子,共有五种文法,其中 | 代表或的意思。
以E为开始进行推导,可以将E替换为T和E’:
E => T E’
由于是最左推导,因此我们选择替换当前句型的最左端非终结符T为 F T’:
E => T E’
 => F T’ E’
观察输入串,首个终结符为id,而F对应可以推导出(E)或者id,为了匹配输入,选择将F替换为id,此时id成功匹配,因此输入指针后移到加号+:
E => T E’
 => F T’ E’
 => id T’ E’
此时id为终结符,因此最左端非终结符变成 T’。T’可以推导出* F T’或空值 ε,而可推导出的符号中没有+号,因此当前根节点选择用空值ε 来代替。
E => T E’
 => F T’ E’
 => id T’ E’
 => id ε E’
最左非终结符变为了E’,对应可以推导出+ T E’或者空值ε,由于可推导出的符号中包含+号,因此将E’替换为+ T E’:
E => T E’
 => F T’ E’
 => id T’ E’
 => id ε E’
 => id ε + T E’
以此类推,最终成功匹配。


自顶向下分析面临的问题
由于要尝试当前步骤的推导,当遇到一个语法里多个以终结符A开头的式子均可以匹配A时,便需要挨个尝试哪个式子能完整推导出输出,若不能完整推导,就需要回溯,从而带来了很大的开销。
在这里插入图片描述


预测分析
也就是OJ中常用的的“预判”方法。
比如读取当前字符,判断串是否结束(若是空格则代表读取结束)。
如果不使用预判的方法,读取到一个空格后,需要回退字符串下标指针来结束读取。
如果采用if(curChar[i+1] == ’ ') break;的方法,则不需要进入下次循环,也就不需要回退指针。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值