zoukankan      html  css  js  c++  java
  • 编译原理学习笔记·关于四种文法的理解以及 如何根据语言描述给出正则式或相应文法

    首先要说明的是:
    一般的文法至少都是0型文法,也就是说0型文法限制最少。若将0型文法比作基类的话,1、2、3型文法就是不断继承并加以限制得到的子类。
    文法表示过程中,常用大写字母表示非终结符VN,而小写字母表示的是终结符VT

    文法概要

    设文法G[S]=VNVTSP

    0型文法(对应图灵机)

    • 如果它的每个产生式α→β是这样一种结构:α∈(VN∪VT)*且至少含有一个非终结符,而β∈(VN∪VT)*,则G[S]是一个0型文法。
    • 0型文法也称短语文法,记为PSG。
    • 一个非常重要的理论结果是:0型文法的能力相当于图灵机。或者说,任何0型文语言都是递归可枚举的,反之,递归可枚举集必定是一个0型语言。

    1型文法(对应线性界线自动机,自然语言)

    • 它是在0型文法的基础上每一个α→β,都有|β|>=|α|。这里的|β|表示的是β的长度。
    • 注意:虽然要求|β|>=|α|,但有一特例:α→ε也满足1型文法。
    • 1型文法也叫上下文有关文法,记为CSG。
    • 此文法对应于线性有界自动机。

    2型文法(对应下推自动机,程序设计语言)

    • 2型文法是在1型文法的基础上,再满足:每一个α→β都有α是非终结符。
    •  2型文法也叫上下文无关文法,记为CFG。
    • 此文法对应于下推自动机。

    3型文法(对应有限自动机)

    • 它是在2型文法的基础上满足:A→α|αB(右线性)或A→α|Bα(左线性)。
    • 3型文法也叫正规文法,记为RG。
    • 此文法对应于有限状态自动机。

    四类文法的关系与区别

           1~3型文法都属于0型文法,2、3型文法不一定属于1型文法(如果存在A→ε的产生式,则不属于1型文法),3型文法属于2型文法。四类文法区别如下:

              (1)1型文法中不允许有形如A→ε的产生式存在,而2、3型文法则允许出现。

              (2)0、1型文法产生式左部存在含有终结符的符号串或两个以上的非终结符,而2、3型文法的产生式左部只允许是单个非终结符号。

     

    Eg.判断该产生式 S-> aSb|ab对应的文法。

    关于正规表达式与上下文无关文法

             正规表达式所描述的语言结构均可以用上下文无关文法描述,反之则不一定。


    (一)、正规表达式

    1. S={0,1},没有连续两个1的0和1组成的串集合 。

    (10|0)*(1|e)


    2. S={a,b,c} ,包含至少一个a和一个b的串集合。

    c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)*

     

    3. S={0,1},使每对相邻的0都出现在任何一对相邻的1之前的所有01串集合。

    (10|0)*|(1|e)(01|1)* |(0|e)


    [分析]这题换个说法来理解就是“如果出现任意一对相邻的1,那么它后面必然不会出现相邻的0”。首先,我们将这个01串拆成前后两个部分来考虑,首先给出没有连续两个1的01串的前缀,则这样表示(10|0)*|(1|e),这时需要考虑后面尾部的情况有两种:

    •  一种是没有一对相邻的1,那么之前表示足以。
    • 另一种是存在若干对相邻的1,那么则用(01|1)* |(0|e) 来表示。

    4. S={0,1} ,不包含101作为子串的集合。

    0*|0*11*|0*11*0|(0*11*00)*(0*11*|0*11*0|e)



    (二)、文法

    按指定类型,给出语言的文法。

    1. L={anbn | n≥1}的上下文无关文法

    G[S]:   SaT

    TSb|b

     

    2. L={aibj | j>i≥0}的上下文无关文法

    G[S]:   SaSb|Sb|b

     

    3.由相同个数a和b组成句子的无二义文法

    官方标配答案:

    我们用一个非终结符A代表一个a(即有A→a),用一个非终结符B代表一个b(即有B→b);为了保证a和b的个数相同,则在出现一个a时应相应地出现一个B,出现一个b时则相应出现一个A。假定已推导出bA,如果下一步要推导出连续两个b时,则应有bAbbAA。也即为了保证b和A的个数一致,应有A→bAA;同理有B→aBB。此外,为了保证递归地推出所要求的ab串,应有S→aBS和S→bAS。由此得到无二义文法G[S]为    

    G[S]:   SaBS|bAS|ε

    AbAA|a

    BaBB|b


    自己来看的理解与解题过程:

    我们规定S 能推导出所有具有相等个数a和b的符号串

    S→ε(最简单的情况,a、b都没有)

    S→a B (其中B 中b的个数比a多一个)

    S→b A (其中A中a的个数比b多一个)

    这里可以看出,引入两个非终极符B和A来分别推出相应的后缀。得到S的产生式:

    SaB | bA | e

     

    接下来,对B采用同样的方法来考虑:

          B b (最简单的情况,a没有)

          B b S

          B a BB

    于是可得到B的产生式:

    BbS | aBB | b

     

    同样地,可得到A的产生式:

    A aS | bAA | a

     

    将三部分放在一起,我们就得到了文法G[S], 如下:

    SaB | bA |e

    BbS | aBB | b

    AaS | bAA | a

    [拓展思考]如果将AB作为开始符号,得到的语言是什么?


    4. 字母表Σ={a,b}上的同时只有奇数个a和奇数个b的所有串的集合的正规文法。

    为了构造字母表Σ={a,b}上同时只有奇数个a和奇数个b的所有串集合的正规式,我们画出如图所示的DFA,即由开始符S出发,经过奇数个a到达状态A,或经过奇数个b到达状态B;而由状态A出发,经过奇数个b到达状态C(终态);同样,由状态B出发经过奇数个a到达终态C。由图可直接得到正规文法G[S]如下: 


    G[S]:   SaA|bB 

    AaS|bC|b 

    BbS|aC|a      

    CbA|aB|ε

    [拓展思考:奇数个a和偶数个b、偶数个a和偶数个b、偶数个a和奇数个b又怎么表示呢?]

    更多文法构造例子:http://download.csdn.net/download/jave_f/10016955




    【附:一文一图】


  • 相关阅读:
    Hibernate>查询缓存 小强斋
    hibernate>抓取策略 小强斋
    Spring>环境 及 为什么使用spring 小强斋
    Hibernate>一级缓存 小强斋
    Spring>环境 及 为什么使用spring 小强斋
    【设计模式系列】OO设计原则之LSPLiskov替换原则
    【设计模式系列】OO设计原则之SRP单一职责原则
    【Android】选项卡使用
    【人生】不管你挣多少, 钱永远是问题
    【设计模式系列】序
  • 原文地址:https://www.cnblogs.com/zhouie/p/8955804.html
Copyright © 2011-2022 走看看