编译原理-词法分析-上下文无关文法
通过词法分析, 可以将一个字符串转换成记号流, 但是记号流如何转换成语法树, 需要进行语法分析.
- 实质: 无结构的数据转化成有结构的数据
- 依据: 上下文无关语法
上下文无关文法
前言
- 正规式来定义一些简单的语言,能表示给定结构的固定次数的重复或者没有指定次数的重复, 但
- 正规式不能用于描述配对或嵌套的结构
定义
- 上下文无关文法是四元组( 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→ *
- 上下文无关文法是四元组( VT,VN,S,PV_T,V_N,S,PVT,VN,S,P )
优点
- 文法给出了精确的,易于理解的语法说明
- 自动产生高效的分析器
- 可以给语言定义出层次结构
- 以文法为基础的语言的实现便于语言的修改
缺点
- 文法只能描述编程语言的大部分语法
文法推导
- 推导: 把产生式看成重写规则,把符号串中的非终结符用其产生式右部的串来代替
以文法 $ 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转化为上下文无关文法:
- 确定终结符集合
- 为每个状态引入一个非终结符AiA_iAi
- 如果状态i有一个转换a到状态j, 则引入产生式Ai→aAiA_i \rightarrow aA_iAi→aAi, 如果i是接收状态, 则引入Ai→ϵA_i \rightarrow \epsilonAi→ϵ
例子:
为什么要用正规式定义词法
- 词法规则非常简单,不必用上下文无关文法
- 对于词法记号,正规式描述简洁且易于理解
- 从正规式构造出的词法分析器效率高
把词法分析从语法分析中分离出来的理由
- 简化设计
- 编译器的效率会改进
- 编译器的可移植性加强
- 便于编译器前端的模块划分
能否把词法分析并入到语法分析中,直接从字符流进行语法分析?
- 若把词法分析和语法分析合在一起,则必须将语言的注解和空白的规则反映在文法中,文法将大大复杂
- 注解和空白由自己来处理的分析器,比注解和空格已由词法分析器删除的分析器要复杂得多
编译原理-词法分析-上下文无关文法相关推荐
- 《编译原理》-3.上下文无关文法及分析
上下文无关文法及分析 3.1 分析过程 3.2 上下文无关文法 3.2.1 与正则表达式的比较 3.2.2 上下文无关文法规则的说明 3.2.3 推导及由文法定义的语言 3.3 分析树与抽象语法树 3 ...
- 【编译原理】什么是上下文无关文法?
上下文无关是指,一句话的含义与其前后的内容没有或者几乎没有关系,只由自己决定,把它剪切到其他任何位置,也还是原有的意思. 例如: ... a = 0; ... 这是一个赋值语句,无论此语句的前后是什么 ...
- 上下文无关文法的分析树(Context-Free Grammar, CFG)的分析树--编译原理
上下文无关文法的分析树(Context-Free Grammar, CFG)的分析树 分析树 根节点的符号为文法开始符号S 每个内部节点都是对某个产生式A→β的应用,该节点的标号就是产生式的左部,子节 ...
- 【编译原理】构造产生如下语言的上下文无关文法各一个:
13.构造产生如下语言的上下文无关文法各一个: (1) (an bm c2m | n,m≥0 } S->AB A->ε|aA B->ε|bBcc (2) w c wR| w∈{a,b ...
- 编译原理(二)文法和语言、符号和符号串、文法的类型、语法树
要点: 符号和符号串的相关概念 文法和语言的形式定义 文法的类型 上下文无关文法及其语法树 上下文无关文法的句型分析 有关文法实用中的一些说明 目的: 掌握文法和语言的相关概念,为以后的词法分析.语法 ...
- 编译原理 词法分析 算符优先分析法
编译原理 词法分析 算符优先分析法 实验目的 加深对语法分析器工作工程的理解,加强对算符优先分析法实现语法分析程序的掌握:能够采用一种编程语言实现简单的语法分析程序:能够使用自己辨析的分析程序对简单的 ...
- 句法模式识别(两)-正规文法、上下文无关文法
正规的语法特点 1.全部长度有限的语言都是正规的. 2.用正规文法当然能产生无限长串,当中周期反复部分的长度不大于非终止符的长度. 举个样例 在此规则之下.能生成句子 当中周期反复部分为ab,这个样例 ...
- 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 2 ) ★★
文章目录 一.上下文无关文法 CFG 转为下推自动机 PDA 流程 二.上下文无关文法 CFG 转为下推自动机 PDA 示例 2 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | ...
- 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★
文章目录 一.上下文无关文法 CFG 转为下推自动机 PDA 流程 二.上下文无关文法 CFG 转为下推自动机 PDA 示例 1 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | ...
- 【计算理论】计算理论总结 ( 下推自动机计算过程 | 上下文无关文法 CFG 转为下推自动机 PDA ) ★★
文章目录 一.下推自动机计算过程 二.上下文无关文法 CFG 转为下推自动机 PDA 流程 参考博客 : [计算理论]上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定的简写形式 ...
最新文章
- 《ArcGIS Runtime SDK for Android开发笔记》——(2)、Android Studio基本配置与使用
- 【DA算法】基于DA算法的FIR滤波器的FPGA实现
- Uiautomator--Uiselector元素定位
- Outlook最小到系统托盘
- compose部署redis和mysql_浅析docker-compose部署mysql无法访问的问题
- MQTT工作笔记0002---阿里云物联网简介_以及物联网平台下的一些名词
- 按比例算出成绩 用c语言,Excel按指定比例生成学生总分,并迭代计算出各学科分数...
- ubuntu常见问题有效解决办法
- sweetalert2使用教程
- MATLAB打开USB摄像头的操作以及常见问题
- linux中mysql忘记密码
- mobi格式转换成pdf格式
- 计算机课程教学调查问卷,计算机基础课程调查问卷
- UltraCompare Crack,重复文件查找器
- MySQL 查询优化如何坐到极致?
- c语言结构体世界杯,世界杯冷知识 | 12座球场的结构巡礼
- 【论文阅读】Entity Structure Within and Throughout: Modeling Mention Dependencies for Document-Level Relat
- 20. 有效的括号-C语言
- System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 S
- corda理解(一)
热门文章
- c#html转换pdf,[C#] 网页Html转PDF档(一行程式码解决)
- 程序员新电脑装机软件
- 希尔密码(加密、解密、破解)
- java 读取换行_Java中的换行字符读取 - java
- Spring boot 项目中dcm文件转jpg文件
- 拼多多sdk php,标签PHP拼多多SDK文章 - 零分博客 - 关注互联网且乱扯淡互联网的个人博客...
- 数据库基础之14(MongoDB基本数据类型,数据导入导出,数据备份与恢复)
- 使用软件实现直播推流
- 微信小程序UI框架之【weui】怎样使用
- fpga学习——zynq图像处理中的DVP流接口封装