编译原理之文法和语言

词法分析

语法分析

语义分析和中间代码生成

代码优化

目标代码生成

表格管理和出错处理

以上有待完善,正文请看下方:

文法

引入

用自然语言(汉语)描述文法规则:

1)<句子> -> <主语><谓语>

2)<主语> -> <代词><名词>

3)<代词> -> 你|我|他|她|它

4)<名词> -> 小鱼|课本|麻辣烫|炸鸡排|冰淇淋|小蛋糕

(别问,问就是饿了) 

5)<谓语> -> <动词><直接宾语>

6)<动词> -> 跑|是|吃|推 

7)<直接宾语> -> <代词>|<名词>

这种 "->" 或是 "::=" 意为可推出,读作“定义为”。中间竖线代表或者,即可根据式子需求选择合适产生式。

基础定义

相信大家都有课本,也不再赘述。

字母表,符号串,符号串的长度,符号串的顺序,空串ε,头和固有头,尾和固有尾,符号串的连接,符号串的方幂,符号串集合,符号串集合的乘积,符号串集合的闭包。

巴科斯-诺尔范式(Backus–Naur Form

引入巴科斯-诺尔范式

巴科斯-诺尔范式(也称为巴科斯-瑙尔范式、巴克斯-诺尔范式),即 BNF,是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。广泛地使用于程序设计语言、指令集、通信协议的语法表示中。在各种文献中,还存在巴科斯范式的一些变体,如扩展巴科斯范式(ENBF)或扩充巴科斯范式。

其是用一系列符号和表达式创造字符串生产规则。其主要形式为:<digit>::=0|1|2|3|4|5|6|7|8|9

这也是我们今后比较常用的方式之一。(还没学到,所以我也不知道有没有之二)

通常(是上下文无关)文法由四部分组成,即一个四元组。G=(Vn,Vt,S, P);其中Vn为非终结符,Vt为终结符,S为开始符号,P为规则,即上述巴科斯-诺尔范式。

规则又称重写规则或产生式,生成式。

文法例子

可以简单举个例子:

算术表达式的文法G,考虑含有+、*的算术表达式组成的文法G=( {i , + , * , (,)  } , {E} , E ,P )

其中P:E->E+E|E*E|(E)|i   (这是一种简写形式)

问题:由此文法推出表达式(i*i+i)的生成

答案:E=>(E) =>(E+E) =>(E*E+E) =>(i*E+E) =>(i*i+E) =>(i*i+i)   

为了方便放在同一行了,大家写的时候可以放在不同行。

注意:

要知道 a,b,c等小写字母代表终结符;A,B,C等大写字母代表非终结符;阿拉伯字母如α,通常∈V*(V*=(Vn∪Vt)*)。

(Vn∩Vt)= Ø 。

如果一个文法是递归的,那么它就是无限集。

推导:①正推导 至少推导一次;②推导 可推导0次及以上(符号太难打了不打了)

文法类型

文法的类型由乔姆斯基(Chomsky)对文法施加不同的限制加以定义,由此分为0型,1型,2型,3型。其中0型文法限制最少,描述能力最强。

0型文法又称短语文法。P中每个产生式如α->β,α∈(Vn∪Vt)*,且至少含有一个非终结符,β∈(Vn∪Vt)*。0型文法是递归可枚举的。

1型文法又称上下文有关文法。P中每个产生式α->β,均满足|α|<=|β|,仅S->ε除外。

2型文法又称上下文有关无法。P中每个产生式α->β,α只能是一个非终结符,β∈(Vn∪Vt)*。

3型文法又称正规文法。形式均为A->aA(右线性文法)或A->Aa(左)或A->a。

语言

有了上述文法的定义,我们就可以定义自己的语言啦。

定义

由开始符号经0次或以上推导出的,称为句型;推导出的式子仅含有终结符的称为句子,句子是一种特殊句型。

首先明确语言,文法G所描述的语言是由文法的开始符号推出的所有终极符号,结合上述句子句型定义,重新定义语言:文法描述的语言是该文法一切句子的集合。

文法G的语言简记为L(G)。

文法等价

若文法G1与G2产生的语言相等,即L(G1)=L(G2)时,称文法G1和G2是等价的。

语法树

文法和语言的基本定义都知道了,那就来学习语法树喽。

在文法例子部分我们看到一个小栗子,嗯,这就是推导过程。

语法树形如:

推导过程参考课上所学与文法例子部分

定义

最左推导与最右推导:

对于推导的任意一步,均是对式子最右侧非终结符进行推导称为最右推导,与最右推导相对的是最左规约。最右推导又称规范推导,推出的句型称为右句型或规范句型。最左推导相反。

文法的二义性:如果文法G中的某个句子不只有一棵语法树,则称该句子是二义性的。

                          如果文法含有二义性的句子,则称该文法是二义性的。

也就是说,有两个不同的最左(最右)推导。

如S->SS|ε,当我们将句子SSS拿出来进行推导,那么我们会发现,有两棵不同的语法树,因此它就是二义性的。

句型分析
自顶向下的分析方法

主要问题是选择合适产生式进行推导。即从根(开始符号)出发。若发现不对则回溯上一步。

自底向上的分析方法

主要问题是选择合适规约式子向上规约。

由此引入短语概念。

短语 直接短语 句柄

直接上例子:

(没错还是这个图,报一丝,懒的画新的了)

短语:i,i,i,i*i,i+i*i

简单短语:i,i,i

句柄:最左侧的终结符 即 第一个i;

搜嘎!应该懂了吧。好下一个芝士点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值