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

推导需要完成的两个选择:选择替换当前句型的哪个非终结符,以及用哪个候选式去替换。
编译原理【3】语法分析概述_第1张图片


最左推导与最右规约
(由于自顶向下的分析器自左向右扫描串,因此采用最左推导方式)
最左推导:替换每个句型最左端的非终结符
编译原理【3】语法分析概述_第2张图片
最右推导与最左规约(规范推导与规范规约)
正好与上面描述的相反。
编译原理【3】语法分析概述_第3张图片


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


重点!!
一个最左推导的例子详解
编译原理【3】语法分析概述_第4张图片
分析上面的例子,共有五种文法,其中 | 代表或的意思。
以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时,便需要挨个尝试哪个式子能完整推导出输出,若不能完整推导,就需要回溯,从而带来了很大的开销。
编译原理【3】语法分析概述_第5张图片


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

你可能感兴趣的:(编译原理)