【编译原理】如何编写BNF?
此篇文章承接上一篇:【编译原理】理解BNF
前言
理解了BNF,就能实现代码解析了吗?还有点早,因为理解了BNF,还要会写BNF。实际上,BNF实现有固定的模式,也有现成的工具,比如可以使用yacc、bison等工具自动化进行。所以把实现先放一放,看一看BNF是怎么写的。
编写BNF
上一篇文章中,我们介绍了如何编写四则运算的BNF,我们需要遵循几个原则:
- 优先级越高的产生式越接近终端节点;
- 有左递归要消除左递归。
是否所有的BNF都可以这么来写呢?下面我们尝试对其他语法的BNF进行编写。
如C语言中枚举类型的定义:
enum EnumName
{A, B, C
};
枚举类型的定义语法,用语言描述出来是:
以一个enum开头,后面可以跟一个标识符,也可以省略不写。
接着是一个左大括号;
接着是枚举值列表,枚举值列表可以为空,不为空时,枚举值之间用逗号隔开。
枚举值可以只写出标识符名称,也可以给它赋值,如A和A=1都是正确的;
接着是一个右大括号和一个分号。
其BNF可以尝试写出来:
enum_decl=‘enum’ + option_identifier + ‘{’ + value_list + ‘};’
option_identifier=identifier | ‘’
value_list=’’ | value_list + ‘,’ + indentifier | value_list + ‘,’ + indentifier + ‘=’ + Num
写到最后的value_list会发现,不管怎么写都会多出一个逗号。
因为BNF里面的控制命令太少了,想要表达出我们想要表达的规则,我们得求助于EBNF。
EBNF介绍
下面是EBNF的介绍:
EBNF,E即Extended,EBNF即扩展BNF范式。
它最初由尼古拉斯·沃斯开发,最常用的 EBNF 变体由标准,特别是 ISO-14977 所定义。 ——来自维基百科
更详细的介绍可以参考维基百科: 扩展巴科斯范式(可能需要翻墙)
ISO-14977标准文档获取方法,参考文章:去哪查阅ISO国际标准?
下图列举了EBNF包含的符号:
可见EBNF中包含了更多的控制命令。相对于BNF来说,它的描述能力更为强大。
重写
我们现在使用EBNF重写上面的枚举声明语法。
enum_decl = 'enum'[id]'{'[id'='num]{','id'='num}'}';
可见上面用一个EBNF语句即描述BNF很多条语句才能描述的内容。
以此类推,可以自己尝试编写。
欢迎专注【编译原理】专栏!
【编译原理】如何编写BNF?相关推荐
- 【编译原理】如何根据EBNF编写代码?
此篇文章承接上一篇:[编译原理]如何编写BNF? 我们知道,完整的编译过程总体大概需要经历六个阶段: 词法分析->语法分析->语义分析->中间代码生成->代码优化->目标 ...
- c 语言编写编译原理语义分析实验,北邮 编译原理 语义分析实验报告
<北邮 编译原理 语义分析实验报告>由会员分享,可在线阅读,更多相关<北邮 编译原理 语义分析实验报告(14页珍藏版)>请在人人文库网上搜索. 1.编译原理第六章 语义分析目 ...
- 我看过的编译原理方面的好文章
本文不定期更新,最后更新于2019-7-6 编译原理 编译原理三大经典书籍(龙书 虎书 鲸书) 前端为什么要会正则表达式 - 知乎 一次性搞懂JavaScript正则表达式之引擎 - 掘金 没有AST ...
- 从编译原理看一个解释器的实现
『设计模式』中有一个模式可以解释特定的语法规则,它就是解释器模式(Interpreter Pattern).不同于常见的策略模式或者是工厂模式,解释器模式在.NET或者JDK中并不常见,而且在业务上也 ...
- 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 4.)(python/c/c++版)(笔记)
[编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 4.) 文章目录 python代码 C语言代码 总结 在上一篇文章中,您学习了如 ...
- 按编译原理的思路设计的一个计算器
(周游[http://www.cnblogs.com/naturemickey]版权所有,未经许可请勿转载) 首先看一下这个计算器的功能: CALC> set a = 1; b = 2 CALC ...
- 编译原理实验(三)词法语法分析综合设计
版权声明:本文为原创文章,版权归 Geekerstar 所有. 本文链接:http://www.geekerstar.com/technology/105.html 除了有特殊标注文章外欢迎转载,但请 ...
- 编译原理实验:自上而下语法分析
编译原理实验:自上而下语法分析 1. 实验题目:自上而下语法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3. 算法流程 4. 源程序 5. 调试数据 1. 实验题目:自上而下语法分析 ...
- 【编译原理】实验四:Yacc 分析程序生成器
目录 实验四 Yacc 分析程序生成器 一.实验目的 二.预备知识 三.实验内容 巴科斯范式BNF 分析器的生成器Yacc sample.txt文件 ytab.c文件 ytab.h文件 y.outpu ...
最新文章
- div 自动换行_js自动打字--autotypejs
- sketch如何做设计稿交互_做交互设计不可不知的十大原则
- java导入、导出Excel文件
- Java学习 第四章 java面向对象(二)
- 【视频讲解】基础实验4-2.1 树的同构 (25 分)
- div 重新加载_使用React的HOC来完成模块的异步加载
- gentoo 安装php7,在Gentoo安装Wifidog Portal
- linux下shell脚本编程2
- Java 代码实现pdf转word文件 | 无损转换完整代码教程
- KITTI Odometry数据集处理:将全局pose转换为帧间pose转换
- 群表示论之Able群的不可约表示
- Android创建子线程和回调主线程的几种方式
- 传奇服务器开区修改,怎么修改传奇登陆器开区时间提前?
- matlab编写数学公式计算,关于MATLAB Function实现数学运算的相关介绍
- Multimodal Gesture Recognition Using 3-D Convolution and Convolutional LSTM
- 《X3D: Expanding Architectures for Efficient Video Recognition》论文详解
- OSChina 周六乱弹 ——你知道妹子喜欢什么了么?
- notification源码分析_状态栏通知Notification、NotificationManager详解(源码)----转载...
- ssh报错:no matching host key type found. Their offer: ssh-rsa
- 基于Matlab脚本实现对串口数据的实时采集绘图
热门文章
- Dart基础学习02--变量及内置类型
- Android Activity无法启动。
- maven生成javadoc【原创】
- 制作完整的java可执行文件
- Java学习笔记5-1——多线程
- mysql支持的时区列表_mysql按天分组支持时区
- please reinstall the mysql distribution_php安装扩展mysqli的实现步骤及报错解决办法
- windows 7搭建流媒体服务
- java中除了跟数据相关的知识_Java的基本数据类型及知识介绍
- mysql视图表修复_mysql中含有视图数据库在恢复数据时视图变成数据表的解决方法...