`
NEO_ONE
  • 浏览: 48646 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ABNF

    博客分类:
  • Java
 
阅读更多

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”可以使用下列规则:

  1. fu = %x61 ; a
  2. bar = %x62 ; b
  3. mumble = fu bar fu

选择

规则1 / 规则2

规则可以通过用反斜杠(“ / ”)分隔的多选一规则来定义。

要接受规则 <fu> 或规则 <bar> 可构造如下规则:

  1. fubar = fu / bar


递增选择

规则1 =/ 规则2

可以通过使用在规则名字和定义之间的“ =/ ”来向一个规则增加补充选择。

规则

  1. ruleset = alt1 / alt2 / alt3 / alt4 / alt5

等价于

  1. ruleset = alt1 / alt2
  2. ruleset =/ alt3
  3. ruleset =/ alt4 / alt5


值范围

%c##-##

数值范围可以通过使用连字符(“ - ”)来指定。

规则

  1. OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"

等价于

  1. OCTAL = %x30-37

序列分组

(规则1 规则2)

元素可以放置在圆括号中来组合定义中的规则。

要匹配“elem fubar snafu”或“elem tarfu snafu”可以构造下列规则:

  1. group = elem (fubar / tarfu) snafu

要匹配“elem fubar”或“tarfu snafu”可以构造下列规则:

  1. group = elem fubar / tarfu snafu
  2. group = (elem fubar) / (tarfu snafu)


可变重复

n*n规则

要指示一个元素的重复可以使用形式  <a>*<b>元素 。可选的  <a>  给出要包括的元素的最小数目,缺省为 0。可选的  <b>  给出要包括的元素的最大数目,缺省为无穷。

对零或多个元素使用  *元素 ,对一或多个元素使用  1*元素 ,对二或三个元素使用  2*3元素


特定重复

n规则

要指示明确数目的元素可使用形式  <a>元素 ,它等价于  <a>*<a>元素

使用  2DIGIT  得到两个数字,使用  3DIGIT  得到三个数字。(DIGIT 在下面的核心规则中定义)。


可选序列

[规则]

要指示可选元素下列构造是等价的:

  1. [fubar snafu]
  2. *1(fubar snafu)
  3. 0*1(fubar snafu)


注释

; 注释

分号(“ ; ”)开始一个注释并持续到此行的结束。


操作符优先级

上述操作符有从最紧绑定(binding)到最松绑定的给定优先级:

  1. 字符串,名字形成(formation)
  2. 注释
  3. 值范围
  4. 重复
  5. 分组,可选
  6. 串联
  7. 选择

与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。


核心规则

核心规则定义于 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

分享到:
评论

相关推荐

    ABNF、BNF 文法规范和开发指南

    ABNF(Augmented Backus-Naur Form)和BNF(Backus-Naur Form)是两种在计算机科学领域广泛使用的文法表示法,特别是在定义编程语言、数据格式和网络协议的标准时。这两种规范允许开发者精确地描述语言或协议的结构...

    科大讯飞ABNF文法规范

    科大讯飞ABNF文法规范是针对语音控制功能产品开发的一套规则体系,它基于万维网联盟(W3C)发布的语音识别语法规范1.0标准(SRGS1.0),并进行了适当删减、修改和扩展。ABNF文法规范采用增强的巴科斯范式(Augmented...

    ABNF语法开发指南

    Android集成语音开发时用到科大讯飞的SDK,当使用语法识别功能时,云端识别需要使用ABNF构建识别语法。

    ABNF程序

    多年来,巴克斯范式(BNF)的一个修订版,即扩展巴克斯范式(ABNF),已经在许多互 联网规范中流行。该版本平衡了压缩性和简单性,具有合理的表达能力。在早期的ARPA网 络中,每个规范都包含了自己的一个扩展...

    ABNF语法开发指南_讯飞ABNF语法开发指南.chm_

    ABNF(Augmented Backus-Naur Form,增强的巴科斯范式)是一种形式语法规则,用于定义文本标记语言的语法结构。在IT行业中,它常被用来规范网络协议、编程语言或数据格式的标准。讯飞作为一家领先的语音识别与人工...

    Augmented BNF for Syntax Specifications: ABNF

    ### Augmented BNF for Syntax Specifications: ABNF #### 1. 引言 在互联网技术规范中,常常需要定义一种格式语法。为了达到这一目的,作者可以自由选择他们认为有用的任何表示法。多年来,增强版巴克斯-诺尔范式...

    基于双核构架的ABNF字符串模式匹配处理器.pdf

    【标题】:“基于双核构架的ABNF字符串模式匹配处理器” 【描述】:这篇论文主要探讨了如何在ABNF(扩展巴克斯范式)字符串模式匹配处理器中采用双核架构来提高处理效率,减少回溯和分支情况,并增强内存访问效率。...

    一种面向ABNF模式匹配的处理器设计.pdf

    从提供的文件内容来看,文章主要介绍了一种面向ABNF(Augmented Backus-Naur Form,扩展巴科斯-诺尔范式)模式匹配的处理器设计。ABNF是一种用来描述通信协议语法的规则格式,在网络协议解析和处理中扮演着重要角色...

    apg-6.3:APG-ABNF解析器生成器,从ABNF语法生成递归下降解析器

    APG-ABNF解析器生成器 版本: 6.3 描述: APG是“ ABNF Parser Generator”的首字母缩写。 在C或C ++中生成解析器 从增强Backus-Naur格式(ABNF )语法语法的超集生成语言解析器和翻译器 接受有效的ABNF语法 接受...

    An ABNF parser In Perl

    Recursive-descent parser for an RFC 2234 ABNF grammar.It's probably silly to do this in Perl, but wottehell....

    Abnf To Antlr:将任何ABNF语法翻译成ANTLR-开源

    该开源项目"Abnf To Antlr"旨在将ABNF语法转换为ANTLR可以理解的形式,这样开发者就能轻松地将定义的ABNF规则应用于ANTLR支持的编程语言中,如Java、C#、Python等。这极大地简化了从ABNF到实际解析代码的转换过程,...

    abnf:用于golang-α阶段的ABNF

    abnf什么是abnf? abnf是Go语言中处理ABNF语法的库。支持哪个ABNC RFC? 带有勘误表的RFC 5234 2968 3076 RFC 7405工作特征根据语法验证字符串的有效性将语法序列化为ABNF字符串执照2句BSD待办事项/愿望清单写评论...

    sdp-cpp:具有ABNF严格解析的C ++ SDP库

    sdp ++ ABNF C ++ SDP库编译只需下载源代码,然后: make -j 4 -f Makefile CONF=Release然后该库应该在dist/Release/&lt;arch&gt;/libsdp-cpp.so用法只需包括include目录中的SessionDescription.h标头解析一个sdp字符串 #...

    abnf parser in C-开源

    abnf 解析器递归下降,带有简单的 c 预处理指令回溯此 abnf 解析器为指定的语法生成 abnf 解析器源代码!

    abnf_parsec:ABNF输入,解析器输出

    在Elixir编程语言中,`abnf_parsec`是一个用于处理ABNF规范并生成解析器的库。这个库可以帮助开发者从ABNF规范中自动生成解析代码,从而简化处理复杂语法的任务。 `abnf_parsec`的核心功能是将ABNF规则转换为解析...

    ABNF to GRXML Converter-开源

    ABNF (Augmented Backus-Naur Form) 和 GRXML (Grammar Rule eXtensible Markup Language) 是在语音识别和自然语言处理领域中重要的语法描述语言。这个开源项目提供了一个工具,能够将ABNF代码转换为GRXML,方便...

    cpp-abnf:增强Backus-Naur格式解释器

    ABNF代表“增强Backus-Naur形式”,是BNF的扩展版本。 控制台输出 要获取彩色输出(用于调试)... Powershell: Set-ItemProperty HKCU:\Console VirtualTerminalLevel -Type DWORD 1 Cmd: reg add HKCU\Console ...

    apg-js2:不推荐使用。 请使用更新的版本apg-js。 JavaScript APG 2.0版。 APG是ABNF解析器生成器。 它从ABNF语法的超集生成递归下降解析器

    查看描述APG是“ ABNF分析器生成器”的首字母缩写。 最初是为了直接从ABNF语法( )生成解析器而编写的,此后逐渐发展为包括许多需要附加语法术语的附加功能。 产生的语法是ABNF或的超集。 主要开发了一些功能来...

Global site tag (gtag.js) - Google Analytics