• 编译原理(清华大学出版社)-- 文法和语言 -- 文法和语言的形式定义


    规则(重写规则、产生式或生成式)

    • 形如 α→β 或 α::=β 的(α,β)有序对,其中α称为规则的左部,β称为规则的右部,这里的符号 →(::=)读作 "定义为",例如A→a读作 “A定义为a”
    • 文法 G定义为四元组(VN,VT,P,S)
    • 其中VN为非终结符集(语法实体 或 变量);VT终结符集;P为规则(α→β)的集合,α∈(VN∪VT* ,且至少包含一个非终结符,β∈(VN∪VT*,VN,VT和P都是非空有穷集
    • S称为识别符或者开始符,它是一个非终结符,至少要在一条规则中作为左部出现
    • VN 和 VT 不含公共的元素,即VN ∩ VT = Ø
    • 通常用 V 表示 VN ∪ VT ,V称为文法G的字母表或词汇表

    例2.1 有文法G=<VN,VT,P,S>,其中,VN={S},VT={0,1},P={S→0S1,S→01},这里非终结符集中只含一个元素S,终结符号集由两个元素 0,1组成,有两条产生式,开始符是S

    该例子也可以写成

    G: S→0S1

      S→01

    或者

    G[S]:S→0S1

               S→01

    例2.2 有文法G=(VN,VT,P,S),其中 VN = {标识符,字母,数字},VT = {a,b,c,...,x,y,z,0,1,...,9}

    P = { <标识符>→<字母>

        <标识符>→<标识符><字母>

        <标识符>→<标识符><数字>

             <字母>→a

             <字母>→b

        ...

        <字母>→z

        <数字>→0

        <数字>→1

        ...

        <数字>→9

    }

    S=<标识符>

    为定义文法所产生的语言,还需要引入 推导 的概念,定义 V* 中的符号之间的关系,直接推导=>,长度为n(n≥1)的推导  和长度为n(n≥0)的推导 

    直接推导/直接归约的定义

    • 设α→β是文法G=(VN,VT,P,S)的规则(或者是P中的一个产生式),γ 和 δ 是V*中的任意符号
    • 若有符号串 v、ω满足,v = γαδ,ω=γβδ,则说v(应用规则α→β)直接产生ω,或说ω是v的直接推导,或说ω直接归约到v,记作v=>ω

    例如,对于例2.1的文法G,可以给出一些例子

    1. v=0S1,ω=0011,直接推导:0S1=>0011,使用的规则:S→01,这里γ=0,δ=1
    2. v=S,ω=0S1,直接推导:S=>0S1,使用的规则:S→0S1,这里γ=ε,δ=ε,ε类似于群里面的幺元
    3. v=0S1,ω=00S11,直接推导:0S1=>00S11,使用的规则,S→0S1,这里γ=0,δ=1

    对于例2.1的文法G,直接推导的例子如下

    1. v=<标识符> ,ω=<标识符><字母>,直接推导:<标识符>=><标识符><字母>,使用的规则:<标识符>→<标识符><字母>,这里γ=δ=ε
    2. v=<标识符><字母><数字>,ω=<字母><字母><数字>,直接推导:<标识符><字母><数字>=><字母><字母><数字>,使用的规则:<标识符>→<字母>,这里γ=ε,δ=<字母><数字>
    3. v=abc<数字>,ω=abc5,直接推导:abc<数字>=>abc5,使用的规则:<数字>→5,这里γ=abc,δ=ε

    序列中的推导定义

    • 如果存在直接推导的序列:v=ω0 => ω1 => ω2 => ... => ωn = ω (n>0)则称v推导出(产生)ω(推导长度为n),或称ω归约到v,记作v ω
    • 若有 v ω,或 v = ω,则记作 v ω 对例2.1的文法,存在直接推导序列 v=S1 => 00S11 => 000S11 => 00001111 = ω,即 0S1  00001111,也可记作 0S1 00001111
    • 对例2.2的文法,存在直接推导序列 v = <标识符> => <标识符><数字> => <字母><数字> => x<数字> => x1 = ω,即 <标识符> x1

    句型(推导出来的结果)和句子(仅由终结符号组成的句型)的定义

    • 设G[S]是一个文法,如果符号串x从识别符号推导出来的,即有 S  x,则称x是文法 G[S] 的句型
    • 若x仅由终结符号组成, 即 S  x,x∈V*T ,则称x为G[S]的句子
    • 例如,在例2.1中,S、0S1、000111都是例2.1的文法G的句型,其中000111是G的句子
    • 在例2.2中,<标识符><字母>,<字母><数字>,a1都是例2.2文法G的句型,其中a1是G的句子

    文法G产生的语言定义

    • 文法G产生的语言定义为集合{x|Sx,其中S为文法识别符号,且x∈V*T},可用L(G)表示该集合

    文法描述的语言是该文法一切句子(仅由终结符号组成的句型)的集合

    考虑例2.1的文法G,有两条产生式(规则):S→0S1 和 S→01,通过对第一个产生式使用 n-1 次,然后使用第二个产生式一次,得到 S=>0S1=>00S11=>...=>0n-1S1n-1=>0n1n

    L(G)={0n1n|n≥1}

    例题2.3

    设G=(VN, VT, P, S),VN = {S, B, E}, VT = {a, b, e},P由下列产生式组成

    1. S→aSBE
    2. S→aBE
    3. EB→BE
    4. aB→ab
    5. bB→bb
    6. bE→be
    7. eE→ee

    若L(G1) = L(G2),则称文法G1和G2是等价的

    例如文法 G[A]:

      • A→0R
      • A→01
      • R→A1
  • 相关阅读:
    Orcale分析函数OVER(PARTITION BY... ORDER BY...)的讲解
    Linux下安装Redmine(项目管理软件)
    CentOS5.4安装redmine详细步骤
    CentOS安装redmine 2后的简单配置
    在linux上安装redmine
    Linux安装MediaWiki
    Linux下安装配置MediaWiKi全过程
    用Navicat_SSH 连接数据库服务器
    基于C#的MongoDB数据库开发应用(4)--Redis的安装及使用
    基于C#的MongoDB数据库开发应用(3)--MongoDB数据库的C#开发之异步接口
  • 原文地址:https://www.cnblogs.com/YC-L/p/12175810.html
Copyright © 2020-2023  润新知