设计文法
文法能够描述程序设计语言的大部分(不是全部)语法。比如程序中标识符必须先声明后使用,但是这个要求不能通过一个上下文五无关文法来描述。
CRE:词法分析和语法分析为什么不统一使用文法
任何能够使用正则表达式描述的东西都可以使用文法描述。为什么要使用正则表达式来定义一个语言的词法语法?
- 将一个语言的语法结构分为词法和非词法两部分可以很方便地将编译器前端模块化。
- 一个语言的词法规则通常很简单,不需要像文法这样功能强大的表示方法描述这些规则。
- 和文法相比,正则表达式通常提供了更加简洁且易于理解的表示此法单元的方法。
- 根据正则表达式自动构造得到的词法分析器效率高于根据任意文法自动构造得到的分析器。
消除二义性
有时,一个二义性文法可以改写为无二义性的文法。
- 示例:
在if-then-else
语法中通常会出现二义性,消除二义性的规则就是“每个else和最近未匹配的then匹配”。从理论上讲,这个消除二义性规则可以用一个文法直接表示,但是在实践中很少用产生式来表示该规则。
左递归的消除
自顶向下语法分析方法不能处理左递归的文法,因此需要一个转换方法来消除左递归。
详见《编译原理》p135的算法。
提取左公因子
提取左公因子是一种文法转换方法,它可以产生适用于预测分析技术或者自顶向下分析技术的文法。
当不清楚应该在两个A产生式中如何选择时,我们可以通过改写产生式来推后这个决定,等我们读入了足够多的输入获取足够信息后再做出正确选择。
*** CRE的理解 ***
产生式:
expr -> start rest1 | start rest2
转换为:
expr -> start rest`
rest -> rest1 | rest2
实际是一个延后选择的过程
非上下文无关语言的构造
详见《编译原理》p136。
(END)