BNF express
巴科斯範式(BNF: Backus-Naur Form 的縮寫)是由 John Backus 和 Peter Naur 首先引入的用來描述計算機語言語法的符號集。如今,幾乎每一位新編程語言書籍的做者都使用巴科斯範式來定義編程語言的語法規則。 編程
在BNF中,雙引號中的字("word")表明着這些字符自己。而double_quote用來表明雙引號。 c#
在雙引號外的字(有可能有下劃線)表明着語法部分。 編程語言
< > : 內包含的爲必選項。
[ ] : 內包含的爲可選項。
{ } : 內包含的爲可重複0至無數次的項。
| : 表示在其左右兩邊任選一項,至關於"OR"的意思。
::= : 是「被定義爲」的意思
"..." : 術語符號
[...] : 選項,最多出現一次
{...} : 重複項,任意次數,包括 0 次
(...) : 分組
| : 並列選項,只能選一個
斜體字: 參數,在其它地方有解釋 post
下面是是用BNF來定義的Java語言中的For語句的實例: 編碼
FOR_STATEMENT ::= "for" "(" ( variable_declaration | ( expression ";" ) | ";" ) [ expression ] ";" [ expression ] ";" ")" statement
ABNFspa
RFC2234 定義了擴展的巴科斯範式(ABNF)。近年來在Internet的定義中 ABNF 被普遍使用。ABNF 作了更多的改進。擴充巴科斯-瑙爾範式(ABNF)基於了巴科斯-瑙爾範式(BNF),但由它本身的語法和推導規則構成。這種元語言的發起原則是描述做爲通訊協議(雙向規範)的語言的形式系統。它建檔於 RFC 4234 中一般充當 IETF 通訊協議的定義語言。code
ABNF 規定是一組推導規則,寫爲:orm
規則 = 定義 ; 註釋 CR LF
這裏的規則是大小寫敏感的非終止符,定義由定義這個規則的符號序列,一個文檔註釋組成,並結束於回車換行。blog
規則名字是大小寫不敏感的: <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)到最鬆綁定的給定優先級:
與串聯一塊兒使用選擇操做符能夠形成混淆,建議使用分組來作明確串聯分組。
核心規則
核心規則定義於 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]
引用
參考