编译原理 文法分类

一. 文法公式

文法定义公式如下:

G = (VT , VN , P , S)
  1. VT : 终结符集合

终结符就是不可以再推导的字符。
也就是说对于一个字符 a ,它属于终结符集合 VT(a∈VT) , a 不可以再推导的字符,即不能用其他字符表示 a。表现形式就是 a 不能单独出现在产生式左边。

  1. VN : 非终结符集合

非终结符即可以继续推导的字符。

  1. P : 产生式集合

产生式就是推导公式,表示这个文法的定义规则。
产生式形式 α→β ,其中 αβ 都是属于文法符合串 (VN∪VT)* 。α 称为产生式的左部或者头部;β 称为产生式的右部或者体。
文法符合串,即终结符集合和非终结符集合任一排列组合成的字符串。例如 aAbbB , 其中 (a,b∈VT , A,B∈VN) 就是一个文法符合串。

  1. S : 开始符号

即文法从这个符号 S 利用产生集合 P 开始推导。S 是一个非终结符,即 S∈VN。
一般情况下,第一个产生式左部符号就是开始符号。

二. 文法分类

Chomsky 文法分类将文法分为四种,0型文法(PSG)、1型文法(CSG)、2型文法(CFG)和3型文法(RG)。

其实不同的文法就是对产生式进行逐层限制形成的。

2.1 0型文法(PSG)

又被称为无限制文法(Unrestricted Grammar), 或者短语结构文法(Phrase Structure Grammar)
定义: 对于产生式 α→βα 至少包含一个非终结符。

即 α,β∈(VN∪VT)* , αβ 都是文法符合串,并且 α 文法符合串中必须包含一个非终结符。
例如: aA→0bB; A0→11bB; 其中 (a,0,b∈VT),(A,B∈VN)。

为什么要叫无限制文法,明明它要求产生式的左部必须包含一个非终结符。

因为我们知道终结符是不能再推导出其他字符的,所以产生式的左部不能全是终结符组成的文法符合串(VT*),这个是不允许的,所以产生式的左部必须包含一个非终结符。

2.2 1型文法(CSG)

又被称为上下文有关文法(Context-Sensitive Grammar)
定义:对于产生式 α→β , |α| <= |β|, 仅仅 S→ε 除外

|α| 表示 α 这个文法符合串中字符个数。例如 aAb 这个字符个数就是3个。

也就是说1型文法要求产生式右部文法符合串β 的字符个数要不小于产生式左部文法符合串α 的字符个数;但是空产生式(S→ε) 除外。

ε 表示空串,即文法符号串中没有任何字符元素(|ε|=0)

为什么叫做上下文有关文法?

因为对于任何一个非终结符 A (即 A∈VN),想要将它替换成其他文法符号串,必须要有对应形式的产生式。

也可以这样理解,上下文有关文法没有规定产生式左边的符合串的长度,如果左边的符合串除了非终结符还有其他的字符(左边的符合串的长度大于1),这时我们要把非终结符前后的其他字符也要转换到右边,他们是需要一起进行转换的,当然非终结符前后的字符只是按照左边的相对位置原样移到了右边

一般情况下,这种产生式的形式为 α1Aα2→α1βα2

其中 α1,α2,β∈(VN∪VT)*, β≠ε,A∈VN。
所以对于非终结符 A, 出现在 α1α2 上下文中,就可以替换成文法符号串β

例如: 对于这个产生式 1A2→112342 ,可以将非终结符 A 替换成文法符号串 1234

2.3 2型文法(CFG)

又被称为上下文无关文法(Context-Free Grammar)
定义:对任一产生式 α→β,都有 α∈VN,β∈(VN∪VT)*

对产生式左部进行了限制,α 就是非终结符集合 VN 中一个字符元素。
当然一个非终结符也是一个特殊的文法符号串,串中只有一个字符,且是一个非终结符。
β∈(VN∪VT)*, β 表示一个文法符号串,其中空串 ε 也是一个特殊文法符号串。
所以对于2型文法也有空产生式 (S→ε)

为什么叫上下文无关文法?

因为对于任何一个非终结符 A (即 A∈VN),可以直接根据产生式替换成一个文法符号串,而不需要特殊的上下文环境。

2.4 3型文法(RG)

又被称为正则文法(Regular Grammar,RG),分为右线性(Right Linear)文法和左线性(Left Linear)文法。

定义: 对任一产生式 α→β,都有 α∈VN,β最多两个字符元素,如果有二个字符必须是(终结符+非终结符)的格式,如果是一个字符,那么必须是终结符。

产生的左部只能是一个非终结符元素。
产生的右部最多两个字符元素 (即 bB,Bb 其中 b∈VT, B∈VN),或者只有一个元素,且必须是终结符(即b, b∈VT)。

根据产生式右部非终结符位置不同,分为右线性文法和左线性文法。

  1. 右线性文法: A→bB 或者 A→b
  2. 左线性文法: A→Bb 或者 A→b

注: 正则文法产生式集合中每个产生式有相同的线性,即所有产生式要么都是右线性文法,要么都是左线性文法。

2.5 小结

可以看出,不同文法就是对产生式进行逐层的限制,所以各个文法是包含关系,即0型文法包含1型文法;1型文法又包含2型文法;2型文法最后包含3型文法。

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《编译》——复习资料,可适用于课程学习资料、期末复习资料、自主学习资料等等,复习资料共218页,内容丰富,干货十足! 主要内容包括: 一、概述 1 1.1 课程介绍 1 1.2 编译过程 3 1.3 高级语言程序简介 11 二、程序语言概论 14 2.1 程序语言的定义 14 2.2 文法的形式化定义和分类 18 2.3 文法和语言 22 2.4 语法分析树 29 三、词法分析_1 33 3.1 词法分析概述 33 3.2 词法分析程序的设计 38 3.3 正规式与自动机 41 3.3.1 正规式与正规集 41 3.3.2 确定有限自动机(DFA) 44 3.3.3 非确定有限自动机(NFA) 49 3.4 单元测试 51 四、词汇分析_2 52 4.1正则式和有限自动机的等价 52 五、词法分析_3 59 5.1 DFA的化简 59 六、词法分析_4 62 6.1 词法分析器的自动生成 62 6.2 词法分析程序实现实例 64 七、语法分析—自上而下分析_1 71 7.1 词法分析简介 71 7.2 自顶向下分析简介 73 7.3 消除左递归和回溯 76 八、语法分析—自上而下分析_2 80 8.1 LL(1)分析法 80 8.2 FIRST集和FOLLOW集的构造 82 8.3 单元测试 85 九、语法分析—自上而下分析_3 86 9.1 LL(1)分析表的构造 86 9.2 递归子程序的原理 89 9.3 单元测试 95 十、语法分析—自下而上分析_1 96 10.1 自下而上分析方法的基本思想 96 10.2 分析树与规范规约 99 10.3 符号栈的使用 103 10.4 单元测试 105 十一、语法分析—自下而上分析_2 106 11.1 算符优先文法 106 11.2 优先表构造 109 11.3 算符优先分析算法 112 10.4 单元测试 115 十二、语法分析—自下而上分析_3 116 12.1 LR分析器 116 12.2 LR分析过程 119 12.3 单元测试 132 十三、语法分析—自下而上分析_4 133 13.1 构造识别前缀的DFA 133 13.2 LR(0)项目集规范族构造 140 13.3 由DFA构造LR(0)分析表 146 13.4 单元测试 150 十六、属性文法和语法翻译制导 151 16.1 L-属性文法和自顶向下翻译 151 16.2 自下而上计算继承属性 159 十七、语义分析和中间代码产生_1 166 17.1 语义分析的任务 166 17.2 中间代码的生成 168 17.3 算术表达式和赋值语句 175 17.4 单元测试 178 十八、语义分析和中间代码产生_2 179 18.1 布尔表达式的作用和文法描述 179 18.2 做控制用布尔表达式的翻译(回填) 181 18.3 控制流语句的翻译 186 18.4 控制流语句的翻译(回填) 189 十九、代码优化_1 194 19.1 什么是代码优化 194 19.2 基本块及流图 199 19.3 单元测试 202 二十、代码优化_2 203 20.1 基本块的DAG表示及其作用 203 二十一、重要知识点 213 1. 考试内容及分数分布 213 2. 名词解释 214 3. 简答题 215 4. 结语 216
实验2 文法的读入、判定和处理 一、实验目的 熟悉文法的结构,了解文法在计算机内的表示方法。 二、实验内容 1、 设计一个表示文法的数据结构; 2、 从文本文件中读入文法,利用定义的数据结构存放文法,并输出; 3、 本实验结果将来还有用。 三、实验要求 1、 了解文法定义的4个部分: G(Vn, Vt, S, P) Vn 文法的非终结符号集合,在实验中用大写的英文字母表示; Vt 文法的终结符号集合,在实验中用小写的英文字母表示; S 开始符号,在实验中是Vn集合中的一个元素; P 产生式,分左部和右部,左部为非终结符号中的一个,右部为终结符号或非终结符号组成的字符串,如S->ab|c 2、 根据文法各个部分的性质,设计一个合理的数据结构用来表示文法, 1) 若使用C语言编写,则文法可以设计成结构体形式,结构体中应包含上述的4部分, 2) 若使用C++语言或java语言编写,则文法可以设计成文法类形式,类中至少含有4个数据成员,分别表示上述4个部分 文法数据结构的具体设计由学生根据自己想法完成,并使用C或C++语言或Java实现设计的数据结构。 3、 利用完成的数据结构完成以下功能: 1) 从文本文件中读入文法文法事先应写入文本文件); 2) 根据文法产生式的结构,分析出文法的4个部分,分别写入定义好的文法数据结构的相应部分; 3) 整理文法的结构,判断该文法文法类型,是否为0型,1型,2型或3型文法,并输出判断结果; 4) 在计算机屏幕或者文本框中输出文法文法输出按照一个非终结符号一行,开始符号引出的产生式写在第一行,同一个非终结符号的候选式用“|”分隔的方式输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值