词法分析
语法分析
语义分析和中间代码生成
代码优化
目标代码生成
表格管理和出错处理
以上有待完善,正文请看下方:
文法
引入
用自然语言(汉语)描述文法规则:
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;
搜嘎!应该懂了吧。好下一个芝士点。