基本介紹
- 中文名:擴充巴科斯範式
- 外文名: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”可以使用下列規則:
- foo = %x61 ; a
- bar = %x62 ; b
- mumble = foo bar foo
選擇 /
規則1 / 規則2
一個規則可以通過用斜槓(“/”)分隔的可供選擇的子規則列表來定義。
要接受規則<foo>或規則<bar>可構造如下規則:
- foobar = foo / bar
增量選擇 =/
規則1 =/ 規則2
可以通過在規則名和定義之間使用“=/”來向一個規則增加補充選擇。
規則
- ruleset = alt1 / alt2 / alt3 / alt4 / alt5
等價於
- ruleset = alt1 / alt2
- ruleset =/ alt3
- ruleset =/ alt4 / alt5
值範圍%c##-##
%c##-##
數值範圍可以通過使用連字元(“-”)來指定。
規則
- OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
等價於
- OCTAL = %x30-37
序列組合 ()
(規則1規則2)
在定義中,元素可以放置在圓括弧中來將規則組合起來,該組合視為單個元素。
要匹配“elem foobar snafoo”或“elem tarfoo snafoo”可以構造下列規則:
- group = elem(foobar / tarfoo)snafoo
要匹配“elem foobar”或“tarfoo snafoo”可以構造下列規則:
- group = elem foobar / tarfoo snafoo
- 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)
注釋
;注釋
注釋從一個分號(“;”)開始,並持續到此行的結束。
操作符優先權
下面的操作符給出了從高(結合最緊密)到低(結合最鬆散)的優先權:
- 規則名、最終值
- 注釋;
- 值範圍%c##-##
- 重複*
- 組合 ()、可選[]
- 串聯
- 選擇 /
選擇操作符與串聯一起使用會造成混淆,因此建議使用組合來確保串聯組的明確。
例如:
我們 = 你 我/他 她
會產生下面兩種歧義:
- (你 我)/(他 她)
- (你) (我/他) (她)
所以,使用組合來確保不會產生歧義:
(你 我)/(他 她)