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

news2024/10/6 12:21:26

目标是确认一些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语言语法示例:
语法示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/978329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux内核源码分析 (B.2)虚拟地址空间布局架构

Linux内核源码分析 (B.2)虚拟地址空间布局架构 文章目录 Linux内核源码分析 (B.2)虚拟地址空间布局架构一、Linux内核整体架构及子系统二、Linux内核内存管理架构 一、Linux内核整体架构及子系统 Linux内核只是操作系统当中的一部分&#xff0c;对下管理系统所有硬件设备&…

R语言STAN贝叶斯线性回归模型分析气候变化影响北半球海冰范围和可视化检查模型收敛性...

原文链接&#xff1a;http://tecdat.cn/?p24334 像任何统计建模一样&#xff0c;贝叶斯建模可能需要为你的研究问题设计合适的模型&#xff0c;然后开发该模型&#xff0c;使其符合你的数据假设并运行&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频…

Flask狼书笔记 | 06_电子邮件

文章目录 6 电子邮件6.1 使用Flask-Mail发送6.2 使用事务邮件服务SendGrid6.3 电子邮件进阶6.4 小结 6 电子邮件 Web中&#xff0c;我们常在用户注册账户时发送确认邮件&#xff0c;或是推送信息。邮件必要的字段包含发信方(sender)&#xff0c;收信方(to)&#xff0c;邮件主题…

Miniconda3环境迁移

问题&#xff1a; conda之前安装的默认路径空间满了没法进行安装&#xff0c;为此将其进行迁移&#xff0c;但是迁移之后报错 bash: /data/anaconda3/bin/conda: /home/anaconda3/bin/python: 坏的解释器: 没有那个文件或目录解决方案&#xff1a; 1、修改~/.bashrc中的环境…

用通俗易懂的方式讲解大模型分布式训练并行技术:数据并行

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

【多尺度双域引导网络:Pan-sharpening】

Multi-Scale Dual-Domain Guidance Network for Pan-sharpening &#xff08;用于泛锐化的多尺度双域引导网络&#xff09; 全色锐化的目标是在纹理丰富的全色图像的指导下&#xff0c;通过超分辨低空间分辨率多光谱图像&#xff08;LRMS&#xff09;的对应物产生高空间分辨率…

Dedecms最新版--0day分享分析(二)

前言 接上一篇的Tricks&#xff0c;既然利用远程文件下载方式成为了实现RCE的最好方法&#xff0c;毕竟在执行的时候没有恶意shell文件&#xff0c;恶意木马被存放于远端服务器&#xff0c;那么下文的day就是对远程恶意文件的利用。 环境 下载最新版本&#xff1a; https://…

前端项目启动时报错:Use // eslint-disable-next-line to ignore the next line

前端项目启动时报错&#xff1a;Use // eslint-disable-next-line to ignore the next line 首先说一下这个问题产生的原因&#xff1a; 项目创建时设置了使用 eslint 进行代码规范检查。 解决办法&#xff1a; 找到webpack.base.conf.js文件&#xff0c;并且将下满这行代码…

在 linux 虚拟机上安装配置 hive

目录 一 下载hive 安装包 二 解压 hive 并配置环境变量 三 配置hive 的配置文件 四 更新 guava 五 hive初始化 六 开启远程连接 七 使用datagrip 连接 hive 一 下载hive 安装包 百度网盘资源如下&#xff1a; 链接: https://pan.baidu.com/s/18jF-Qri0hc52_rtL61O0YQ?…

常见的CSS兼容问题和解决方案

今天就来聊聊在为了您更好的体验&#xff0c;本文章聊聊如何仅支持谷歌浏览器访问查看页 前端开发经常需要检查浏览器的兼容性&#xff0c;这里推荐(Can I Use)这个查询网站。它是一个针对前端开发人员定制的一个查询CSS、JS、HTML5、SVG在主流浏览器中特性和兼容性的网站&…

RabbtiMQ的安装与使用

一、安装Erlang与Rabbitmq 安装教程本教程是在centos8下试验的&#xff0c;其实linux系统的都差不多RabbitMQ官方&#xff1a;Messaging that just works — RabbitMQRabbitMQ是开源AMQP实现&#xff0c;服务器端用Erlang语言编写&#xff0c;Python、Ruby、 NET、Java、JMS、c…

axios返回几种数据格式? 其中Blob返回时的size是什么意思?

axios返回几种数据格式? 其中Blob返回时的size是什么意思&#xff1f; 1、字符串&#xff08;String&#xff09;&#xff1a;服务器可以返回纯文本或HTML内容&#xff0c;Axios会将其作为字符串返回。 2、JSON&#xff08;JavaScript Object Notation&#xff09;&#xff…

C语言入门 Day_14 for循环

前言 我们定义了一个数组以后&#xff0c;要使用&#xff08;读取或者修改&#xff09;数组元素的话&#xff0c;可以一个一个的读取&#xff0c;就前两课学的那样&#xff0c;代码类似这个结构。 int number_list[5]{1,2,3,4,5}; printf("%d\n",number_list[0]); …

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL移植

一、环境介绍 RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。 二、芯片介绍 LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很…

第二章 Linux多进程开发 2.24-2.31 信号集及相关函数 共享内存 守护进程

有时间需要重新回顾 2.24 信号集及相关函数 1.用户通过键盘 Ctrl C, 产生2号信号SIGINT (信号被创建) 2.信号产生但是没有被处理 &#xff08;未决&#xff09; - 在内核中将所有的没有被处理的信号存储在一个集合中 &#xff08;未决信号集&#xff09; - SIGINT信号状态被…

第 3 章 栈和队列 (利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径))

1. 背景说明 广度优先通俗的解释的是将当前所有能走的步骤全部走完并保存在队列中&#xff0c;又称为层序遍历&#xff0c;此外&#xff0c;该方法类似于多条路线并发前进&#xff0c; 哪一条先到就取哪条路线作为结果并终止查询&#xff0c;因此能够得到最短路径&#xff0c;…

【JavaEE】_HTML

目录 1.HTML结构 2. HTML常用标签 2.1 注释标签 2.2 标题标签&#xff1a;h1~h6 2.3 段落标签&#xff1a;p 2.4 换行标签&#xff1a;br 2.5 格式化标签 2.6 图片标签&#xff1a;img 2.7 超链接标签&#xff1a;a 2.8 表格标签 2.9 列表标签 2.10 表单标签 2.10…

镜像的基本命令(docker)

文章目录 前言一、docker命令介绍1、帮助命令2、显示镜像3、搜索镜像4、下载镜像5、删除镜像 总结 前言 本文主要介绍docker中与镜像相关的一些命令&#xff0c;是对狂神课程的一些总结&#xff0c;作为一个手册帮助博主和使用docker的同学们来查找和回忆。 实验环境&#xf…

【Java 基础篇】深入理解 Java 中的抽象类:提高代码可维护性与扩展性

抽象类&#xff08;Abstract Class&#xff09;是 Java 面向对象编程中的一个重要概念。它允许我们定义一组抽象方法&#xff0c;这些方法可以被子类&#xff08;类&#xff09;实现。抽象类通常用于定义一些通用的方法和属性&#xff0c;但不能被实例化。本篇博客将深入探讨 J…

Java反序列化漏洞复现(weblogic和s2)

文章目录 weblogic启动环境漏洞扫描漏洞复现 S2-045启动环境漏洞复现 前提条件&#xff1a; 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub weblogic 启动环境 到下面路径下…