编译原理
  • 编译原理
  • 一些简答题
  • 绪论
    • 编译器简介
    • 程序设计语言
    • 静态与动态
    • 参数传递机制
  • 词法分析
    • 词法单元、模式、词素
    • 串和语言
    • 正则表达式
    • 状态转换图
    • 不确定有穷自动机NFA
    • 确定有穷自动机DFA
    • 算法:正则表达式转NFA
    • 自动机到词法分析器
  • 语法分析
    • 语法分析器
    • 上下文无关文法
    • 二义性和左递归
    • 递归下降语法分析
    • 算法:求解FIRST集和FOLLOW集
    • 算法:LL(1)
    • 自底向上语法分析
    • 移入-归约语法分析
    • 算法:LR(0)
    • 算法:SLR(1)
    • 算法:LR(1)
    • 算法:LALR
    • LR分析器和LALR分析器
  • 语法制导
    • 语法制导定义(SDD)
    • 综合属性和继承属性
    • 语法树上的SDD求值
    • 依赖图
    • L属性的SDD
    • 类型
    • SDD的应用
  • 中间代码生成
    • 三地址代码
    • SSA(静态单赋值)
    • 类型和声明
    • 表达式的翻译
    • 类型检查
    • 控制流
    • 回填
  • 运行时刻环境
    • 存储组织
    • 栈式分配
    • 栈中非局部数据的访问
    • 堆管理
    • 垃圾回收
  • 代码生成
    • 代码生成器的设计
    • 目标语言
    • 目标代码中的地址
    • 基本块和流图
    • 基本块的优化
Powered by GitBook
On this page
  • 符号表示的规定
  • 推导
  • 句型/句子/语言
  • 最左/最右推导
  • 语法分析树
  • 设计文法
  • 词法分析和语法分析的比较
  1. 语法分析

上下文无关文法

Previous语法分析器Next二义性和左递归

Last updated 4 months ago

程序设计语言构造的语法可使用上下文无关文法(Context-Free Grammer)或BNF表示法来描述。文法可给出精确易懂的语法规则,可以自动构造出某些类型的文法的语法分析器,文法指出了语言的结构,有助于进一步的语义处理/代码生成,支持语言的演化和迭代。

一个上下文无关文法(CFG)包含四个部分:

  • 终结符号:组成串的基本符号(词法单元的名字)

  • 非终结符号:表示串的集合的语法变量,在程序设计语言中通常对应于某个程序构造,比如stmt (语句),给出了语言的层次结构,是语法分析和翻译的关键。

  • 产生式:描述将终结符号和非终结符号组成串的方法

    形式:头部(左部)→体部(右部)

    头部是一个非终结符号,右部是一个符号串

    例子:expression→expression + term

  • 起始符号:某个被指定的非终结符号,它对应的串的集合就是文法的语言

符号表示的规定

推导

句型/句子/语言

最左/最右推导

语法分析树

推导的图形表示形式

  • 根节点的标号是文法的起始符号

  • 每个叶子节点的标号是非终结符号、终结符号或空串

  • 每个内部节点的标号是非终结符号

  • 每个内部节点表示某个产生式的一次应用,节点的标号为产生式头,其子节点从左到右是产生式的体

树的叶子组成的序列是根的文法符号的一个句型

一颗语法分析树可对应多个推导序列,但只有唯一的最左推导及最右推导。

设计文法

词法分析和语法分析的比较

上下文无关文法比正则表达式的能力更强,所有的正则表达式都可以使用文法描述,但有一些用文法描述的语言不能用正则表达式描述。

直观的讲:有穷自动机不能无穷计数。

  • 和文法相比,正则表达式更加简洁和易于理解

  • 根据正则表达式自动构造的词法分析器的效率高于根据任意文法自动构造得到分析器

但没有严格的指导方针,哪些东西应该放到词法/语法规则中

  • 正则最适合描述id、常量、关键字这样的语言构造的结构

  • 文法最适合描述嵌套结构,如对称的括号、对应的if-then-else 等,这些无法用正则描述

文法能够描述程序设计语言的大部分语法

  • 但不是全部,比如,标识符的先声明后使用则无法用上下文无关文法描述

  • 因此语法分析器所接受的语言是程序设计语言的超集;必须通过语义分析来剔除一些符合文法、但不合法的程序