编译原理 [0x01][0x00] ==(2.1) 高级语言及其语法描述

高级语言及其语法描述

 

文法: 描述语言的语法结构的形式规则

语法描述的几个基本概念(1)

  • 字母表字符集,记为∑
  • 字母表中每个元素称为字符
  • ∑上的(也叫字符串)  是指由∑中的字符所构成的一个有穷序列
  • 不包含任何字符的序列称为空字,记为ε
  • ∑*表示∑上的所有字的全体包含空字ε                       Ps即可能组合成的所有字的全体集合    
  • 例如: 设 ∑={ab},则

  

语法描述的几个基本概念(2)

  • *的子集UV连接)定义为

                                                         UV{ ab | a\inU & b\inV }

  • 示例:设

U{ a, aa }

V{ b, bb }

         UV={ ab, abb, aab, aabb}

ps:左乘和右乘不一定相同

  •   V自身的 n次积记为

           V^{n}=VV\underset{n}{\underbrace{.....}}V

  • V^{0}=\left \{ \varepsilon \right \}
  • V*V闭包 V^{*}=V^{0}\bigcup V^{1}\bigcup V^{2}\bigcup V^{3}\bigcup ...
  • V^{+}V正规闭包V^{+}V V*

Ps:所谓闭包就是集合中元素之间组合出所有可能的集合

例如:集合C={1,2}

C的闭包就是{\varepsilon,1,2,12,11,22,112,122,111,...........}

这是一个无限集,其中包括所有和1,2有关的字串

Ps:闭包和正规闭包的区别   

V*包含  V^{0}  V^{+}包含V^{0}     (V^{0}=\left \{ \varepsilon \right \}

设    V={a,aa}

V*={ \varepsilon  , a, aa, aaa, aaaa, …}

V^{+}={ a, aa, aaa, aaaa, …}

V^{*}\subseteq V^{+}

 


 

下文无关文法

 

  • 上下文无关文法G是一个四元组

         G=(V_{T}V_{N}SP),其中

  • V_{T}终结符(Terminal)集合(非空)
  • V_{N}非终结符(Noterminal)集合(非空),且V_{T}\bigcap V_{N}=\varnothing
  • S:文法的开始符号S\epsilon V_{N}
  • P产生式集合(有限),每个产生式形式为
  • P\rightarrowaP\epsilon V_{N}a \epsilon (V_{T}\bigcup V_{N})^{*}
  • 开始符S至少必须在某个产生式的左部出现一次

Ps 终结符即最小的不可拆分的基本单元元素,而非终结符可再分(即非终结符需要解释)

(一般大写都是非终结符,小写都是终结符)

eg:定义只含+,*的算术表达式的文法

  G=< {i+,*,()}{E}EP >, 其中,P由下列产生式组成:

E \rightarrowi

E \rightarrowE+E

E \rightarrowE*E

E \rightarrow(E)

 {i+,*,(,)}代表终结符,{E}代表非终结符,E代表开始符号, P代表产生式

 

约定

                P \rightarrowa_{1}      

                P \rightarrowa_{2}                      →→→→→  可缩写为           P \rightarrowa_{1}|a_{2}| ...|a_{n}

                   ...

                P \rightarrowa_{n}

  • 其中,|”读成“或”,称a_{i}P的一个候选式
  • 表示一个文法时,通常只给出开始符号和产生式

 

 


 

推导 

 

  • 定义:称aAb直接推出agb,即

aAb\Rightarrowagb

A \rightarrow g是一个产生式,且a,b \in (V_{T}\bigcup V_{N})^{*}

  • 如果a_{1}\Rightarrow a_{2}\Rightarrow ... \Rightarrowa_{n},则我们称这个序列是从a_{1}a_{n}的一个推导。若存在一个从a_{1}a_{n}的推导,则称a_{1}可以推导a_{n}

Ps:“\Rightarrow”仅指一步推导

eg:    对文法G(E): E  \Rightarrow i | E+E | E*E | (E)

        E \Rightarrow (E)  \Rightarrow (E+E) \Rightarrow (i+E)  \Rightarrow  (i+i)      等若干步推导可缩写为E \overset{*}{\Rightarrow} (i+i)或 E \overset{+}{\Rightarrow} (i+i)

此处应该注意\overset{*}{\Rightarrow}\overset{+}{\Rightarrow}的不同        a \overset{*}{\Rightarrow}b   表示a\Rightarrowb或者a\overset{+}{\Rightarrow}即 \overset{*}{\Rightarrow} 大于或等于零步,\overset{+}{\Rightarrow} 大于等于一步

 


 

句型、句子和语言

 

 句型、句子

 

  • 假定G是一个文法,S 是它的开始符号
  • 如果S\overset{*}{\Rightarrow}a则称a一个句型
  • 仅含终结符号句型是一个句子
  • 文法G所产生的句子的全体是一个语言,记为 L(G):

                                                                                        L(G)=\left \{ a|S\overset{+}{\Rightarrow}a,a\in{V_{T}}^{*}\right \}

eg请证明 (i*i+i)是文法

G(E)E \rightarrowi | E+E | E*E | (E) 的一个句子。

  证明:

    E \Rightarrow(E)

     \Rightarrow(E+E)                                        PS:其中 (i*i+i) 是文法G句子 ,

     \Rightarrow(E*E+E)                                           E(E)(E*E+E)(i*i+i)都是句型

     \Rightarrow(i*E+E)

    \Rightarrow (i*i+E)

            \Rightarrow(i*i+i)

   

语言

 

设文法 G_{1}(A)

  A \rightarrowc | Ab

G_{1}(A)产生的语言为    

                    ①当选择第一种候选式时           A \Rightarrowc          此时产生式右侧不含有非终结符,产生语言结束

                    ②当选择第二种候选式时           A \RightarrowAb       此时右侧仍含有非终结符A,将表达式进行递归选择候选式 

                       此时选择第一种候选式           A \Rightarrowcb        此时产生式右侧不含有非终结符,产生语言结束

                    ③同理可得                                A \RightarrowAb

                                                                          \RightarrowAbb

                                                                          \RightarrowAbbb

                                                                          \Rightarrow...

                                                                          \RightarrowAb...b

                                                                          \Rightarrow cb...b

                                即可得:

                                                     L(G_{1})=\left \{ cb^{n},n\in N^{+} \right \}

Ps  :    L(X)指X文法产生的语言,G(R)指以R为开始符号的文法

 


 

 上下文无关文法示例

 

请给出产生语言为{a^{n}b^{n}|n\geq 1}的文法

    解 G_{3}(S)

       S \rightarrow aSb

       S \rightarrow ab

Ps :使用递归思维解决,找出最基本的核,即n=1时最简单的情况,再思考以何种方式递归可以得到标准的解

 

请给出产生语言为{a^{m}b^{n} | 1\leq n\leq m \leq 2n}的文法

PS:同样的找出满足的两种最简单情况:分别为abaab

G_{4}(S):

            S \rightarrow ab | aab 

            S \rightarrow aSb | aaSb

 

 


 

最左推导和最右推导

 

  • 从一个句型到另一个句型的推导往往不唯一

  E+E \Rightarrow i+E \Rightarrow i+i

  E+E \Rightarrow E+i  \Rightarrow i+i

  • 最左推导:任何一步a Þ b都是对a中的最左非终结符进行替换
  • 最右推导:任何一步a Þ b都是对a中的最右非终结符进行替换

 

语法树

  • 用一张图表示一个句型的推导,称为语法树
  • 一棵语法树是不同推导过程的共性抽象

eg:   G(E)E \rightarrow i | E+E | E*E | (E)(i*i+i)

最左推导                                                                 最右推导

E \Rightarrow(E)                                                                        E  \Rightarrow(E)       

\Rightarrow(E+E)                                                                       \Rightarrow(E+E)

\Rightarrow(E*E+E)                                                                   \Rightarrow(E+i)   

\Rightarrow(i*E+E)                                                                    \Rightarrow(E*E+i)

\Rightarrow(i*i+E)                                                                     \Rightarrow(E*i+i)

\Rightarrow(i*i+i)                                                                       \Rightarrow(i*i+i)

 

最左推导
 
最右推导

 

 


 

语法树与二义性(ambiguity) 

 

 

  • 文法二义性如果一个文法存在某个句子对应两棵不同的语法树则说这个文法是二义的

G(E): E \rightarrow i | E+E | E*E | (E) 是二义文法

  • 语言的二义性:一个语言是二义的,如果对它不存在无二义的文法

               Ps:即某语言只要有一个二义文法则该语言为二义性语言

  • 对于语言L,可能存在GG’,使得L(G)=L(G’)=L,有可能其中一个文法为二义的,另一个为无二义
  • 二义性问题是不可判定问题,即不存在一个算法,它能在有限步骤内,确切地判定一个文法是否是二义的但可以找到一组无二义文法的充分条件

eg:   

二义文法G(E): E \rightarrow i | E+E | E*E | (E)

        无二义文法G(E)

                                    E \rightarrowT  |  E +  T               (表达式 \rightarrow | 表达式 + 项)

                                    T \rightarrowF  |  T  *  F                (项 \rightarrow因子 |  项 * 因子)

                                    F \rightarrow(E)  |   i                     (因子 \rightarrow( 表达式 ) |  i )

   对于句子i(*i+i)来说,它的推导为

E \RightarrowT   \RightarrowF    \Rightarrow(E)   \Rightarrow(E+T)   \Rightarrow(T+T)     \Rightarrow(T*F+T)   \Rightarrow(F*F+T)   \Rightarrow(i*F+T)   \Rightarrow(i*i+T)   \Rightarrow(i*i+F)    \Rightarrow(i*i+i)

 此时并不存在二义性,即G(E)为无二义文法


 

形式语言鸟瞰 

 

   乔姆斯基1956年建立形式语言体系,他把文法分成四种类型:012,3型,与上下文无关文法一样,它们都由四部分组成,但对产生式的限制有所不同 

G=(V_{T}V_{N}SP)

  • V_{T}:终结符(Terminal)集合(非空)
  • V_{N}:非终结符(Noterminal)集合(非空),且V_{T}\bigcap V_{N}=\varnothing
  • S:文法的开始符号,S\epsilon V_{N}
  • P:产生式集合(有限)

 

四类文法

 

 

  • 0(短语文法,图灵机)

           产生式形如:   a\rightarrow b

           其中:a \in (V_{T}\bigcup V_{N})^{*}且至少含有一个非终结符;b \in (V_{T}\bigcup V_{N})^{*}

Ps左边至少含有一个需要解释的非终结符

eg:       aA\rightarrowa            (√)        Aa\rightarrowAa   (√)                aa\rightarrowAa   (X)

 


 

  • 1(上下文有关文法,线性界限自动机)

           产生式形如:   a\rightarrow b

           其中:\left | a \right |\leq \left | b \right |,仅 S\rightarrow \varepsilon例外

Ps 在0型文法的基础上限制了\left | a \right |\leq \left | b \right |这里的|β|表示的是β的长度。 即只能从产生式产生不小于本身的产生式,不能说越产生越少的情况 ,即非终极符不能没有意义被删除      

eg:          aA\rightarrowa            (X)                   Aa\rightarrowAa   (√)                       A\rightarrowAa   (√)

 


 

  • 2(上下文无关文法,非确定下推自动机)

           产生式形如:   A\rightarrow b

           其中:A \in V_{N}b \in (V_{T}\bigcup V_{N})^{*}

Ps:1.左边必须只有一个字符,且是非终结符

        2.2型文法所有产生式的右边可以含有若干个终结符和非终结符(只要是有限的就行,没有个数限制)

eg:        Aa\rightarrowAa   (X)            A\rightarrowAa   (√)          A\rightarrowAaaaaa   (√)

 


 

  • 3(正规文法,有限自动机)

           产生式形如: A\rightarrow aBA\rightarrow a                   即右线性文法

           其中: a \in {V_{T}}^{*}A,B \in {V_{N}}

           产生式形如:A\rightarrow BaA\rightarrow a                    即左线性文法

           其中: a \in {V_{T}}^{*}A,B \in {V_{N}}            

Ps:1.左边必须只有一个字符,且是非终结符(同2型)

        2.其右边最多只能有两个字符,要么是一个非终结符+终结符(终结符+非终结符),要么是一个终结符。

        3.如果是右线性文法,则所有的产生式必须是A\rightarrow aB|A\rightarrow a的形式无论几次递归都必须满足此形式,左线性文法亦然

eg:         A\rightarrowAaaaaa   (X)       A\rightarrowAa   (√)            A\rightarrowa(√) 

 

 

四种文法总结:

 0型:这种文法限制最少,范围最广,最为灵活。一般文法都是0型文法无需判断。

 1型:在0型基础上限制\left | a \right |\leq \left | b \right |

 2型:在1型基础上限制左边必须是一个非终结符

 3型: 在2型基础上限制右边只能是终结符+非终结符的组合 

以图像表示则为:(都是真包含)

 

 

 

 

 

 

 

 

                                   申明:码字不易,仅为对应学习笔记,侵删!!!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值