此篇文章承接上一篇:【编译原理】理解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?相关推荐

  1. 【编译原理】如何根据EBNF编写代码?

    此篇文章承接上一篇:[编译原理]如何编写BNF? 我们知道,完整的编译过程总体大概需要经历六个阶段: 词法分析->语法分析->语义分析->中间代码生成->代码优化->目标 ...

  2. c 语言编写编译原理语义分析实验,北邮 编译原理 语义分析实验报告

    <北邮 编译原理 语义分析实验报告>由会员分享,可在线阅读,更多相关<北邮 编译原理 语义分析实验报告(14页珍藏版)>请在人人文库网上搜索. 1.编译原理第六章 语义分析目 ...

  3. 我看过的编译原理方面的好文章

    本文不定期更新,最后更新于2019-7-6 编译原理 编译原理三大经典书籍(龙书 虎书 鲸书) 前端为什么要会正则表达式 - 知乎 一次性搞懂JavaScript正则表达式之引擎 - 掘金 没有AST ...

  4. 从编译原理看一个解释器的实现

    『设计模式』中有一个模式可以解释特定的语法规则,它就是解释器模式(Interpreter Pattern).不同于常见的策略模式或者是工厂模式,解释器模式在.NET或者JDK中并不常见,而且在业务上也 ...

  5. 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 4.)(python/c/c++版)(笔记)

    [编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 4.) 文章目录 python代码 C语言代码 总结 在上一篇文章中,您学习了如 ...

  6. 按编译原理的思路设计的一个计算器

    (周游[http://www.cnblogs.com/naturemickey]版权所有,未经许可请勿转载) 首先看一下这个计算器的功能: CALC> set a = 1; b = 2 CALC ...

  7. 编译原理实验(三)词法语法分析综合设计

    版权声明:本文为原创文章,版权归 Geekerstar 所有. 本文链接:http://www.geekerstar.com/technology/105.html 除了有特殊标注文章外欢迎转载,但请 ...

  8. 编译原理实验:自上而下语法分析

    编译原理实验:自上而下语法分析 1. 实验题目:自上而下语法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3. 算法流程 4. 源程序 5. 调试数据 1. 实验题目:自上而下语法分析 ...

  9. 【编译原理】实验四:Yacc 分析程序生成器

    目录 实验四 Yacc 分析程序生成器 一.实验目的 二.预备知识 三.实验内容 巴科斯范式BNF 分析器的生成器Yacc sample.txt文件 ytab.c文件 ytab.h文件 y.outpu ...

最新文章

  1. div 自动换行_js自动打字--autotypejs
  2. sketch如何做设计稿交互_做交互设计不可不知的十大原则
  3. java导入、导出Excel文件
  4. Java学习 第四章 java面向对象(二)
  5. 【视频讲解】基础实验4-2.1 树的同构 (25 分)
  6. div 重新加载_使用React的HOC来完成模块的异步加载
  7. gentoo 安装php7,在Gentoo安装Wifidog Portal
  8. linux下shell脚本编程2
  9. Java 代码实现pdf转word文件 | 无损转换完整代码教程
  10. KITTI Odometry数据集处理:将全局pose转换为帧间pose转换
  11. 群表示论之Able群的不可约表示
  12. Android创建子线程和回调主线程的几种方式
  13. 传奇服务器开区修改,怎么修改传奇登陆器开区时间提前?
  14. matlab编写数学公式计算,关于MATLAB Function实现数学运算的相关介绍
  15. Multimodal Gesture Recognition Using 3-D Convolution and Convolutional LSTM
  16. 《X3D: Expanding Architectures for Efficient Video Recognition》论文详解
  17. OSChina 周六乱弹 ——你知道妹子喜欢什么了么?
  18. notification源码分析_状态栏通知Notification、NotificationManager详解(源码)----转载...
  19. ssh报错:no matching host key type found. Their offer: ssh-rsa
  20. 基于Matlab脚本实现对串口数据的实时采集绘图

热门文章

  1. Dart基础学习02--变量及内置类型
  2. Android Activity无法启动。
  3. maven生成javadoc【原创】
  4. 制作完整的java可执行文件
  5. Java学习笔记5-1——多线程
  6. mysql支持的时区列表_mysql按天分组支持时区
  7. please reinstall the mysql distribution_php安装扩展mysqli的实现步骤及报错解决办法
  8. windows 7搭建流媒体服务
  9. java中除了跟数据相关的知识_Java的基本数据类型及知识介绍
  10. mysql视图表修复_mysql中含有视图数据库在恢复数据时视图变成数据表的解决方法...