学习笔记-BNF、EBNF、ABNF语法格式描述规范

2023-11-01

目标是确认一些c/cpp的语法细节,需要看cpp语法定义文件。
考虑从c的语法定义文件开始确认。
考虑实现一个简化的语言定义和编译器,为后续的实际需求做自定义扩展。

参考网页:
https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form
中文参考:https://www.jianshu.com/p/15efcb0c06c8
C11 : ISO/IEC 9899:2011
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
6.4 Lexical elements 开始
EBNF定义: https://www.cl.cam.ac.uk/~mgk25/iso-14977.pdf
EBNF图示定义:https://www.ics.uci.edu/~pattis/misc/ebnf2.pdf

每种语言都可能对标准BNF做了扩展,但基本都比较好理解。
BNF:Backus–Naur Form 巴科斯-诺尔范式,无确切规范
EBNF: Extended BNF 扩展的,无标准
ABNF :augmented BNF 增强型,适合解析,不适合阅读

典型的元语言BNF,用来描述语法的一种形式体系。

::=   被定义为,EBNF中为=
""    引号中的字符本身,EBNF中也支持单引号''
double_quote  "引号用double_quote转义
|,      串接,中间无任何字符
;      EBNF中为终止,类似c语言
<>  必选项
[]  可选,EBNF中单个?也表示可选
{}   重复
()    分组,优先级,类似c语言
...:表示各种列举或省略的代码片断;示例:a...z 
"..." 表示 由 双引号 " 包围起来的任意字符
(*...*):注释,EBNF
?...?:特殊序列,EBNF
-:排除,除去,EBNF

ISO/IEC 14977 标准给出的ENBF符号表,共12种符号
=,;|[]{}()“”‘’??-
https://www.cl.cam.ac.uk/~mgk25/iso-14977.pdf

用 EBNF范式 来描述 EBNF 的语法

生成式 = 生成式名 '=' [ 表达式 ] [';'] ;
表达式 = 选择项 { '|' 选择项 } ;
选择项 = 条目 { 条目 } ;
条目   = 生成式名 | 标记 [ '…' 标记 ] | 分组 | 可选项 | 重复项 ;
分组   = '(' 表达式 ')' ;
可选项 = '[' 表达式 ']' ;
重复项 = '{' 表达式 '}' ;

用EBNF描述xml,基于chatgpt。可能并不准确,只是示例。
完整的在https://www.w3.org/TR/2004/REC-xml-20040204/#sec-notation

Document ::= Prolog Element
Prolog ::= '<?xml' Version Encoding? '?>'
Version ::= 'version' Eq ("'1.0'" | "'1.1'")
Encoding ::= 'encoding' Eq ('"' EncName '"' | "'" EncName "'")
Eq ::= '='
Element ::= '<' Name AttrList? '>' Content '</' Name '>'
AttrList ::= Attribute+
Attribute ::= Name Eq ('"' Value '"' | "'" Value "'")
Content ::= (Element | Data)*
Data ::= (characters not including '<' or '&')
Name ::= (Letter | '_') (NameChar)*
NameChar ::= Letter | Digit | '.' | '-' | '_' | ':'
Letter ::= [A-Za-z]
Digit ::= [0-9]
EncName ::= [A-Za-z] [A-Za-z0-9._-]*

BNF变体列表:http://www.cs.man.ac.uk/~pjj/bnf/ebnf.html
其中,C语言为Intermediate风格BNF变体。
Intermediate BNF说明:https://www.cl.cam.ac.uk/~mgk25/iso-14977-paper.pdf
C语言语法定义的字体说明:
字体说明
C语言语法示例:
语法示例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习笔记-BNF、EBNF、ABNF语法格式描述规范 的相关文章

  • H.323协议分析

    感谢原作者 http blog csdn net bripengandre article details 2230087 整理记录 版本 时间 内容 整理人 V1 0 2008 03 28 H 323协议分析初稿 彭令鹏 H 323协议分
  • Vue 新手学习笔记:vue-element-admin 之入门开发

    说实话都是逼出来的 对于前端没干过ES6都不会的人 vue视频也就看了基础的一些 但没办法 接下来做微服务架构 前端就用 vue 这块你负责 说多了都是泪 脚手架框架布了都没看过 干就完事 不过好在做好了 这里写下给和我一样苦逼的同学能快点
  • 写技术文的三个原则是什么?

    本文章原创首发于公众号 编程三分钟 我关注了很多技术类的公众号 看着大佬的公众号几千的阅读量 甚是羡慕 这直接导致了我没有心情减肥 甚至多吃了一个鸡腿 要怎么才能写出一篇好技术文章 让读到的人感到身心舒畅 快速Get到想说的点 我想破了脑袋

随机推荐

  • Jetpack架构组件库:DataStore

    Jetpack DataStore 是一种经过改进的新数据存储解决方案 旨在取代 SharedPreferences DataStore 基于 Kotlin 协程和 Flow 构建而成 提供以下两种不同的实现 Preferences Dat
  • 【解决方法】chrome和edge浏览器出现“你的连接不是专用连接“的问题

    原创作者 运维工程师 林琪 1 问题描述 chrome和edge浏览器访问一些证书不受信任的网页会出现 你的连接不是专用连接 的问题 无法继续访问网页 2 解决方法 在上图这个问题界面的时候 输入法在英文状态下 输入 thisisunsaf
  • ByteBuffer之HeapByteBuffer与DirectByteBuffer

    HeapByteBuffer HeapByteBuffer 是写在jvm堆上面的一个buffer 底层的本质是一个数组 用类封装维护了很多的索引 limit position capacity等 在实际操作时 会把jvm堆上数据拷贝出来到系
  • WSL2+Ubuntu18.04+gnome图形界面+docker搭建开发环境

    最近换了电脑 系统更新到2004 捣腾了一下WSL2 尝试把开发环境搭建在WSL2里面 看了很多教程 基本都是Xfce的 但是更喜欢Gnome 所以就用Ubuntu主流的Gnome作为桌面GUI WSL2的安装 WSL 2的安装因为微软提供
  • VS2015和QT代码快捷键

    VS2015 代码自动对齐快捷键 1 Ctrl A 2 Ctrl K 3 Ctrl F QT 代码自动对齐快捷键 1 Ctrl A 2 Ctrl I
  • 专利交底书

    qq
  • Java在Quant应用_BigQuant人工智能量化平台使用

    BigQuant人工智能量化平台使用 BigQuant人工智能量化平台使用 Author By Runsen 在2020年一月初 也是我大三上的寒假 我开始写书 为什么呢 因为化工原理和化工热力学挂了 我需要重拾自己的自信 对于一个大学三年
  • 今天和朋友们分享如何巧用MACD指标进行恒指多空方向判断

    说起MACD指标 我们无论是做股票还是期货的朋友其实都有了解 之前也有相关文章专做分析过此指标的一些妙用 今天受一些朋友建议 均已将带领大家重温 MACD 指标课堂 今日课题主要同大家讲解一下 MACD柱线与0轴位置切换 以及MACD变化过
  • 渗透测试技术题(面试、笔试)

    本篇文章主要涉及一下几个方面 java view plain copy 对称加密非对称加密 什么是同源策略 cookie存在哪里 可以打开吗 xss如何盗取cookie tcp udp的区别及tcp三次握手 syn攻击 证书要考哪些 DVW
  • python13个小题

    python小题 1 从键盘输入3个数 求最大值 2 买彩票 如果体彩中了500万 我买车 资助希望工程 去欧洲旅游 否则我买下一期体彩 继续烧高香 写程序描述 3 会员购物时 根据积分的不同享受不同的折扣 计算会员购物时获得的折扣 小于2
  • Linux PXE详解

    今天我们继续给大家介绍Linux相关内容 本文主要内容是PXE系统的部署 并且通过实战 完成PXE环境的实战部署 由于PXE环境牵扯到的服务众多 因此 您需要了解FTP DHCP等服务的原理 安装 部署等知识 如果您对此还存在困惑 欢迎查阅
  • Jtti:Linux大文件重定向和管道的效率哪个更高

    在Linux中 重定向和管道是不同的工具 用于不同的任务 它们的效率也取决于具体的使用情况 让我们比较一下它们的特点和效率 重定向 特点 重定向是将命令的输出写入文件或设备的过程 它通常用于将命令的输出保存到文件中或将输入从文件中读取 重定
  • 交易系统模块划分,模块拆分,设计,重构实战.状态

    父文章 技术设计金字塔 包含了实体设计文章 相关文章 如何梳理和重构 含复杂性度量 相关文章 代码级 如何写可维护的代码 万物ddd ddd primitive 封装 对象来实现可维护代码 个人渣记录仅为自己搜索用的博客 CSDN博客 dd
  • docker如何搭建Kafka

    1 介绍 Kafka是一个分布式流处理平台 用于高吞吐量 低延迟的数据传输和处理 一般是用做分布式系统的消息中间件 2 前提概要 阅读本章博客之前 你至少需要满足以下条件 电脑已经安装过docker 已经使用docker搭建了zookeep
  • 【Java SE】return的用法(快速扫盲)

    点进来你就是我的人了博主主页 戳一戳 欢迎大佬指点 欢迎志同道合的朋友一起加油喔 目录 前言 1 定义 2 return的用法 3 break和return的区别 前言 此篇帮助不理解return用法的小伙伴们快速扫盲 1 定义 retur
  • 分布式光伏消纳的微电网群共享储能配置策略研究——Matlab代码复现

    目录 摘要 研究背景 共享储能参与微能源网新能源消纳模式 共享储能电站容量功率配置原则 Matlab算例运行结果 编辑 Matalb代码 数据分享 摘要 共享储能是可再生能源实现经济消纳的解决方案之一 在适度的投资规模下 应尽力实现储能电站
  • mocha如何实现异步测试

    异步测试 用mocha测试一个函数是非常简单的 但是 在JavaScript的世界中 更多的时候 我们编写的是异步代码 所以 我们需要用mocha测试异步函数 我们把上一节的hello test工程复制一份 重命名为async test 然
  • 如何面对基金下跌时的失落感?

    你知道追高 almost All in式入市 转眼被市场放倒在地上摩擦 资产被套牢 最深处超20 时间跨度达2 3年之久 是种什么样的体验吗 我知道 大家好 我是睿齐 一个奋斗在实现财富自由一线的打工者 3 4年之前 作为一只涉 市 未深的
  • 设计模式精讲-工厂方法模式

    设计模式精讲 工厂方法模式 模式定义 实战说明 简单工厂实现 不是设计模式 工厂方法 应用场景 主要优点 源码中的应用 模式定义 定义一个用于创建对象的接口 让子类决定实例化哪一个类 Factory Method 使得一个类的实例化延迟到子
  • 学习笔记-BNF、EBNF、ABNF语法格式描述规范

    目标是确认一些c cpp的语法细节 需要看cpp语法定义文件 考虑从c的语法定义文件开始确认 考虑实现一个简化的语言定义和编译器 为后续的实际需求做自定义扩展 参考网页 https en wikipedia org wiki Extende