字母表: 符号的非空有限集 例: ∑ \sum ∑= a , b , c {a,b,c} a,b,c
符号: 字母表中的元素 例: a , b , c a,b,c a,b,c
符号串: 符号的有穷序列 例: a , a a , a c , a b c , . . a, aa, ac, abc,.. a,aa,ac,abc,..
空符号串:无任何符号的符号串 ( ε ) (ε) (ε)
有字母表 ∑ \sum ∑,定义:
(1)ε是 ∑ \sum ∑上的符号串;
(2)若x是 ∑ \sum ∑上的符号串,且a ∈ \in ∈ ∑ \sum ∑,则 ax 或 xa 是 ∑ \sum ∑上的符号串;
(3)y是 ∑ \sum ∑上的符号串, i f f iff iff (当且仅当)y可由(1)和(2)产生。
从一组语法规则可推出不同的句子,如以上规则还可推出“大象吃象”、“大花生吃象”、“大花生吃花生”等句子,它们 在语法上都正确,但在语义上都不正确。
所谓文法是在形式上对句子结构的定义与描述,而未涉及语义问题。
5. 语法(推导)树:我们用语法(推导)树 来描述一个句子的语法结构。
语法成分:在形式语言中又称“非终结符”
单词符号:在形式语言中又称“终结符号”
文法 G = ( V n , V t , P , Z ) 文法G=(V_n,V_t,P,Z) 文法G=(Vn,Vt,P,Z)
V n :非终结符号集 V_n:非终结符号集 Vn:非终结符号集
V t :终结符号集 V_t:终结符号集 Vt:终结符号集
P :产生式或规则的集合 P:产生式或规则的集合 P:产生式或规则的集合
Z :开始符号(识别符号) Z ∈ V n Z:开始符号(识别符号) Z∈Vn Z:开始符号(识别符号)Z∈Vn
其中, V = V n ∪ V t V=V_n ∪V_t V=Vn∪Vt称为文法的字汇表。
规则: U : : = x U ∈ V n , x ∈ V ∗ 规则:U ::= x \ \ \ \ U ∈V_n, x∈V^* 规则:U::=x U∈Vn,x∈V∗
规则的定义:规则是一个有序对(U, x), 通常写为: U : : = x U ::= x U::=x 或 U → x U → x U→x , ∣ U ∣ = 1 | U| = 1 ∣U∣=1 ∣ x ∣ |x| ∣x∣ >= 0 0 0
文法 G : v = x U y , w = x u y 文法G:v=xUy,w=xuy 文法G:v=xUy,w=xuy
其中 x 、 y ∈ V ∗ , U ∈ V n , u ∈ V ∗ 其中x、y ∈V^*,U∈V_n , u ∈V^* 其中x、y∈V∗,U∈Vn,u∈V∗
若 U : : = u ∈ P ,则 v = > G w 若U ::= u∈P,则v =>^G w 若U::=u∈P,则v=>Gw
若 x = y = ε 有 U : : = u ,则 U = > G u 若x=y=ε \ \ 有U ::= u,则U =>^G u 若x=y=ε 有U::=u,则U=>Gu
文法 G , u 0 , u 1 , u 2 , … … , u n ∈ V + 文法G,u_0, u_1, u_2, ……,u_n∈V^+ 文法G,u0,u1,u2,……,un∈V+
i f v = u 0 = > G u 1 = > G u 2 = > G … … = > G u n = w if \ \ \ v= u_0=>^G u_1=>^G u_2 =>^G…… =>^G u_n=w if v=u0=>Gu1=>Gu2=>G……=>Gun=w
则 v = > G + w 则 v =>_G^+w 则v=>G+w
文法 G ,有 v , w ∈ V + 文法G,有v,w ∈V^+ 文法G,有v,w∈V+
i f v = > G + w , 或 v = w ,则 v = > G ∗ w if v =>_G^+w , 或v=w,则 v =>_G^*w ifv=>G+w,或v=w,则v=>G∗w
有 x U y = = > x u y , 若 y ∈ V t ∗ , 则此推导为规范的,记为 x U y 有xUy ==> xuy, 若 y ∈V_t^* , 则此推导为规范的,记为 xUy 有xUy==>xuy,若y∈Vt∗,则此推导为规范的,记为xUy =|=> x u y xuy xuy
直观意义:规范推导=最右推导
最右推导:若规则右端符号串中有两个以上的非终结符时,先推右边的。
最左推导:若规则右端符号串中有两个以上的非终结符时,先推左边的
若有v = u0 =|=> u1=|=> u2=|=>……=|=> un= w, 则 v v v = ∣ = > + =|=>^+ =∣=>+ w w w
递归规则:规则右部有与左部相同的符号(非终结符)对于 U : : = x U y U::= xUy U::=xUy
递归文法:文法G,存在 U ∈ V n U ∈V_n U∈Vn
i f U = = > + … U … , 则 G 为递归文法; if \ \ U==>^+…U…, 则G为递归文法; if U==>+…U…,则G为递归文法;
i f U = = > U + … , 则 G 为左递归文法; if\ \ U==>U^+…, 则G为左递归文法; if U==>U+…,则G为左递归文法;
i f U = = > + … U , 则 G 为右递归文法。 if\ \ U==>^+…U, 则G为右递归文法。 if U==>+…U,则G为右递归文法。
递归文法的优点:可用有穷条规则,定义无穷语言
左递归文法的缺点:不能用自顶向下的方法来进行语法分析
巴克斯范式(Backus-Naur Form,简称BNF)是一种用于描述上下文无关文法(Context-Free Grammar,简称CFG)的形式化表示方法,具体规则如下:
expr -> expr '+' term | expr '-' term | term
term -> term '*' factor | term '/' factor | factor
factor -> '(' expr ')' | NUMBER
编译主要的目的是: 给定 C 语言程序 x 以及语言规范 G , 求 x ∈ L ( G ) ? 给定C语言程序 x 以及语言规范 G , 求x ∈L(G) ? 给定C语言程序x以及语言规范G,求x∈L(G)?
给定文法 G [ Z ] , w = x u y ∈ V + ,为该文法的句型 给定文法G[Z], w = xuy∈V+,为该文法的句型 给定文法G[Z],w=xuy∈V+,为该文法的句型
若 Z = = > ∗ x U y , 且 U = = > + u , 则 u 是句型 w 相对于 U 的 若 Z ==>^* xUy, 且U ==>^+u, 则u是句型w相对于U的 若Z==>∗xUy,且U==>+u,则u是句型w相对于U的短语;
若 Z = = > ∗ x U y , 且 U = = > u , 则 u 是句型 w 相对于 U 的 若 Z ==>^* xUy, 且U ==>u, 则u是句型w相对于U的 若Z==>∗xUy,且U==>u,则u是句型w相对于U的简单短语。
其中 U ∈ V n , u ∈ V + , x , y ∈ V ∗ 其中U ∈V_n,u ∈V^+,x , y ∈V^* 其中U∈Vn,u∈V+,x,y∈V∗
任一句型的最左简单短语称为该句型的 任一句型的最左简单短语称为该句型的 任一句型的最左简单短语称为该句型的句柄。
直观理解:短语u 是目标句型w的一部分或全部,是推导过程的前面某个句型(xUy)中的某个非终结符(U)所能推出的符号串。
任何句型本身一定是相对于识别符号Z的短语
句子( 句型)结构的图示表示法,它是有向图,由结点和有向边组成。
根结点: 识别符号(非终结符)。
中间结点:非终结符。
叶结点: 终结符或非终结符。
有向边:表示结点间的派生关系。
一般采用自顶向下分析法
给定G[Z],句型w:可建立推导序列, Z = = > G ∗ w Z ==>_G^* w Z==>G∗w
可建立语法树,以Z为树根结点,每步推导生成语法树的一枝,最终可生成句型w的语法树。
自下而上地修剪子树的某些末端结点(短语),直至把整棵树剪掉(留根),每剪一次对应一次归约。
从句型开始,自右向左地逐步进行归约,建立推导序列。
通常我们每次都剪掉当前句型的句柄(最左简单短语)即每次均进行规范归约。即对句型中最左简单短语(句柄) 进行的归约称为 规范归约
若对于一个文法的某一句子(或句型)存在两棵不同的语法树,则该文法是二义性文法,否则是无二义性文法。
无二义性文法的句子只有一棵语法树,尽管推导过程可以不同。(如最左推导,规范推导等)
若一个文法的某句子存在两个不同的规范推导,则该文法是二义性的,否则是无二义性的。
若文法是二义性的,则在编译时就会产生不确定性,遗憾的是在理论上已经证明:文法的二义性是不可判定的,即不可能构造出一个算法,通过有限步骤来判定任一文法是否有二义性。
现在的解决办法是:提出一些限制条件,称为无二义性的充分条件,当文法满足这些条件时,就可以判定文法是无二义性的。
优先级的实现:层次定义:越靠上层,优先级越低;越靠下层,优先级越高
形式语言:用文法和自动机所描述的没有语义的语言。
文法定义:乔姆斯基将所有文法都定义为一个四元组:
文法 G = ( V n , V t , P , Z ) 文法G=(V_n,V_t,P,Z) 文法G=(Vn,Vt,P,Z)
V n :非终结符号集 V_n:非终结符号集 Vn:非终结符号集
V t :终结符号集 V_t:终结符号集 Vt:终结符号集
P :产生式或规则的集合 P:产生式或规则的集合 P:产生式或规则的集合
Z :开始符号(识别符号) Z ∈ V n Z:开始符号(识别符号) Z∈Vn Z:开始符号(识别符号)Z∈Vn
文法和语言分类:0型、1型、2型、3型
这几类文法的差别在于对产生式(语法规则)施加不同的限制。