介紹
一個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.(你) (我/他) (她)
所以,使用 組合來確保不會產生歧義:
(你 我)/(他 她)
