BNF 和 ABNF 扩充巴科斯范式 了解

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 = 十六进制)的一个百分号“%”,随后是这个数值,或数值的串联(用“.” 来指示)。例如回车可以指定为十进制的 ?3 或十六进制的 %x0D。回车换行可以指定为 ?3.10

文字正文通过使用包围在引号(") 中字符串来指定。这些字符串是大小写不敏感的,使用的字符集是 US-ASCII。所以字符串“abc”将匹配“abc”, “Abc”, “aBc”, “abC”, “ABc”, “AbC”, “aBC” 和 “ABC”。对于大小写敏感匹配,必须定义明确的字符: 要匹配 “aBc” 定义将是 ?7 ?6 ?9

操作符

空白被用来分隔定义的各个元素: 要使空格被识别为分割符则必须明确的包含它。

串联

规则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]
时间: 2024-10-10 10:20:46

BNF 和 ABNF 扩充巴科斯范式 了解的相关文章

扩充巴科斯范式(ABNF)

BNF:巴科斯范式ABNF(Augmented Backus-Naur Form):扩充巴科斯范式 ABNF是由第68号互联网标准(”STD 68″,大小写样式按照原文)定义的,也就是 RFC 5234,经常用于互联网工程任务组(IETF)通信协议的定义语言.RFC 5234 取代了 RFC 4234(取代了 RFC 2234). 学习ABNF:ABNF规则的介绍 获取RFC对应的ABNF文件:在 这里 输入RFC number就可以获得该RFC对应的ABNF文件了. ABNF Parser G

扩充巴科斯-瑙尔范式 ABNF简介

扩充巴科斯-瑙尔范式(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). 有关

巴科斯范式和sql语言

查询Mysql帮助文档,如何写SQL语句的时候,需要注意SQL语法,这里就需要知道BNF巴科斯范式. 巴科斯范式:BNF用于描述计算机语言.基本的规则如下: 尖括号<> 内包含的为必选项. 方括号[]   内包含的为可选项. 大括号{}  内包含的为可重复0至无数次的项. 竖线|       表示在其左右两边任选一项,相当于"OR"的意思. ::=         是被定义为的意思. Mysql的语法基本符合巴科斯范式,但有一些不同,如下: {} 表示必选项, ,... 表

触手不及(巴科斯范式求表达式树)

本题为学军神犇 cxt 出的神题. 题意 为了避免流露出自己的感情伤害别人, 小 M.M.T. 决定通过一个表达式来传递心意. 给出一个等式. 等式左边是一个 \(int\) 范围内的数, 等式右边是一个合法的 c++ 表达式. 例如:\(233 = 66 ? 4 ? 31\) 保证等式右边只包含数字 \(x (x ∈ [0, p),p\) 是给定的质数\()\), 加号, 减号, 乘号, 除号, 左右括号. 保证等式中没有任何空格,tab 等不可见字符. 而且保证合法. 但是遗憾的是, 因为一

BNF范式(巴科斯范式)简介

BNF 规定是推导规则(产生式)的集合,写为: <符号> ::= <使用符号的表达式> 这里的 <符号> 是非终结符,而表达式由一个符号序列,或用指示选择的竖杠'|' 分隔的多个符号序列构成,每个符号序列整体都是左端的符号的一种可能的替代.从未在左端出现的符号叫做终结符. 基本原理      BNF类似一种数学游戏:从一个符号开始(叫做起始标志,实例中常用S表示),然后给出替换前面符号的规则.BNF语法定义的语言只不过是一个字符串集合,你可以按照下述规则书写,这些规则叫

本体概述

原文地址:http://blog.csdn.net/sfbegingmail/article/details/6093010 本体的定义 Ontology的概念最初起源于哲学领域,可以追溯到公元前古希腊哲学家亚里士多德(384-322 b.c.)尝试对世界上的事物分类,在哲学中定义为"对世界上客观存在物的系统地描述,即存在论"[1].牛津英语词典定义为"存在的科学或研究".当不同的理论家提出本体的不同建议,或者不同的知识领域谈论本体建议时,应该使用本体的复数即本体论

表达式的语法解析(面向对象的表达式计算器2)

巴科斯范式(BNF) 1.在双引号中的字("word")代表着这些字符本身.而double_quote用来代表双引号. 2.在双引号外的字(有可能有下划线)代表着语法部分. 3.尖括号( < > )内包含的为必选项. 4.方括号( [ ] )内包含的为可选项. 5.大括号( { } )内包含的为可重复0至无数次的项. 6.竖线( | )表示在其左右两边任选一项,相当于"OR"的意思. 7.::= 是“被定义为”的意思. 表达式的BNF表示 一个表达式分解

Yacc 与 Lex 快速入门

Yacc 与 Lex 快速入门 Lex 与 Yacc 介绍 Lex 和 Yacc 是 UNIX 两个非常重要的.功能强大的工具.事实上,如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏.Ashish Bansal 为您详细的讨论了编写自己的语言和编译器所用到的这两种工具,包括常规表达式.声明.匹配模式.变量.Yacc 语法和解析器代码.最后,他解释了怎样把 Lex 和 Yacc 结合起来. 5 评论 Ashish Bansal ([ema

闲聊Backus Naur Form

我们程序员,每天都享受着巴科斯-诺尔(BNF范式)范式,给我们带来的程序语言世界. 但,大多数人,对他们二人知之甚少.我也不例外. 我也不想引用任何文献,就自己所了解的,这里做个小笔记. 先说一下ENIAC小组. 冯.诺依曼由ENIAC机研制组的戈尔德斯廷中尉介绍参加ENIAC机研制小组. 之后,冯.诺依曼写了他的著名论文,为当代计算机体系打下基础. 冯.诺依曼发明了许多东西,但冯.诺依曼是个数学家,他对计机算虽然热情相当高,因为他要用计算机来计算,说白了,他还是一个数学家,只是需要计算机进行巨