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

Posted 方知有

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义相关的知识,希望对你有一定的参考价值。

语法定义:

  • 文法定义:
    • 定义:用以描述程序设计语言语法的表示方法——“上下文无关文法”,简称“文法”,文法自然地描述了大多数程序设计语言构造地层次化语法结构
    • 实例:
      • 如果用变量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(可选参数列表)

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

 

 

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

以上是关于编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义的主要内容,如果未能解决你的问题,请参考以下文章

编译原理-第二章 一个简单的语法指导编译器-2.8 生成中间代码

编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析

三万五千字长文!让你懂透编译原理——第六章 属性文法和语法制导翻译

编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器语法分析

编译原理系列 实验二自上而下语法分析

编译原理系列 实验二自上而下语法分析