编译原理 第二章 形式语言基础
形式语言是符号串集合
Q:什么是形式语言 , 字母表 , 符号串 ?
形式语言是句子的集合 , 一种语言用\(L\)表示
字母表是句子的所有可能元素
符号串是字母表中元素的有限序列
形式语言可以理解为一种语言 , 只要符合一定规则的句子(比如主谓宾)都是这种语言的组成部分
Q:什么是规则 , 符号串集合 , 句型 ?
符号串集合即符号串的集合(废话)
规则显然 , 举个例子 "我是人" , "她是老师" , 都满足主谓宾的规则
句型是表示一类句子的方式 , 如\(b^n\)表示\(\varepsilon , b , bb , bbb......\)
符号串的运算
Q:哪些运算 ?
符号串运算 : 连接 , |(或) , \(a^n\) , 闭包\(a^+\)与\(a^*\)
符号串集合运算 : \(+\) ,笛卡尔积 , \(A^n\) , 闭包(基本同上)
集合的\(0\)次幂为\({\varepsilon}\) , 空串
符号串集合的文法描述
Q:什么是文法 ?
通过文法可以实现对特定规则符号串的筛选 , 进而表达语言\(L\)
形式语言由文法定义的
什么是上下文无关文法
Q :什么是上下文无关文法 ?
一个左部推出右部 , 表示为\((V_N,V_T,S,P)\) , 这个挺简单不展开讲
文法如何定义语言
Q :如何用文法定义语言 ?
\(L(G) = {x | S \leftarrow x \in V^*}\)
即 , G(S)为文法 , S为初始符 , L(G)为通过S能推导出的属于字典序闭包的所有句子的集合
Q : 如何写一个识别标识符的文法 ?
\(S \leftarrow lA | l\) , $A \leftarrow lA | dA | \varepsilon $
类似也可以写出识别整数 , 识别小数 , 识别科学技术法等
Q : 如何写一个识别简单算术表达式的文法 ?
我们考虑一个算术表达式类\(E\) , 必然是由\(E +-*/ E\)或者\((E)\)组成的
为了区分运算级别 , 考虑将\(+-\)作为一类 , \(*/\)作为第二类
即
\(
E \leftarrow E w_1 E \quad
E \leftarrow E w_2 E \quad
E \leftarrow (E) \quad
E \leftarrow T \quad
T \leftarrow 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 \quad
\)
当然 , 这里其实有些问题 , 比如二义性等 , 但是现在先不考虑
主要语法成分的定义
文法的运算问题
文法有两种基本运算 : 推导 , 规约
直接推导 , 加推导 , 星推导等略
句型 , 句子和语法树
Q : 重新回答 , 句型 , 句子是什么 ?
句型即\(S\)加推导得到的式子 , 语法树上所有叶子节点的连接
句子是句型的子集 , 满足所有元素都为终极符
Q : 什么是语法树 ? 简单子树是什么 ?
句型(句子)产生过程的一种树结构表示
树根为\(S\)开始符号 , 树叶为给定句型(句子)
简单子树 : 指仅具有单层分支的子树 , 就是只有两层
Q : 什么是短语 , 简单短语 , 句柄 ?
短语为任意子树的所有叶子的连接 ;
简单短语为简单子树的所有叶子的连接 ;
句柄为最左侧的简短短语
两种特性文法
递归文法
Q:什么是递归文法 ?
有 \(A \leftarrow xAy\) , 则称文法具有递归性
特别 , 有直接左递归和直接右递归
二义性文法
即同一种句型有多种语法树 , 就会存在二义性
文法的等价变换
文法的等价性
Q : 如何判断两个文法是相同的 ?
如果两个文法 G1 和 G2 产生的语言一样 , 即\(L(G1) = L(G2)\) , 那么就是等价
文法变换方法1
Q : 如何让文法更加简洁 ?
删除无用产生式 , 删除\(\varepsilon\)表达式 , 文法变化
Q : 如何进行文法的化简 ?
自定己 , 不终结 , 不可用 del
第一个很简单不说了
第二个为从后往前推 , 第三个为从前往后推
文法变换方法2
Q : 三种变换方法 ?
- 必选项法 : \(A \leftarrow a (x|y)\)
- 可选项法 : \(A \leftarrow x[y]\)
- 重复可选项法 : \(A \leftarrow x{y}\)
形式语言的分类
Q : 形式语言可以分成什么 ?
- 0型语言由0型文法定义 , 无限制文法
- 1型语言由1型文法定义 , 上下文有关文法 , 左侧只能一个非终极符
3.同 , 上下文无关文法 , 左侧只有一个非终极符
4.同 , 正规文法 , 右侧只有一个非终极符