擴充巴科斯範式

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

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

介紹

一個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”可以使用下列規則:

foo = %x61 ; a

bar = %x62 ; b

mumble = foo bar foo

1.

foo = %x61 ; a

2.

bar = %x62 ; b

3.

mumble = foo bar foo

選擇 /

規則1 / 規則2

一個規則可以通過用斜槓(“/”)分隔的可供選擇的子規則列表來定義。

要接受規則<foo>或規則<bar>可構造如下規則:

foobar = foo / bar

1.

foobar = foo / bar

增量選擇 =/

規則1 =/ 規則2

可以通過在 規則名和 定義之間使用“=/”來向一個規則增加補充選擇。

規則

ruleset = alt1 / alt2 / alt3 / alt4 / alt5

1.

ruleset = alt1 / alt2 / alt3 / alt4 / alt5

等價於

ruleset = alt1 / alt2

ruleset =/ alt3

ruleset =/ alt4 / alt5

1.

ruleset = alt1 / alt2

2.

ruleset =/ alt3

3.

ruleset =/ alt4 / alt5

值範圍%c##-##

%c##-##

數值範圍可以通過使用連字元(“-”)來指定。

規則

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

1.

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

等價於

OCTAL = %x30-37

1.

OCTAL = %x30-37

序列組合 ()

(規則1規則2)

在 定義中,元素可以放置在圓括弧中來將 規則組合起來,該組合視為單個元素。

要匹配“elem foobar snafoo”或“elem tarfoo snafoo”可以構造下列規則:

group = elem(foobar / tarfoo)snafoo

1.

group = elem(foobar / tarfoo)snafoo

要匹配“elem foobar”或“tarfoo snafoo”可以構造下列規則:

group = elem foobar / tarfoo snafoo

group =(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)。

可選序列[ ]

[規則]

要表示可選元素,下列構造是等價的:

[foobar snafoo]

*1(foobar snafoo)

0*1(foobar snafoo)

1.

[foobar snafoo]

2.

*1(foobar snafoo)

3.

0*1(foobar snafoo)

注釋

;注釋

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

操作符優先權

下面的操作符給出了從高(結合最緊密)到低(結合最鬆散)的優先權:

規則名、最終值

注釋;

值範圍%c##-##

重複*

組合 ()、可選[]

串聯

選擇 /

1.

規則名、最終值

2.

注釋;

3.

值範圍%c##-##

4.

重複*

5.

組合 ()、可選[]

6.

串聯

7.

選擇 /

選擇操作符與 串聯一起使用會造成混淆,因此建議使用 組合來確保串聯組的明確。

例如:

我們 = 你 我/他 她

會產生下面兩種歧義:

(你 我)/(他 她)

(你) (我/他) (她)

1.

(你 我)/(他 她)

2.

(你) (我/他) (她)

所以,使用 組合來確保不會產生歧義:

(你 我)/(他 她)

相關詞條

熱門詞條

聯絡我們