编译原理|文法与语言

作者注:

这是一篇大学生写的编译原理系列,文章并非提供令人望而却步的长篇论述,意在用简单有趣的方式分享我所学到的Knowledge。至于你所感兴趣的深层论述这里尽可能会给你提供一些简单的连接供你使用。

这里我要十分感谢我的周老师,我的编译原理知识,她无疑是最大的贡献者。

目录

正文

一、文法和语言

1.1、如何理解文法?

文法是什么?编译原理是针对语言的一门学科,语言的背后人们人为的凝练出的结构叫语法。对于一个英语句子来说,当你掌握英语语法,知道单词意思,你就可以理解这个句子。语法比较容易理解,就是语言句子的规则。同理文法的解释就是:描述语言的语法结构的形式规则(即语法规则)。用我老师的话来说:解决语言的有穷说明问题,包含对语法的描述,但却不表达任何语义。

1.2、文法的使用


先介绍一个例子:
题目1:证明(i*i+i)是文法G[E]: E -> i | E+E | E*E | (E) 的一个句子。
证明:

E => (E) => (E+E)=> (E*E+E)=> (i*E+E)=> (i*i+E) =>(i*i+i)

仔细观察就不难发现,下面的推到式所用的规则就是 E -> i | E+E | E*E(E)
这一部分,这一部分可以解读为,E可以推导出 i 或 E+E 或 E*E 或 (E) 。

下面来自行推导一下下面这个例子:
题目2:证明句子i*(i+i)是文法G:E -> E+E | E*E | (E) | i 的一个句子。
答案:E=>…

文法的形式是一个四元式,开始符号、生产式、非终结符、终结符;简单认识就是,G[E]: E -> i | E+E | E*E | (E) 叫做文法,(i*i+i)叫做句子通常用多个小写字母+运算符表示,像i这样的小写字母还叫终结符号,那非终结符就是并非作为句子的符号了。E为开始符通常用一个大写字母表示,开始符推导到(i*i+i)句子中间的(E) , (E+E) , (E*E+E) , (i*E+E) , (i*i+E) 叫做句型,文法G产生的所有句子的全体式一个语言。像 E->i 这样文法中推导用的式子就叫生产式。注意=>变换过程只能变换一步。

细心的你可能会注意到题目2的推导方法有两个。分类来说,推导方式一就是最左推导,推导方式二就是最右推导,区别很简单,最左推导就是从左边开始靠近推导目标句子,右推导同理。

1.3、文法分类

Chomsky于1956年建立形式语言体系,他把文法分成四种类型:0,1,2,3型。

0型(又叫短语文法):
产生式形如: $ -> ¥
其中:$且至少含有一个非终结符(确保能推导)

1型(上下文有关文法):
产生式形如:A -> ¥
其中:|$| <= |¥|,限制长度

2型(上下文无关文法):
产生式形如:A -> ¥
其中:A全是非终结符,限制左边A全是非终结符

3型(正规文法):
产生式形如: A -> ¥B
其中: ¥全是终结符;A,B全是非终结符
产生式形如: A -> B¥
其中: ¥全是终结符;A,B全是非终结符
0到3型,逐渐增加限制,因此确定的语言依次缩小,就如同下面的图形一样,外面的文法可与表示里面的文法所描述的语言。
在这里插入图片描述

二、语法树与二义性

2.1、语法树

使用语法树目的是为了理解句子的语法,得到句子如何从开始符号推导得到,因此引入“图”。
在这里插入图片描述
注意:一棵语法树是不同推导过程的共性抽象

2.2、二义性

我们要了解,二义性是用来修饰文法的,如果一个文法存在一个具有两颗或两棵以上语法树的句子,那我们就称该文法为二义性文法。二义性的本质简单来说就是不唯一性,只不过用在了描述文法上就称为二义性。
二义性对计算机这个之直子,极为不友好。所以我们要消除二义性。

在这里向大家推荐一些法则:
如果文法G是无二义的,则对于它的任意句子α最左推导和最右推导对应的语法树必定相同。


答案:返回题目
句子i*(i+i)推导过程如下:
① E => E*E => i*E => i*(E) => i*(E+E) => i*(i+E)
=> i*(i+i)
② E => E*E => E*(E) => E*(E+E) => E*(E+i) => E*(i+i)
=> i*(i+i)

作者:德志
在这里插入图片描述
感谢你的关注,希望你能够喜欢我所整理的文章。作者能力有限,如有问题,欢迎在文章底部评论处留下任何问题或者建议。

发布了19 篇原创文章 · 获赞 14 · 访问量 933

猜你喜欢

转载自blog.csdn.net/Red_Master/article/details/104692315