翻译程序:它是一个程序,能把一种语言程序转换成另外一种语言程序,且二者在逻辑上是等价的。这两种语言分别称为源语言和目标语言。
编译程序:一种翻译程序,它的源语言是“高级语言”(C,Java,Pascal),目标语言是“低级语言”(汇编语言,机器语言)。
编译前端:与源语言有关,与目标机无关;编译后端:与源语言无关,与目标机有关。
任何语言程序都可以看成是一定字符集(称为字母表)上的一字符串(有限序列)。主要由语法和语义两个方面定义。
(1)词法规则:单词符号的形成规则。也就是规定了字母表组成的那些字符串是一个单词符号。
【注】:单词符号:常数、标识符、基本字、算符和界符(正规式和有限自动机理论)
(2)语法规则:是语法单位的形成规则。也就是规定了如何从单词符号形成更大的语法单位。
【注】:语法单位:表达式、语句、分程序、函数、过程和程序(上下文无关文法)
2.1.2语义
语义:可以定义程序意义的规则。这些规则称为语义规则。
1、强制性语言,也称过程式语言,命令驱动,面向语句。如FORTRAN、C、Pascal、Ada
2、应用式语言,从已有的函数出发构造出更复杂的函数。如LISP和ML。
3、基于规则的语言,检查一定的条件,当它满足值,则执行适当的动作。如Prolog。
4、面向对象语言,主要特性是支持封装性、继承性和多态性。如Java, C++
4.1语法分析器的功能
语法的语法结构用上下文无关文法描述;
语法分析器是按文法的产生式,识别输入的符号串是否为一个句子;
文法的句子:看是否从文法开始符号推导出该串,或根据该文法可以建立一颗与该串匹配的语法分析树。
语法分析方法有两种:自上而下分析法和自下而上分析法;
4.2自上而下分析面临的问题
主旨:对一个输入串,从文法的开始符号(树根)出发,采用一切可能的办法,从上而下的为输入串建立一颗语法树;
本质上:试探性的过程
左递归: 分为直接左递归和间接左递归, 即文法存在非终结符 P,使得 P => Pα。左递归会使自上而下分析无限循环
回溯:浪费分析时间,不成功时难于知道出错位置
解决办法:取消左递归和取消回溯
4.3.1左递归的消除
一般定义:
P -> Pα1|Pα2|…|Pαm |β1 |β2|…|βn,其中每个α均不等于ε,每个β不以P开头,则:P ->β1P’|β2P’|…|βnP’
P’->α1P’|α2P’|…|αmP’|ε
例如:S->Sc|Sabc|abc|bc|c取消左递归,S->abcS'|bcS'|cS',S'->cS'|abcS'|ε
消除文法中一切左递归的方法:
步骤:①将文法中所有非终结符按某一顺序排列P1、P2…Pn
②变为直接左递归(即,对于Pi,若存在Pj,j < i,且有产生式Pi->Pjr, Pj->δ1|δ2 |…|δk,则改写Pi的产生式为Pi- >δ1r|δ2r|…|δkr),再消除直接左递归
③化简② 所得的产生式,即从开始符号出发永远无法到达的非终结符的产生规则。
4.3.2 消除回溯,提公因子
消除回溯须保证:(1) 对文法的非终结符匹配输入串时,能根据所面临的输入符号准确地指派一个候选产生式。
(2) 若候选获得成功匹配,则这种匹配不会是虚假的;若此候选无法完成任务,则其他候选也肯定无法完 成。
引入文法有关的函数: FIRST (α)={a | α => a…, a属于 VT} ,即α的所有可能推导的开头终结符
FIRST集合计算方法:
(1) 若X->a.., 则将终结符 a 加入FIRST(X)中
(2) 若X->ε,则将 加入FIRST(X)中
(3) 若X->Y…,且Y属于非终结符,则将 FIRST(Y)\{}加入到FIRST(X)中
(4) 若X->Y1Y2..YK,且Y1,Y2,..Yi-1都是非终结符,且Y1,Y2,..Yi-1的FIRST集合中均包含ε,则将FIRST(Yj) ,( j=1,2,..i) 的所有非元素加入到FIRST(X)中.特别地,若Y1~YK均有ε产生式,则将ε加到FIRST(X)中。
提取公因子:有左因子的文法 A ->αβ1 | αβ2 等价于A->α(β1|β2) 提左因子:A->αA' A'->β1|β2
4.3.3LL(1)分析条件
一个文法:不含左递归,每个非终结符的所有候选首符集两两不相交
引入文法有关的函数:S为文法G开始符号,对于非终结符A
FOLLOW(A)={ a |S ...Aa...,a VT , A VN },特别的,若S ...A,则# FOLLOW(A)
即句型中紧接A之后的终结符或#
FOLLOW集合计算方法
(1)对文法开始符号S, 置#于FOLLOW(S)中
(2)若有AB,则将FIRST() \{}加入FOLLOW(B)中。 (此处 可以为空)
(3) 若A B 或A B ,且 * (即 属于FIRST()),则将 FOLLOW(A)加入FOLLOW(B)中(此处 可以为 空)。