哈工大 编译原理 网课笔记 —— 2.程序设计语言及其文法

本文详细介绍了字母表、串及其运算,以及文法的定义,包括文法的四类:0型、1型、2型(上下文无关文法)、3型文法。上下文无关文法(CFG)在程序设计语言的语法构造中起关键作用,通过分析树进行句子的推导和归约。同时,讨论了二义性文法及其判定问题,指出无二义性文法的重要性质。
摘要由CSDN通过智能技术生成

1. 基本概念

  • 字母表
    • 一个有穷符号集合
    • 例如:
      • 二进制字母表
      • ASCII字符集
      • Unicode字符集
  • 字母表上的运算
    • 字母表 乘积

      • 在这里插入图片描述

      • 两个集合元素分布相乘

    • 字母表的 n次幂

      • 长度为0的符号串即为 没有符号的符号串 也称为 空串
      • 在这里插入图片描述
    • 字母表的正闭包

      • 在这里插入图片描述
    • 字母表的 克林闭包

      • 在这里插入图片描述

      • 正闭包 的基础上,添加一个 空串。长度可以为0

    • 设∑是一个字母表, 对于任意x∈ ∑*, x称为是∑上的一个串
      ➢串是字母表中符号的一个有穷序列
      ➢串s的长度,通常记作|s|,是指s中符号的个数
      ➢例: |aab|=3
      ➢ 空串是长度为0的串,用 ε( epsilon) 表示
      ➢ |ε|= 0
  • 如果 x和y是串,那么x和y的连接(concatenation)
    是把y附加到x后面而形成的串,记作xy
    ➢ 例如,如果 x=dog且 y=house,那么xy=doghouse
    ➢ 空串是连接运算的单位元( identity),即,对于任
    何串s都有, εs = sε = s
    • 设x,y,z是三个字符串,如果 x=yz,
      则称y是x的前缀, z是x的后缀
  • 串上的运算——幂
    • 在这里插入图片描述

2.文法的定义

  • 自然语言的例子——句子的构成规则

    • 在这里插入图片描述

    • $G = (V_T , V_N , P , S ) $

      • V T V_T VT: 终结符集合

        • 终结符( terminal symbol) 是文法所定义的语言的基本符号, 有时也称为token
        • 例: V T V_T VT = { apple, boy, eat, little }
      • V N V_N VN: 非终结符集合

        • 非终结符(nonterminal ) 是用来表示语法成分的符号,有时也称为“ 语法变量”
        • 例如: V N V_N VN = { <句子>, <名词短语>, <动词短语>, <名词>, … }
      • 注:$V_T∩V_N = Φ $ $V_T∪ V_N =文法符号集 $

      • P :产生式集合

        • 产生式( production)描述了将终结符和非终结符组合成串的方法产生式的一般形式:
          α → β α→β αβ
          读作: α定义为β

        • α ∈ ( V T ∪ V N ) + α∈ (V_T∪ V_N)^+ α(VTVN)+, 且 α α α中至少包含 V N V_N VN中的一个元素:称为产生式的头
          (head ) 或左部(left side)

        • β ∈ ( V T ∪ V N ) ∗ β∈ (V_T∪ V_N)* β(VTVN) :称为产生式的体(body)或右部(right side)

        • 上述最开始例子中每一个规则都是一个产生式在这里插入图片描述

      • S : 开始符号

        • S ∈ V N S∈ V_N SVN开始符号(start symbol ) 表示的是该文法中最大的语法成分
        • 例: S = $ <句子> $
        • 在这里插入图片描述
    • 产生式的简写

      • 在这里插入图片描述
    • 符号约定:

      • 在这里插入图片描述

      • 在这里插入图片描述

      • 文法符号串包括 终结符和非终结符在这里插入图片描述

3.语言的定义

❓ 有了文法(语言规则),如何判定一个词串是否是满足文法的句子?

  • 推导和归约在这里插入图片描述

    • 在这里插入图片描述

    • 在这里插入图片描述

👌 有了文法(语言规则),如何判定某一词串是否是该语言的句子?

  • 在这里插入图片描述

  • 句型和句子

    • 在这里插入图片描述

      • 在这里插入图片描述

        只有最后一个句型才能称为句子,因为它没有非终结符

  • 语言的形式化定义

    • 在这里插入图片描述

      ❓上式的算术表达式文法生成语言中可以包含无穷多个句子,而文法解决了无穷语言的有穷表示问题

    • 例子:

      • 在这里插入图片描述
    • 在这里插入图片描述

4.文 法 的 分 类

  • Chomsky 文法分类体系
    • 0型文法 (Type-0 Grammar)
    • 1型文法 (Type-1 Grammar)
    • 2型文法 (Type-2 Grammar)
    • 3型文法 (Type-3 Grammar)
  • 0型文法 (Type-0 Grammar)
    • 在这里插入图片描述

      • 上节课提到的属于 0型文法
    • 1型文法 (Type-1 Grammar)

      • 在这里插入图片描述

      • 注意这里 1型文法 中 不包含空串产生式,因为 α \alpha α 必须包含一个非终结符

    • 2型文法 (Type-2 Grammar)

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smWwVF0B-1646389130591)(2.%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%AD%E8%A8%80%E5%8F%8A%E5%85%B6%E6%96%87%E6%B3%95.assets/image-20220303153328936.png)]

      • 之前标识符的文法举例属于 2型文法

      • 在这里插入图片描述

      • 2型文法左边是非终结符号,和上下文无关,属于也称作上下文无关文法

    • 3型文法 (Type-3 Grammar)

      • 在这里插入图片描述

      • 右线性文法:要么是一个终结符 w w w,要么是终结符后添加一个非终结符号 B B B

      • 在这里插入图片描述

      • 第三章会详细介绍 正则文法能描述程序设计语言的多数单词

    • 四种文法之间的关系 (如果不考虑空产生式的因素)

      • 在这里插入图片描述

5.CFG的分析树

  • 正则文法可以用来表示程序语言中的大多数单词,但是生成能力有限,描述不了程序语言中的句子构造。而CFG可以描述程序设计语言大部分语法构造,也是被研究的最多一种文法

  • 在这里插入图片描述

  • 分析树是推导的图形化表示

    • 在这里插入图片描述
  • 二义性文法的判定

    • 在这里插入图片描述
  • (句型的)短语

    • 在这里插入图片描述

      • 直接短语一定是某产生式的右部 ,产生式的右部不一定是给定句型的直接短语,比如:
        • 在这里插入图片描述
          不是某棵高度为2的边缘,因为上图中的 高人、民生、活水 不是这个句子的直接短语
  • 二义性文法

    • 如果一个文法可以为某个句子生成多棵分析树,则称这个文法是二义性的

    • 大部分编译器都希望编译器不是二义性的,遇到歧义时,计算机无法进行确定的操作在这里插入图片描述

    • 在这里插入图片描述

  • 二义性文法的判定

    • 对于任意一个上下文无关文法,不存在一个算法,判定它是无二义性的;但能给出一组充分条件,满足这组充分条件的文法是无二义性的
      • ➢满足,肯定无二义性
      • ➢不满足,也未必就是有二义性的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值