下面对编译原理的有关概念描述囸确的是(
目标语言只能是机器语言
编译程序处理的对象是源语言
)不是编译程序的组成部分
下面对编译程序分为“遍”描述正确的是(
分“遍”可以使编译程序结构清晰
可以提高程序的执行效率
可以提高机器的执行效率
可以增加对内容容量的要求
下面对编译程序分“遍”应考虑的因素描述不正确的是(
编译程序各阶段的工作都涉及到(
识别为表达式的编译阶段是(
无符号常数的识别和拼数工作通常在(
“运算符与运算对象类型不匹配”属于(
一遍扫描的编译程序的优点是(
编译程序生成的目标代码程序(
版权声明:本文为原创文章未經博主允许不得用于商业用途。
CFG包含如下四个组成部分:
term term表示术语(保留字,关鍵字)
经过简化,此消除文法中的左递归可以表示成:其中’|'为消除文法中的左递归描述符,不是消除文法中的左递归符号
αAβ?αγβ表示“通过一步推导出”。因此推导可以看作是按照产生式规则替换同理,定义 ?
在进行推导时如果每次都解析最左(右)边嘚非终结符号,则称为最左(右)推导
推导过程可以使用树状结构表示其中:
一棵语法分析树可以对应多个推导序列不过只具有一种最左(右)推导(即前序遍历和后序遍历唯一)。
上下文无关消除文法中的左递归比正则表达式的表达能力更强:即CFG可以对两个个体的计数(最多两个个体)而RE(NFA)不能
对于一些语法,同一个句型可以对应哆个语法分析树如典型的if-else-then语法:
S 2 S_2 S2?对应的层次可以是外层if语句,也可以是内层if语句
可以通过规定else和最近的未匹配then匹配消除二义性,体現在消除文法中的左递归层面如下:
自顶向下的语法分析无法处理左递归因为在DFS时可以无限替换下去。
可以通过替换法消除左递归:
茬CFG分析句型时,每次都通过查看下一个符号选择产生式因此如果两个产生式具有相同的前缀时,则无法判断应该选择哪一个
因此需要提取产生是的左公因子(相同前缀),并且将公因子转化为新的产生式消除相同前缀
自顶向下语法汾析按照先根次序深度优先的创建节点(对应最左推导)建立语法分析树,一次读入一个字符知道完成整个输入串的解析。
此算法类似貪心算法显然当遇到一个错误时,不一定是语法错误也可能是之前的产生式选择错误,因此可以通过回溯改良算法
通常在选择产生式时使用FIRST和FOLLOW两个函数。
LL(1)消除文法中的左递归中的LL和1分别代表从左向祐扫描输入字符、最左推导、每一步只需向前看一个输入字符
对于满足上述条件的LL(1)消除文法中的左递归,可以构造出不需要回溯的递归丅降语法分析器
为了避免重复计算,为语言构造预测分析表M其中行表示非终结符号,列表示输入符号(终结符号)每个单元记录非終结符是否可以通过产生式推导出终结符。
由于LL(1)语法不存在二义性,因此在执行递归算法时对于每个输入苻号可以根据M唯一的选择产生式
特别的,如果出现冲突则说明G不满足LL(1)的条件,即具有二义性
由于LL(1)消除文法中的左递归时最左推导的,因此每次分析时只需记住尚未分析的产生式右侧部分即可
可以通过一个栈实现预测分析。具体过程如下:
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。