- 浏览: 46589 次
- 性别:
- 来自: 北京
最新评论
-
NEO_ONE:
awk '!x[$0]++' all_EN.txt > ...
Centos手动设置IP(不用dhcp) -
NEO_ONE:
Update Table1 set c = (select c ...
Oracle_Two
BNF
巴科斯范式(BNF
: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。
在BNF中,双引号中的字("word")代表着这些字符本身。而double_quote用来代表双引号。
在双引号外的字(有可能有下划线)代表着语法部分。
< > : 内包含的为必选项。
[ ] : 内包含的为可选项。
{ } : 内包含的为可重复0至无数次的项。
| : 表示在其左右两边任选一项,相当于"OR"的意思。
::= : 是“被定义为”的意思
"..." : 术语符号
[...] : 选项:最多出现一次
{...} : 重复项: 任意次数,包括 0 次
(...) : 分组
| : 并列选项,只能选一个
斜体字: 参数,在其它地方有解释
下面是是用BNF
来定义的Java语言中的For语句的实例:
FOR_STATEMENT ::=
"for" "(" ( variable_declaration |
( expression ";" ) | ";" )
[ expression ] ";"
[ expression ] ";"
")" statement
ABNF
RFC2234 定义了扩展的巴科斯范式(ABNF)。近年来在Internet的定义中ABNF被广泛使用。ABNF做了更多的改进。扩充巴科斯-瑙尔范式(ABNF) 基于了巴科斯-瑙尔范式(BNF),但由它自己的语法和推导规则构成。这种元语言的发起原则是描述作为通信协议(双向规范)的语言的形式系统。它建档 于 RFC 4234 中通常充当 IETF 通信协议的定义语言。
ABNF 规定是一组推导规则,写为
规则 = 定义 ; 注释 CR LF
这里的规则是大小写敏感的非终止符,定义由定义这个规则的符号序列,一个文档注释组成,并结束于回车换行。
规则名字是大小写不敏感的:
<rulename>
,
<Rulename>
,
<RULENAME>
和
<rUlENamE>
都提及同一个规则。规则名字由开始于一个字母的字母、数字和连字符组成。不要求用尖括号(“
<
”, “
>
”) (如 BNF 那样)包围规则名字。但是它们可以用来界定规则名字,比如在冗文中识别出规则名字的时候。ABNF 使用 7-位 ASCII 编码,在 8-位域中把高位置零。
终结符由一个或多个数值字符指定。数值字符可以指定为跟随着基数(b = 二进制, d = 十进制, x = 十六进制)的一个百分号“
%
”,随后是这个数值,或数值的串联(用“
.
” 来指示)。例如回车可以指定为十进制的
%d13
或十六进制的
%x0D
。回车换行可以指定为
%d13.10
。
文字正文通过使用包围在引号(
"
)
中字符串来指定。这些字符串是大小写不敏感的,使用的字符集是 US-ASCII。所以字符串“abc”将匹配“abc”, “Abc”, “aBc”,
“abC”, “ABc”, “AbC”, “aBC” 和 “ABC”。对于大小写敏感匹配,必须定义明确的字符: 要匹配 “aBc” 定义将是
%d97 %d66 %d99
。
操作符
空白被用来分隔定义的各个元素: 要使空格被识别为分割符则必须明确的包含它。
串联
规则1 规则2
规则可以通过列出一序列的规则名字来定义。
要匹配字符串“aba”可以使用下列规则:
-
fu = %x61 ; a
-
bar = %x62 ; b
-
mumble = fu bar fu
选择
规则1 / 规则2
规则可以通过用反斜杠(“
/
”)分隔的多选一规则来定义。
要接受规则 <fu> 或规则 <bar> 可构造如下规则:
-
fubar = fu / bar
递增选择
规则1 =/ 规则2
可以通过使用在规则名字和定义之间的“
=/
”来向一个规则增加补充选择。
规则
-
ruleset = alt1 / alt2 / alt3 / alt4 / alt5
等价于
-
ruleset = alt1 / alt2
-
ruleset =/ alt3
-
ruleset =/ alt4 / alt5
值范围
%c##-##
数值范围可以通过使用连字符(“
-
”)来指定。
规则
-
OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
等价于
-
OCTAL = %x30-37
序列分组
(规则1 规则2)
元素可以放置在圆括号中来组合定义中的规则。
要匹配“elem fubar snafu”或“elem tarfu snafu”可以构造下列规则:
-
group = elem (fubar / tarfu) snafu
要匹配“elem fubar”或“tarfu snafu”可以构造下列规则:
-
group = elem fubar / tarfu snafu
-
group = (elem fubar) / (tarfu snafu)
可变重复
n*n规则
要指示一个元素的重复可以使用形式
<a>*<b>元素
。可选的
<a>
给出要包括的元素的最小数目,缺省为 0。可选的
<b>
给出要包括的元素的最大数目,缺省为无穷。
对零或多个元素使用
*元素
,对一或多个元素使用
1*元素
,对二或三个元素使用
2*3元素
。
特定重复
n规则
要指示明确数目的元素可使用形式
<a>元素
,它等价于
<a>*<a>元素
。
使用
2DIGIT
得到两个数字,使用
3DIGIT
得到三个数字。(DIGIT 在下面的核心规则中定义)。
可选序列
[规则]
要指示可选元素下列构造是等价的:
-
[fubar snafu]
-
*1(fubar snafu)
-
0*1(fubar snafu)
注释
; 注释
分号(“
;
”)开始一个注释并持续到此行的结束。
操作符优先级
上述操作符有从最紧绑定(binding)到最松绑定的给定优先级:
- 字符串,名字形成(formation)
- 注释
- 值范围
- 重复
- 分组,可选
- 串联
- 选择
与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。
核心规则
核心规则定义于 ABNF 标准中。
ALPHA | %x41-5A / %x61-7A | 大写和小写 ASCII 字母 (A-Z a-z) |
DIGIT | %x30-39 | 数字 (0-9) |
HEXDIG | DIGIT / "A" / "B" / "C" / "D" / "E" / "F" | 十六进制数字 (0-9 A-F a-f) |
DQUOTE | %x22 | 双引号 |
SP | %x20 | 空格 |
HTAB | %x09 | 水平tab |
WSP | SP / HTAB | 空格和水平tab |
LWSP | *(WSP / CRLF WSP) | 线性空白(晚于换行) |
VCHAR | %x21-7E | 可见(打印)字符 |
CHAR | %x01-7F | 任何 7-位 US-ASCII 字符,不包括 NUL |
OCTET | %x00-FF | 8 位数据 |
CTL | %x00-1F / %x7F | 控制字符 |
CR | %x0D | 回车 |
LF | %x0A | 换行 |
CRLF | CR LF | 互联网标准换行 |
BIT | "0" / "1" |
例子
在巴科斯范式(BNF)条目中的邮政地址的例子可以被指定为:
postal-address = name-part street zip-part
name-part = *(personal-part SP) last-name [SP suffix] CRLF
name-part =/ personal-part CRLF
personal-part = first-name / (initial ".")
first-name = *ALPHA
initial = ALPHA
last-name = *ALPHA
suffix = ("Jr." / "Sr." / 1*("I" / "V" / "X"))
street = [apt SP] house-num SP street-name CRLF
apt = 1*4DIGIT
house-num = 1*8(DIGIT / ALPHA)
street-name = 1*VCHAR
zip-part = town-name "," SP state 1*2SP zip-code CRLF
town-name = 1*(ALPHA / SP)
state = 2ALPHA
zip-code = 5DIGIT ["-" 4DIGIT]
引用
- RFC 4234 Augmented BNF for Syntax Specifications: ABNF
- RFC 2234 Augmented BNF for Syntax Specifications: ABNF (Obsolete)
参考:
http://zh.wikipedia.org/wiki/扩充巴科斯范式#.E5.BA.8F.E5.88.97.E5.88.86.E7.BB.84
http://unique5945.javaeye.com/blog/109191
发表评论
-
android sdk manager不能更新
2012-09-05 20:55 930Eclipse输出错误reason: Connection t ... -
进制转换
2012-06-12 15:10 6191. 十 -----> 二 给你一个十进制,比如: ... -
解决process.waitFor()阻塞
2012-05-22 10:50 2536private static void exeBat(){ ... -
lucene3.5例子
2012-04-09 17:38 888package com.lucene; import j ... -
win端口占用查看
2012-01-09 16:58 741C:\>netstat -ano | findstr & ... -
全角半角转换
2011-11-09 17:39 833public class Convert { public ... -
System.getProperty()
2011-11-02 17:19 775java.version Java ... -
正则匹配标点
2011-10-27 15:39 668摘抄:str = str.replaceAll("[ ... -
暂时很强大的正则
2011-10-26 22:37 617最新手机号: (13[0-9]|15[0|3|6|7|8 ... -
JS post提交表单
2011-09-23 10:15 2166js post方式提交表单有两种办法,1:AJAX提交 2:在 ... -
轻量级synchronized
2011-09-19 10:59 891后台admin给用户加分,点的快了,会加两次分,在前台没限制的 ... -
MD5__java应用
2011-09-18 15:21 690public final static String enco ... -
会话跟踪
2011-09-11 10:32 646Cookie : 分为会话cookie,持久cookie ... -
MAP遍历
2011-09-08 23:07 616//最常规的一种遍历方法,最常规就是最常用的,虽然不复杂, ... -
JAVA date处理
2011-08-04 14:05 665Date now=new Date(); Lo ... -
java日期处理小例子
2011-07-22 11:47 553import java.text.SimpleDateForm ... -
action type redirect 参数传递
2011-06-16 15:10 954在使用Struts2开发时,有时需要用redirect 来跟多 ... -
js replace
2011-06-08 16:10 698去掉“” :req.responseText.replace ... -
java使用代理访问网络的几种方法
2011-06-02 14:23 893方法一使用系统属性来完成代理设置, 这种方法比较简单, 但是不 ... -
项目不能发布到Tomcat
2011-05-31 14:56 1024原因: 在工程转移过程中,导致工程的 ...
相关推荐
包含 ABNF语法开发指南 、sample.abnf、 abnf详细的文法规范
Android集成语音开发时用到科大讯飞的SDK,当使用语法识别功能时,云端识别需要使用ABNF构建识别语法。
主要介绍了一些ABNF的语法规范和语法规则,有助于我们更好地,快速开发有关语音控制功能的产品
多年来,巴克斯范式(BNF)的一个修订版,即扩展巴克斯范式(ABNF),已经在许多互 联网规范中流行。该版本平衡了压缩性和简单性,具有合理的表达能力。在早期的ARPA网 络中,每个规范都包含了自己的一个扩展...
讯飞ABNF语法开发指南.chm,便于使用讯飞平台进行开发
APG-ABNF解析器生成器 版本: 6.3 描述: APG是“ ABNF Parser Generator”的首字母缩写。 在C或C ++中生成解析器 从增强Backus-Naur格式(ABNF )语法语法的超集生成语言解析器和翻译器 接受有效的ABNF语法 接受...
Recursive-descent parser for an RFC 2234 ABNF grammar.It's probably silly to do this in Perl, but wottehell....
abnf什么是abnf? abnf是Go语言中处理ABNF语法的库。支持哪个ABNC RFC? 带有勘误表的RFC 5234 2968 3076 RFC 7405工作特征根据语法验证字符串的有效性将语法序列化为ABNF字符串执照2句BSD待办事项/愿望清单写评论...
一种面向ABNF模式匹配的处理器设计.pdf
基于双核构架的ABNF字符串模式匹配处理器.pdf
sdp ++ ABNF C ++ SDP库编译只需下载源代码,然后: make -j 4 -f Makefile CONF=Release然后该库应该在dist/Release/<arch>/libsdp-cpp.so用法只需包括include目录中的SessionDescription.h标头解析一个sdp字符串 #...
该项目已移至GitHub ... https://github.com/rpinchbeck/Abnf-To-Antlr
abnf 解析器递归下降,带有简单的 c 预处理指令回溯此 abnf 解析器为指定的语法生成 abnf 解析器源代码!
This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the ...
abnf_parsec:ABNF输入,解析器输出
ABNF代表“增强Backus-Naur形式”,是BNF的扩展版本。 控制台输出 要获取彩色输出(用于调试)... Powershell: Set-ItemProperty HKCU:\Console VirtualTerminalLevel -Type DWORD 1 Cmd: reg add HKCU\Console ...
查看描述APG是“ ABNF分析器生成器”的首字母缩写。 最初是为了直接从ABNF语法( )生成解析器而编写的,此后逐渐发展为包括许多需要附加语法术语的附加功能。 产生的语法是ABNF或的超集。 主要开发了一些功能来...
Web协议详解与抓包实战