扩充巴科斯-瑙尔范式(ABNF)是一种基于巴科斯-瑙尔范式(BNF)的元语言,但它有自己的语法和派生规则。ABNF的原动原则是描述一种作为双向通信协议的语言。

ABNF是由第68号互联网标准("STD 68",大小写样式按照原文)定义的,也就是 RFC 5234,经常用于互联网工程任务组(IETF)通信协议的定义语言。RFC 5234 取代了 RFC 4234(取代了 RFC 2234 http://oss.org.cn/man/develop/rfc/RFC2234.txt).

有关它的用途, gRPC的协议定义就是用它书写的。 https://github.com/grpc/grpc-common/blob/master/PROTOCOL-HTTP2.md 

有关它的定义请参考:

http://tools.ietf.org/html/rfc5234  英文

http://blog.csdn.net/gjgsoft/article/details/7741304 

规则定义与字符

规则定义:

rule = definition ;comment

一条语句以回车换行结束。其中rule为规则名,大小写不敏感;definition为规则的具体定义;  ';'后作为注释

定义字符

语法:%<进制><具体数字>
<进制>有二进制,十进制,十六进制,分别表示为 b,d,x;
例子:       CR=%d13
                CR=%x0D
也可以用 空格或 '.' 连接多个字符:
                rulename    =  %d97 %d98 %d99
等价于       rulename    =  %d97.98.99
最终效果相当于"abc"

定义字符串

字符串用双引号包括。
         command     =  "command string"

注意:扩展巴克斯范式字符串大小写不敏感,并且这些串的字符集使用us-ascii字符集。

因此:

rulename = "abc"

以及:

rulename = "aBc"

将与“abc”,“Abc”,“aBc”,“abC”,“ABc”,“aBC”,“AbC”和“ABC”相匹配。

为了说明某个规则是大小写敏感的,请单独说明该规则使用的字符。

例如:

rulename    =  %d97 %d98 %d99

rulename    =  %d97.98.99

将仅与只由小写字符abc组成的串匹配。

;注释

分号起始一行注释直到行末。这是一个简单的方法,用于在说明中平行地包括有用的注解。

运算符

相加

rule=rule1 rule2; 规则相加

foo         =  %x61           ; a
         bar         =  %x62           ; b
         mumble      =  foo bar foo    ;mumble最终效果aba

选择(或)

规则1 / 规则2
由斜杠(“/”)分隔的元素是可选的。
因此, foo / bar
将接受<foo>或<bar>。

不定循环

*Rule
在元素前的操作符“*”表示重复。完整形式为:
<a>*<b>element
此处<a>和<b>是可选的十进制值,表示元素出现至少<a>次,至多<b>次。
默认值是0和无穷,因此
*<element>允许任何数字,包括0;
1*<element>需要至少1;
3*3<element>只允许3
而1*2<element>允许1或2。
 

可选序列

[RULE]
方括弧包括了一个可选元素序列:
[foo bar]
等同于
*1(foo bar).
可以出现,也可以不出现.
 

()组合规则

在()内的规则。对()外的规则来说,()内的规则被当作单独的规则对待。
         (foo / bar) blat
         效果相当于 foo blat / bar blat

 
参考资料:

ABNF(巴克斯范式)语法总结--根据RFC5234
http://blog.csdn.net/gjgsoft/article/details/7741304

 
 

最新文章

  1. thinkphp自动验证---$_validate
  2. [UWP]涨姿势UWP源码——RSS feed的获取和解析
  3. IOS 今天学到太多的知识了,赶快记录下来
  4. ubunt1204安装配置vsftp
  5. Java中几种常见排序算法
  6. 使用 AtomicInteger 进行计数(java多线程优化)
  7. LeetCode OJ 109. Convert Sorted List to Binary Search Tree
  8. 《调试九法&mdash;&mdash;软硬件错误的排查之道》【PDF】下载
  9. python使用tesseract-ocr完成验证码识别(安装部分)
  10. Day4 《机器学习》第四章学习笔记
  11. 你不知道的JavaScript--Item23 定时器的合理使用
  12. 关于出现Specified VM install not found: type Standard VM, name jdk1.5.0_04问题的解决办法
  13. 《c++ concurrency in action》读书笔记2--线程管理
  14. DNS实战--1
  15. 第28月第5天 uibutton交换方法
  16. CDH hue下定时执行hive脚步
  17. mongorestore 一次踩雷
  18. MySQL crash-safe replication(1)
  19. IIS发布网站之后,页面图片和js未加载出错
  20. BTA 常问的 Java基础40道常见面试题及详细答案

热门文章

  1. Django思维导图
  2. leetcode 75. 颜色分类 JAVA
  3. Weekly Contest 132
  4. (进阶篇)PHP(thinkphp5框架)实现用户注册后邮箱验证,激活帐号
  5. Android安全防护防护———Android 端常见的安全问题
  6. Redis的Pub/Sub机制存在的问题以及解决方案
  7. C#里面获取web和非web项目路径
  8. 怎么在eclipse中访问webservice
  9. WebDriverAPI(9)
  10. UML入门 之 交互图 -- 时序图 协作图详解