3.1 上下无关文法|3.2 语言和文法
本章要点
-
文法和语言的基本知识
-
自上而下的分析方法:预测分析,非递归的预测分析,LL(1)文法
-
自下而上的分析方法:SLR(1)方法,规范LR(1)方法和LALR(1)方法
-
LR方法如何用于二义文法

3.1 上下文无关文法
3.1.1 上下文无关文法的定义
正规式能定义一些简单的语言,能表示给定结构的固定次数的重复或者没有指定次数的重复
例:a (ba)^5, a (ba)*
正规式不能用于描述配对或嵌套的结构
例1:配对括号串的集合
例2:{wcw | w是a和b的串}
1. 定义

3.1.2 推导
把产生式看成重写规则,把符号串中的非终结符用其产生式右部的串来代替
- 最左推导
- 最右推导(规范推导)
3.1.3 分析树

3.1.4 二义性
两个不同的最左推导

两棵不同的语法树

3.2 语言和文法
3.2.1 正规式和上下文无关文法的比较
3.2.2 分离词法分析器理由
为什么要用正规式定义词法
- 词法规则非常简单,不必用上下文无关文法
- 对于词法记号,正规式描述简洁且易于理解
- 从正规式构造出的词法分析器效率高
从软件工程角度看,词法分析和语法分析的分离有如下好处:
- 简化设计(划分模块)
- 编译器的效率会改进
- 编译器的可移植性加强(相关修改限制在词法分析器中)
- 便于编译器前端的模块划分
能否把词法分析并入到语法分析中,直接从字符流进行语法分析
- 若把词法分析和语法分析合在一起,则必须将语言的注解和空白的规则反映在文法中,文法将大大复杂
- 注解和空白由自己来处理的分析器,比注解和空格已由词法分析器删除的分析器要复杂得多
3.2.4 适当的表达式文法
用一种层次观点看待表达式

文法

3.2.5 消除二义性
stmt → if expr then stmt
| if expr then stmt else stmt
| other
句型:if expr then if expr then stmt else stmt
两个最左推导:
stmt → if expr then stmt
| if expr then if expr then stmt else stmt
stmt → if expr then stmt else stmt
→ if expr then if expr then stmt else stmt
无二义的文法
stmt → matched _stmt
| unmatched_stmt
matched_stmt → if expr then matched_stmt
else matched_stmt
| other
unmatched_stmt → if expr then stmt
| if expr then matched_stmt
else unmatched_stmt
3.2.6 消除左递归


3.2.7 提左因子


3.2.9 形式语言鸟瞰

短语文法、上下文有关文法、上下文无关文法、正规文法

浙公网安备 33010602011771号