通过词法分析, 可以将一个字符串转换成记号流, 但是记号流如何转换成语法树, 需要进行语法分析.

  • 实质: 无结构的数据转化成有结构的数据
  • 依据: 上下文无关语法

上下文无关文法

  • 前言

    • 正规式来定义一些简单的语言,能表示给定结构的固定次数的重复或者没有指定次数的重复, 但
    • 正规式不能用于描述配对或嵌套的结构
  • 定义

    • 上下文无关文法是四元组( VT,VN,S,PV_T,V_N,S,PVT​,VN​,S,P )

      • VTV_TVT​: 终结符集合(非空有限集合)
      • VNV_NVN​: 非终结符集合( VT⋂VN=∅V_T \bigcap V_N = \emptysetVT​⋂VN​=∅ )
      • S: 开始符号
      • P: 产生式集合 ( 产生式形式如A→α其中A∈VN,α∈(VT⋃VN)∗A \rightarrow \alpha 其中 A \in V_N, \alpha \in (V_T \bigcup V_N)^*A→α其中A∈VN​,α∈(VT​⋃VN​)∗ )
    • 例子
      $ ( {id,+, \ast ,-,(,) } , {expr,op} , expr , P ) $
      其中P包括:
      expr →\rightarrow→ expr op expr
      expr →\rightarrow→ (expr)
      expr →\rightarrow→ -expr
      expr →\rightarrow→ id
      op →\rightarrow→ +
      op →\rightarrow→ *
  • 优点

    • 文法给出了精确的,易于理解的语法说明
    • 自动产生高效的分析器
    • 可以给语言定义出层次结构
    • 以文法为基础的语言的实现便于语言的修改
  • 缺点

    • 文法只能描述编程语言的大部分语法
  • 文法推导

    • 推导: 把产生式看成重写规则,把符号串中的非终结符用其产生式右部的串来代替
      以文法 $ E \rightarrow E+E|E \ast E|(E)|-E|id$为例:
      存在代换序列: $ E \Rightarrow E+E \Rightarrow id+E \Rightarrow id+id $
      这个代换序列即从E到id+id的推导,
    • 一般而言, 由上下无关文法产生的语言叫上下文无关语言
    • 若两个文法产生相同的语言, 则称这两个文法等价
    • 若存在S⇒∗α\Rightarrow ^\ast \alpha⇒∗α, 若α含非终结符, 则称其为文法的句型, 只含有终结符的句型, 称之为句子
    • 在推导过程中, 每一步都代换句型中最左边的非终结符的推导,称之为最左推导(写作α⇒lmβ\alpha \Rightarrow _{lm}\betaα⇒lm​β), 类似的,存在最右推导(写作α⇒rmβ\alpha \Rightarrow _{rm}\betaα⇒rm​β), 最右推导亦称为规范推导
  • 分析树

    • 分析树即推导的图形表示.
    • 例子:
      以文法 $ E \rightarrow E+E|E \ast E|(E)|-E|id$为例:

      对于同样的句子, 其 最终 分析树是一样的, 但过程会有不同.
  • 二义性

    • 文法的二义性,是指对于符合文法规则的同一个句子,存在两种可能的分析树
    • 考虑如下的情况:

      对于同一个句子, 该句子存在二义性, 分析树存在了不同, 也带来了不同的释义, 左边的为 id*(id+id), 而右边为 (id*id)+id, 但对于句子id*id+id, 一般认为(id*id)+id是正确的
    • 如何消除二义性, 一般而言, 需要加入消除二义性的规则
    • 以文法 E→E+E∣E∗E∣idE \rightarrow E+E|E \ast E|idE→E+E∣E∗E∣id为例:
      可以更改为如下规则:
      E→E+T∣TE \rightarrow E + T | TE→E+T∣T
      E→E∗F∣FE \rightarrow E \ast F | FE→E∗F∣F
      F→id∣(E)F \rightarrow id | (E)F→id∣(E)
  • 正规式可以描述的语言都可以用上下文无关文法来描述

  • NFA转化为上下文无关文法:

    1. 确定终结符集合
    2. 为每个状态引入一个非终结符AiA_iAi​
    3. 如果状态i有一个转换a到状态j, 则引入产生式Ai→aAiA_i \rightarrow aA_iAi​→aAi​, 如果i是接收状态, 则引入Ai→ϵA_i \rightarrow \epsilonAi​→ϵ
      例子:
  • 为什么要用正规式定义词法

    • 词法规则非常简单,不必用上下文无关文法
    • 对于词法记号,正规式描述简洁且易于理解
    • 从正规式构造出的词法分析器效率高
  • 把词法分析从语法分析中分离出来的理由

    • 简化设计
    • 编译器的效率会改进
    • 编译器的可移植性加强
    • 便于编译器前端的模块划分
  • 能否把词法分析并入到语法分析中,直接从字符流进行语法分析?

    • 若把词法分析和语法分析合在一起,则必须将语言的注解和空白的规则反映在文法中,文法将大大复杂
    • 注解和空白由自己来处理的分析器,比注解和空格已由词法分析器删除的分析器要复杂得多

编译原理-词法分析-上下文无关文法相关推荐

  1. 《编译原理》-3.上下文无关文法及分析

    上下文无关文法及分析 3.1 分析过程 3.2 上下文无关文法 3.2.1 与正则表达式的比较 3.2.2 上下文无关文法规则的说明 3.2.3 推导及由文法定义的语言 3.3 分析树与抽象语法树 3 ...

  2. 【编译原理】什么是上下文无关文法?

    上下文无关是指,一句话的含义与其前后的内容没有或者几乎没有关系,只由自己决定,把它剪切到其他任何位置,也还是原有的意思. 例如: ... a = 0; ... 这是一个赋值语句,无论此语句的前后是什么 ...

  3. 上下文无关文法的分析树(Context-Free Grammar, CFG)的分析树--编译原理

    上下文无关文法的分析树(Context-Free Grammar, CFG)的分析树 分析树 根节点的符号为文法开始符号S 每个内部节点都是对某个产生式A→β的应用,该节点的标号就是产生式的左部,子节 ...

  4. 【编译原理】构造产生如下语言的上下文无关文法各一个:

    13.构造产生如下语言的上下文无关文法各一个: (1) (an bm c2m | n,m≥0 } S->AB A->ε|aA B->ε|bBcc (2) w c wR| w∈{a,b ...

  5. 编译原理(二)文法和语言、符号和符号串、文法的类型、语法树

    要点: 符号和符号串的相关概念 文法和语言的形式定义 文法的类型 上下文无关文法及其语法树 上下文无关文法的句型分析 有关文法实用中的一些说明 目的: 掌握文法和语言的相关概念,为以后的词法分析.语法 ...

  6. 编译原理 词法分析 算符优先分析法

    编译原理 词法分析 算符优先分析法 实验目的 加深对语法分析器工作工程的理解,加强对算符优先分析法实现语法分析程序的掌握:能够采用一种编程语言实现简单的语法分析程序:能够使用自己辨析的分析程序对简单的 ...

  7. 句法模式识别(两)-正规文法、上下文无关文法

    正规的语法特点 1.全部长度有限的语言都是正规的. 2.用正规文法当然能产生无限长串,当中周期反复部分的长度不大于非终止符的长度. 举个样例 在此规则之下.能生成句子 当中周期反复部分为ab,这个样例 ...

  8. 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 2 ) ★★

    文章目录 一.上下文无关文法 CFG 转为下推自动机 PDA 流程 二.上下文无关文法 CFG 转为下推自动机 PDA 示例 2 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | ...

  9. 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★

    文章目录 一.上下文无关文法 CFG 转为下推自动机 PDA 流程 二.上下文无关文法 CFG 转为下推自动机 PDA 示例 1 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | ...

  10. 【计算理论】计算理论总结 ( 下推自动机计算过程 | 上下文无关文法 CFG 转为下推自动机 PDA ) ★★

    文章目录 一.下推自动机计算过程 二.上下文无关文法 CFG 转为下推自动机 PDA 流程 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 ...

最新文章

  1. 《ArcGIS Runtime SDK for Android开发笔记》——(2)、Android Studio基本配置与使用
  2. 【DA算法】基于DA算法的FIR滤波器的FPGA实现
  3. Uiautomator--Uiselector元素定位
  4. Outlook最小到系统托盘
  5. compose部署redis和mysql_浅析docker-compose部署mysql无法访问的问题
  6. MQTT工作笔记0002---阿里云物联网简介_以及物联网平台下的一些名词
  7. 按比例算出成绩 用c语言,Excel按指定比例生成学生总分,并迭代计算出各学科分数...
  8. ubuntu常见问题有效解决办法
  9. sweetalert2使用教程
  10. MATLAB打开USB摄像头的操作以及常见问题
  11. linux中mysql忘记密码
  12. mobi格式转换成pdf格式
  13. 计算机课程教学调查问卷,计算机基础课程调查问卷
  14. UltraCompare Crack,重复文件查找器
  15. MySQL 查询优化如何坐到极致?
  16. c语言结构体世界杯,世界杯冷知识 | 12座球场的结构巡礼
  17. 【论文阅读】Entity Structure Within and Throughout: Modeling Mention Dependencies for Document-Level Relat
  18. 20. 有效的括号-C语言
  19. System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 S
  20. corda理解(一)

热门文章

  1. c#html转换pdf,[C#] 网页Html转PDF档(一行程式码解决)
  2. 程序员新电脑装机软件
  3. 希尔密码(加密、解密、破解)
  4. java 读取换行_Java中的换行字符读取 - java
  5. Spring boot 项目中dcm文件转jpg文件
  6. 拼多多sdk php,标签PHP拼多多SDK文章 - 零分博客 - 关注互联网且乱扯淡互联网的个人博客...
  7. 数据库基础之14(MongoDB基本数据类型,数据导入导出,数据备份与恢复)
  8. 使用软件实现直播推流
  9. 微信小程序UI框架之【weui】怎样使用
  10. fpga学习——zynq图像处理中的DVP流接口封装