对于文法G=(V, T, S, P),如果产生式的形式如下:

A -> xB

A -> x

其中A, B属于V,x属于T*,则称为右线性文法;相似的,如果产生式的形式如下:

A -> Bx

A -> x

则称为左线性文法。右线性文法和左线性文法统称为正则文法。

正则表达式的表达能力等价于正则文法,正则表达式的定义如下:

字母表中的任意字母是正则表达式,空串和空集也是正则表达式;

如果r, s是正则表达式,那么r|s, rs, r*, (r)也是正则表达式。

正则表达式的扩展:

r+:一个或多个重复

.  :任意字符

[a-z]:字符范围

[^abc]:不在给定集合中的任意字符

r?:可选

正则表达式只能使用终结符(字母表中的字符),因而很容易变得复杂又难懂,实际中,经常使用正则描述,正则描述允许使用非终结符定义表达式,很像EBNF,但是它限制在未完全定义之前,不能使用非终结符,也就是说不允许递归或自嵌套。

像正则表达式的表达能力等价于正则文法一样,BNF范式的表达能力等价于上下文无关文法。BNF是“Backus Naur Form”的缩写。John Backus和Peter Naur首次引入一种形式化符号来描述给定语言的语法。

BNF的元符号:

::=表示“定义为”,有的书上用-->|表示“或者”< >尖括号用于括起非终结符。

BNF的扩展EBNF:

可选项被括在元符号“[”和“]”中

重复项(零个或者多个)被括在元符号“{”和“}”中

仅一个字符的终结符用引号(")引起来,以和元符号区别开来

上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。

如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:

U =>* xUy

那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。

如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:

U =>* xUy

那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。

BNF的扩展EBNF:

可选项被括在元符号“[”和“]”中

重复项(零个或者多个)被括在元符号“{”和“}”中

仅一个字符的终结符用引号(")引起来,以和元符号区别开来

上述操作符不是严格限定的,有的人喜欢直接使用扩展正则表达式的操作符描述EBNF。除了方便表达以外,引入EBNF的另一个主要原因是为了更紧密地把文法映射到递归下降分析程序的真实代码。当需要手动构造归下降分析程序的时候,通常把上下文无关文法改写为EBNF是必需的。

如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:

U =>* xUy

那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。

如上所述,上下文无关文法的递归性,对其分析方法也有很大影响。首先,用作识别这些结构的算法必须使用递归调用或显式管理的分析栈。其次,用作表示语言语义结构的数据结构现在也必须是递归的(通常是一颗分析树),而不再是线性的(如同用于词法和记号中的一样)了。

在程序设计语言中,通常用正则表达式描述词法规则。但是正则表示式的表达能力有限,她无法表达括号配对等语法形式,因而,需要引入表达能力更强的上下文无关文法。编译程序中常用正则文法表示词法,用上下文无关文法表示语法。那么程序语言中那些属于词法哪些属于语法呢?一个简单的办法,把所有能用正则文法表示的规则成为词法,即我们用尽可能的使用正则文法表示更多的东西,那些无法用正则表示式表示的成为句法,如C语言中的{ statement; }语法形式。语言中有些规则使用上下文无关文法仍然无法描述,例如变量的定义在使用之前,类型匹配等等,这些通常称为(静态)语义,它们在编译程序的静态语义检查阶段进行检测。

如果一个上下文无关文法G不是自嵌套或自递归的,即不存在如下推导:

U =>* xUy

那么L(G)是正则语言。自嵌套的上下文无关文法不一定是正则语言。事实上,一个上下文无关文法是严格的,既不可能由正则文法产生,当且仅当该语言的一切文法都是自嵌套的。

构造c语言的上下文无关文法,正则文法和上下文无关文法相关推荐

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

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

  2. c语言实现一个编译器生成语法树,运用JavaScript构造C语言子集的编译器

    使用JavaScript构造C语言子集的编译器 jCompiler是我一年前完成的一个课程作业.目的是尝试为编程语言提供基于浏览器的编译器实现+骗取高分(这才是重点). 实现的功能有:词法分析.语法分 ...

  3. 构造数学语言的根据是什么?

    原创作者 陈江 摘要 数学是一种科学语言,它是世界观和方法论的构造重组与表述.数学语言所表述的内容即是人对现实世界的认识.恩格斯<反杜林论>中说:"纯数学的对象是现实世界的空间形 ...

  4. java语言有没有平台无关性_Java语言具有良好的安全性和可移植性及平台无关性。...

    [判断题]在类的定义中如果不明确给出父类,那么默认父类是Object类. [判断题]数组一旦创建大小不可改变. [单选题]手绘天花布置图的表示方法中,凡是剖到的墙.柱的断面轮廓线用( )绘制. [单选 ...

  5. 文法去除空产生式_文法的二义性和化简

    1,判断一个文法是否存在二义性 一个文法,如果它的一个句子有两棵或两棵以上的语法树,则称此句子具有二义性.如果一个文法含有二义性的句子,则该文法具有二义性.这里的二义性是指语法结构上的.如果一个句子具 ...

  6. java上下文_Java,gRPC和上下文传播(Java, gRPC and Context propagation)

    Java,gRPC和上下文传播(Java, gRPC and Context propagation) 有没有人有客户端(存根)和服务器之间使用gRPC在java中的io.grpc.Context传播 ...

  7. 编译器构造c语言描述pdf,关于编译器构造:为什么每次都要在C中指定数据类型?...

    从下面的代码片段中可以看到,我声明了一个char变量和一个int变量. 编译代码时,它必须标识变量str和i的数据类型. 为什么在扫描变量期间需要通过将%s或%d指定为scanf来再次告诉它是字符串还 ...

  8. 编译器构造 c语言描,编译器构造C语言描述

    <编译器构造:C语言描述(英文版)>提供了创新的编译器构造方法,通过大量的示例和练习,读者可以从头至尾学习如何设计一个可用的编译器.书中均衡讨论了编译器设计中的理论与实现两大部分,详细讨论 ...

  9. DFA的构造C语言,DFA的编程实现含源代码实验报告剖析

    <DFA的编程实现含源代码实验报告剖析>由会员分享,可在线阅读,更多相关<DFA的编程实现含源代码实验报告剖析(20页珍藏版)>请在人人文库网上搜索. 1.实验一(一)程序设计 ...

  10. 易语言 文本_替换_正则

    正文 在文本_替换_正则 - 易语言助手中给出了文本_替换_正则的实现,这里我完善一下,额外增加了是否多行模式的参数. .版本 2 .支持库 RegEx.子程序 文本_替换_正则_多行模式, 文本型, ...

最新文章

  1. Python 精选笔试面试习题—sorted 与 sort 单例模式、统计字符个数Count、垃圾回收、lambda函数、静态方法、类方法、实例方法、分布式锁、
  2. c 宏定义用法#define
  3. Hawk原理:通过IEnumerable实现通用的ETL管道
  4. spring MVC 返回json
  5. php 模板使用,在PHP中使用模板的方法
  6. source insight快捷键及使用技巧
  7. python计算文件md5值
  8. QT绘制饼状图,自定义切片。
  9. 2017.7.18 树上距离=k 思考记录
  10. Hadoop-2.7.3-本地模式安装-wordcount例子
  11. 盘点国内外私募基金业绩报酬计提方式
  12. windows进行udp端口转发
  13. web前端入坑系列回归,再推荐一波学习资源
  14. ssm基于微信平台的牙科就诊信息管理系统的设计与实现 毕业设计源码211157
  15. 一元三次方程求解c语言
  16. NGUI 九宫格切图
  17. TeamViewer由商业用途改为个人用途
  18. 电商资讯 | 黑鲨大幅裁员,2022年游戏手机销量大跳水,降幅近40%
  19. 镭速联合Azure Blob 存储,重塑大文件传输平台存储架构
  20. 实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式

热门文章

  1. disk dynamic invalid 解决办法 动态磁盘转换器
  2. GIS游程编码两种方法
  3. rmmod不能卸载驱动
  4. 【OpenCV】OpenCV实战从入门到精通之五 -- 教你使用Rect()函数
  5. 拼多多API接口调用方法(内附上多个可用API)
  6. golang算法—— 使用两个栈实现一个队列
  7. Java并发编程思维导图
  8. PHP爬虫框架phpspider(二) - 分页爬取写入数据库
  9. 通讯接口应用笔记1:RS485通讯上下拉电阻的选择
  10. 微信小程序服务器布置轮播图,微信小程序自定义轮播图