擴充巴科斯範式

計算機科學中,擴充巴科斯-瑙爾範式(ABNF)是一種基於巴科斯-瑙爾範式(BNF)的元語言,但它有自己的語法和派生規則。ABNF的原動原則是描述一種作為雙向通信協定的語言的形式系統。它是由第68號網際網路標準("STD 68",大小寫樣式按照原文)定義的,也就是RFC 5234,經常用於網際網路工程任務組IETF)通信協定的定義語言。

RFC 5234取代了RFC 4234 (取代了RFC 2234).

基本介紹

  • 中文名:擴充巴科斯範式
  • 外文名:ABNF
介紹,最終值,操作符,空白字元,串聯,選擇 /,增量選擇 =/,值範圍%c##-##,序列組合 (),不定量重複m*n,定量重複n,可選序列[ ],注釋,操作符優先權,

介紹

一個ABNF規範是一些推導規則的集合,書寫為:
規則 = 定義;注釋CR LF
其中:
  • “規則”是不區分大小寫的非最終符號
  • “定義”由定義該規則的一系列符號組成
  • “注釋”用於記錄
  • “CR LF”(回車、換行)用來結束
規則名字是不區分大小寫的:<rulename>,<Rulename>,<RULENAME>和<rUlENamE>都提及同一個規則。規則名字由一個字母以及後續的多個字母、數字和連字元(減號)組成。
用尖括弧(“<”,“>”)包圍規則名並不是必需的(如同它們在BNF里那樣),但是它們可以用來在散文中界定規則名,以方便識別出規則名。

最終值

最終值由一個或多個數值字元指定。
數值字元可按下面的方式指定:先是一個百分號“%”,緊跟著基數(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. foo = %x61 ; a
  2. bar = %x62 ; b
  3. mumble = foo bar foo

選擇 /

規則1 / 規則2
一個規則可以通過用斜槓(“/”)分隔的可供選擇的子規則列表來定義。
要接受規則<foo>或規則<bar>可構造如下規則:
  1. foobar = foo / bar

增量選擇 =/

規則1 =/ 規則2
可以通過在規則名定義之間使用“=/”來向一個規則增加補充選擇。
規則
  1. ruleset = alt1 / alt2 / alt3 / alt4 / alt5
等價於
  1. ruleset = alt1 / alt2
  2. ruleset =/ alt3
  3. ruleset =/ alt4 / alt5

值範圍%c##-##

%c##-##
數值範圍可以通過使用連字元(“-”)來指定。
規則
  1. OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
等價於
  1. OCTAL = %x30-37

序列組合 ()

(規則1規則2)
定義中,元素可以放置在圓括弧中來將規則組合起來,該組合視為單個元素。
要匹配“elem foobar snafoo”或“elem tarfoo snafoo”可以構造下列規則:
  1. group = elem(foobar / tarfoo)snafoo
要匹配“elem foobar”或“tarfoo snafoo”可以構造下列規則:
  1. group = elem foobar / tarfoo snafoo
  2. group =(elem foobar)/(tarfoo snafoo)

不定量重複m*n

元素前面的星號*表示重複,其完整形式是:
m*n規則
要表示一個元素的重複,就要使用<m>*<n>元素形式。可選的<m>給出要包含的元素的最小數目,默認為0;可選的<n>給出要包含的元素的最大數目,默認為無窮大。
例子:
  • *元素表示零個或更多元素
  • 1*元素表示一個或更多元素
  • 2*4元素表示兩個至四個元素

定量重複n

n規則
要表示特定數目的元素可使用形式<n>元素,相當於用不定量重複形式表示的<n>*<n>元素。
使用2DIGIT得到兩個數字,使用3DIGIT得到三個數字。(DIGIT在下面的核心規則中定義,也見例子中的zip-code)。

可選序列[ ]

[規則]
要表示可選元素,下列構造是等價的:
  1. [foobar snafoo]
  2. *1(foobar snafoo)
  3. 0*1(foobar snafoo)

注釋

;注釋
注釋從一個分號(“;”)開始,並持續到此行的結束。

操作符優先權

下面的操作符給出了從高(結合最緊密)到低(結合最鬆散)的優先權:
  1. 規則名、最終值
  2. 注釋;
  3. 值範圍%c##-##
  4. 重複*
  5. 組合 ()、可選[]
  6. 串聯
  7. 選擇 /
選擇操作符與串聯一起使用會造成混淆,因此建議使用組合來確保串聯組的明確。
例如:
我們 = 你 我/他 她
會產生下面兩種歧義:
  1. (你 我)/(他 她)
  2. (你) (我/他) (她)
所以,使用組合來確保不會產生歧義:
(你 我)/(他 她)

相關詞條

熱門詞條

聯絡我們