编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义

语法定义:spa

  • 文法定义:
    • 定义:用以描述程序设计语言语法的表示方法——“上下文无关文法”,简称“文法”,文法天然地描述了大多数程序设计语言构造地层次化语法结构
    • 实例:
      • 若是用变量expr来表示表达式,用变量stmt表示语句,则
    • 相关概念:
        • 产生式:使用箭头(→)表示"能够具备以下形式",用相关变量表示表达式和语句的构造规则产生的式子。每一个生产式包括一个称为生产式头或左部的非终结符号,一个箭头,和一个称为生产式体或右部的由终结符号组成的序列。
        • 终结符号:有时也称为词法单元,终结符号是该文法所定义的语言基本符号集合
          • 字母表中的小写字母,如 a,b,c
          • 黑体串,关键字,如 idwhile
          • 数字 0, 1, … , 9
          • 标点符号,如括号,逗号等
          • 运算符号,如+, -等
        • 空串:零个终结符号组成的串,记为ε
        • 非终结符号:有时也称为语法变量,每一个非终结符号表示一个终结符号串集合
          • 表示终结符号的序列的变量,如expr和stmt这样的变量
          • 字母表中的大写字母,如 A, B, C
          • 字母 S,而且一般表明开始符号
          • 小写字母的名字(斜体),如expr, stmt
    • 组成:
      • 终结符号集合
      • 非终结符号集合
      • 产生式集合
      • 开始符号∈非终结符号集合
    • 书写规定:
      •  字母表中后面的大写字母,如X, Y, Z, 能够是终结符或非终结符
      • 字母表中后面的小写字母,如u, v,… z, 可表明终结符号串
      • 小写希腊字母,如a,b,可表明文法的符号串
      • 对于A →a1,A→ a2,… A →an能够写成Aa1|a2|…|an
      • 除非特别说明,第一个产生式的头就是开始符号
  • 推导:
    • 定义:根据文法,首先从开始符号出发,不断将某个非终结符号替换为该非终结符号的某个产生式的体;把产生式当作重写规则,把符号串中的非终结符用其产生式右部的串来代替
    • 文法定义的语言:从开始符号推导获得的全部终结符号串集合
    • 实例:
      •  max(x,y):设计

        • 文法:optparams(可选参数列表)blog

  • 语法分析:
    • 定义:接受一个终结符号串做为输入,找出从文法的开始符号推导出这个串的方法,若是不能找出,则报告语法错误
    • 语法分析树
      • 做用:用图形方式展示了从文法的开始符号推导出相应语言中的符号串的过程
      • 性质:
        • 根结点是开始符号
        • 叶子结点是终结符或ε
        • 内部结点是一个非终结符
        • 若A→x1x2....xn,则A是一个非终结符,x1x2...xn 是终结符或非终结符
        • 为一个给定的终结符号串构建一棵语法树的过程称为对该符号串进行语法分析
      • 结果:一颗语法树的叶子节点从左向右构成了树的结果
      • 实例: 
  • 二义性:
    •  定义:一个文法,若是存在某个句子不止一棵分析树,或者说这个句子存在不止一种最左(最右)推导,那么称这个文法是二义的
    • 缘由: 在产生句子的过程当中某些直接推导有多于一种选择
    • 注意:
      • 仅与文法和句子有关,与采用的推导方法无关
      • 文法中缺乏对文法符号优先级和结合性的规定
    • 实例:
  • 运算符的结合性:
    • 运算符的左(右)结合性:当一个运算份量左右两侧都有该运算符时,该运算份量属于其左(右)边的运算符
    • 实例:
      • 图2-7比较了一个左结合运算符(好比“-”)的语法分析树和一个右结合运算符(好比“=”)的语法分析树
  • 运算符的优先级:
    • 用途:当多种运算符出现时,须要给出一些规则来定义运算符之间的相对优先关系
    • 相关概念:
      • 因子:
        • 定义:能够理解为不能被任何运算符分开的表达式,即在任意因子的任意一边放置一个运算符,都不会致使这个因子的任何部分分离出来,成为这个运算符的运算份量(括号能够起到保护不分开的做用)
        • 地位:因子自己能够做为一个总体成为运算符的一个运算份量
      • 一个(不是因子的)项(term)是一个可能被高优先级的运算符*和/分开,但不能被低优先级运算符分开的表达式
      • 一个(不是因子也不是项的)表达式可能被任何一个运算符分开
    • 实例:

 

 

参考——《编译原理(第二版)》、慕课-苏州大学-王中卿编译

相关文章
相关标签/搜索