本備忘錄的狀態(tài)
本文檔講述了一種Internet社區(qū)的Internet標(biāo)準(zhǔn)跟蹤協(xié)議,它需要進(jìn)一步進(jìn)行討論和建
議以得到改進(jìn)。請(qǐng)參考最新版的“Internet正式協(xié)議標(biāo)準(zhǔn)”(STD1)來(lái)獲得本協(xié)議的標(biāo)準(zhǔn)化程
度和狀態(tài)。本備忘錄的發(fā)布不受任何限制。
版權(quán)聲明
Copyright(C)TheInternetSociety(1997).
目錄
1.介紹 2
2.規(guī)則定義 2
2.1規(guī)則命名 2
2.2規(guī)則格式 3
2.3終結(jié)符值 3
2.4外部編碼 4
3.操作符 4
3.1連接規(guī)則1規(guī)則2 4
3.2選擇 規(guī)則1/規(guī)則2 4
3.3增式選擇 規(guī)則1=/規(guī)則2 5
3.4值域選擇 %c##-## 5
3.5序列組 (Rule1Rule2) 5
3.6不定循環(huán) *Rule 5
3.7指定循環(huán) nRule 6
3.8可選序列 [RULE] 6
3.9;注釋 6
3.10操作符優(yōu)先級(jí) 6
4.擴(kuò)展巴克斯范式形式的擴(kuò)展巴克斯范式定義 7
5.安全考慮 7
6.附錄A-核心 8
6.1核心規(guī)則 8
6.2公共編碼 9
7.致謝 9
8.參考 9
9.作者地址 9
10.完整版權(quán)聲明 10
1.介紹
互聯(lián)網(wǎng)技術(shù)規(guī)范經(jīng)常需要定義一種格式化語(yǔ)法并能自由地使用作者認(rèn)為是有用的任何符
號(hào)。多年來(lái),巴克斯范式(BNF)的一個(gè)修訂版,即擴(kuò)展巴克斯范式(ABNF),已經(jīng)在許多互
聯(lián)網(wǎng)規(guī)范中流行。該版本平衡了壓縮性和簡(jiǎn)單性,具有合理的表達(dá)能力。在早期的ARPA網(wǎng)
絡(luò)中,每個(gè)規(guī)范都包含了自己的一個(gè)擴(kuò)展巴克斯范式定義。這樣的規(guī)范包括電子郵件規(guī)范
RFC733和之后的RFC822,這些規(guī)范已經(jīng)成為定義擴(kuò)展巴克斯范式的公共引用。本文檔將
這些定義分離出來(lái),以供有選擇的引用。可以預(yù)言,它也進(jìn)行了一些修改和增強(qiáng)。
標(biāo)準(zhǔn)巴克斯范式與擴(kuò)展巴克斯范式的區(qū)別包括命名規(guī)則,循環(huán),選擇,次序獨(dú)立以及值
域。附錄A(核心)提供了一組規(guī)則定義和編碼,該規(guī)則定義和編碼適用于某些互聯(lián)網(wǎng)規(guī)范
的核心詞法分析器。作為一種便利,在此給出了這些規(guī)則定義和編碼,另一方面,將它從本
文正文中定義的元語(yǔ)言中抽取出來(lái),同時(shí)也是將它從它的形式狀態(tài)中的分離出來(lái)。
2.規(guī)則定義
2.1規(guī)則命名
一個(gè)規(guī)則的名字簡(jiǎn)而言之就是名字本身;即,一個(gè)符號(hào)序列,該符號(hào)序列以字母打頭,
后跟一個(gè)字母或數(shù)字或連字符(下劃線)的組合。
注意:規(guī)則名大小寫不敏感
規(guī)則名<rulename>,<Rulename>,<RULENAME>和<rULENamE>都指同一個(gè)規(guī)則。
與原版的巴克斯范式不同,擴(kuò)展巴克斯范式中的中括號(hào)(“<”,“>”)不再需要。不過,
無(wú)論何時(shí)只要中括號(hào)有利于辨別規(guī)則名字的使用,它們都可以用來(lái)包括規(guī)則名字。這種表示
典型地用于限制自由格式的行文中規(guī)則名字的引用,或是區(qū)分結(jié)合在字符串中的未用空格符
分割的局部規(guī)則,這樣的例子,將在后邊討論循環(huán)時(shí)給出。
2.2規(guī)則格式
一個(gè)規(guī)則是由下面的序列定義的:
name=elementscrlf
此處<name>指規(guī)則名,<elements>指一個(gè)或多個(gè)規(guī)則名或是終結(jié)符,<crlf>是行結(jié)束標(biāo)
志,回車符后緊跟換行符。等號(hào)將規(guī)則名和規(guī)則的定義分隔開。元素構(gòu)成一個(gè)或多個(gè)規(guī)則名
(和/或)值的定義的序列,這些規(guī)則名(和/或)值依照本文中定義的各種操作符,如選擇
和循環(huán),結(jié)合在一起。
為了視覺舒適,規(guī)則定義按左對(duì)齊格式。當(dāng)一個(gè)規(guī)則需要多行時(shí),連續(xù)行要縮進(jìn)。左對(duì)
齊和縮進(jìn)是相對(duì)于擴(kuò)展巴克斯范式規(guī)則首行而言的,不必與文檔左邊界相齊。
2.3終結(jié)符值
規(guī)則分解成一串終結(jié)符值,有時(shí)也叫字符。在擴(kuò)展巴克斯范式中,一個(gè)字符僅僅是一個(gè)
非負(fù)整數(shù)。在某些特定環(huán)境中,將指定從值到字符集(如ASCII碼)的一個(gè)特殊映射(編碼)。
終結(jié)符由一個(gè)或多個(gè)數(shù)字字符說(shuō)明,這些數(shù)字字符的基本說(shuō)明由其他字符顯式指出。以
下的基是目前已經(jīng)定義的:
b=binary
d=decimal
x=hexadecimal
因此:
CR=%d13
CR=%x0D
分別說(shuō)明了[US-ASCII]中回車符的十進(jìn)制和十六進(jìn)制的表示。
下例是一個(gè)連續(xù)串值的壓縮表示,使用句點(diǎn)(“.”)來(lái)說(shuō)明在值中的符號(hào)間的分隔。因此:
CRLF=%d13.10
擴(kuò)展巴克斯范式允許在雙引號(hào)中直接說(shuō)明文字文本串。因此:
command="commandstring"
文字文本串解釋為可打印的字符連續(xù)集。
注意:擴(kuò)展巴克斯范式字符串大小寫不敏感,并且這些串的字符集使用us-ascii字符集。
因此:
rulename="abc"
以及:
rulename="aBc"
將與“abc”,“Abc”,“aBc”,“abC”,“ABc”,“aBC”,“AbC”和“ABC”相匹配。
為了說(shuō)明某個(gè)規(guī)則是大小寫敏感的,請(qǐng)單獨(dú)說(shuō)明該規(guī)則使用的字符。
例如:
rulename=%d97%d98%d99
或
rulename=%d97.98.99
將僅與只由小寫字符abc組成的串匹配。
2.4外部編碼
終結(jié)符值的外部表示根據(jù)存儲(chǔ)或傳輸環(huán)境的限制而變化。因此,基于相同的擴(kuò)展巴科斯
范式的語(yǔ)法可能有多個(gè)外部編碼,如其中之一是7位US-ASCII環(huán)境下的;另一個(gè)是二進(jìn)制
八位位組環(huán)境下的;當(dāng)使用16位Unicode編碼時(shí),還會(huì)有另一個(gè)不同的外部編碼。盡管附
錄A(核心)給出了7位US-ASCII編碼環(huán)境的定義,該環(huán)境在大多數(shù)互聯(lián)網(wǎng)應(yīng)用中很普遍,但
是,編碼細(xì)節(jié)超出了擴(kuò)展巴克斯范式的描述范圍。
將外部編碼從語(yǔ)法中分離出來(lái),目的是使得可替換的編碼環(huán)境能用于同一語(yǔ)法。
3.操作符
3.1連接規(guī)則1規(guī)則2
通過列出一系列規(guī)則名,一條規(guī)則可用于定義一個(gè)簡(jiǎn)單有序的值串--即,一連串鄰接的
字符。例如:
foo=%x61;a
bar=%x62;b
mumble=foobarfoo
因此規(guī)則<mumble>與小寫字符串"aba"匹配。
線性空白字符:連接操作處于擴(kuò)展巴克斯范式解析模型的核心。一串相鄰的字符(值)
根據(jù)擴(kuò)展巴克斯范式定義的規(guī)則進(jìn)行解析。就互聯(lián)網(wǎng)規(guī)范而言,過去允許線性空白字符(空
格符和水平制表符)在主結(jié)構(gòu),如分界特殊字符或原子字符串,兩邊自由發(fā)展以及隱含打印。
注意:本擴(kuò)展巴克斯范式規(guī)范沒有提供線性空白字符的隱式規(guī)范。
任何希望允許在分界符或字符串兩邊出現(xiàn)線性空白字符的語(yǔ)法必須顯式說(shuō)明之。對(duì)于那
些被更高層規(guī)則多次使用的“核心”規(guī)則,在其中提供這些空白字符常常是有用的。“核心”
規(guī)則可以編入一個(gè)詞法分析器中或簡(jiǎn)單地作為主規(guī)則集的一部分。
3.2選擇 規(guī)則1/規(guī)則2
由斜杠(“/”)分隔的元素是可選的。
因此,
foo/bar
將接受<foo>或<bar>。
注意:一個(gè)包含字母字符的引用串,是用于說(shuō)明選擇字符的特殊形式,它被解釋為一個(gè)
非終結(jié)符,該非終結(jié)符用所包含的字符,以指定的順序但可以是任意大小寫的混合方式,來(lái)
描述組合串集。
3.3增式選擇 規(guī)則1=/規(guī)則2
在段落中指定一列選擇有時(shí)會(huì)很方便。即,通過稍后的規(guī)則定義增加選擇集,一個(gè)初始
規(guī)則可能匹配一個(gè)或多個(gè)選擇。這對(duì)于那些源于同一父規(guī)則集而其他方面獨(dú)立的規(guī)范尤其有
用,如常出現(xiàn)于參數(shù)列表中。使用如下結(jié)構(gòu),擴(kuò)展巴克斯范式允許這樣的增式定義:
oldrule=/additional-alternatives
因此規(guī)則集
ruleset=alt1/alt2
ruleset=/alt3
ruleset=/alt4/alt5
與以下說(shuō)明相同:
ruleset=alt1/alt2/alt3/alt4/alt5
3.4值域選擇 %c##-##
通過使用連字符(“-”)表明可選值域的方式,可以緊縮說(shuō)明可選數(shù)值域。因此:
DIGIT=%x30-39
等同于:
DIGIT="0"/"1"/"2"/"3"/"4"/"5"/"6"/
"7"/"8"/"9"
連接的數(shù)值和數(shù)值域不能在同一串中說(shuō)明。一個(gè)數(shù)值可以用點(diǎn)號(hào)連接或使用連字符說(shuō)明
一個(gè)值域。因此,為了在行序列結(jié)束之間說(shuō)明一個(gè)可打印的字符,說(shuō)明格式如下:
char-line=%x0D.0A%x20-7E%x0D.0A
3.5序列組 (Rule1Rule2)
括號(hào)里的元素看作一個(gè)單一的元素,其內(nèi)容嚴(yán)格排序。因而,
(elemfoo)或(barblat)符合要求。
注意:當(dāng)選擇由多個(gè)規(guī)則名或文字組成時(shí),強(qiáng)烈建議使用分組符,而不要依賴“空”間
隔的正確閱讀。
因此推薦用如下形式代替上述形式:
(elemfoo)/(barblat)
該形式可以避免粗心讀者的誤解。
序列分組符也用于在自由行文中將一個(gè)元素序列從行文中分隔出來(lái)。
3.6不定循環(huán) *Rule
在元素前的操作符“*”表示重復(fù)。完整形式為:
<a>*<b>element
此處<a>和<b>是可選的十進(jìn)制值,表示元素出現(xiàn)至少<a>次,至多<b>次。
默認(rèn)值是0和無(wú)窮,因此*<element>允許任何數(shù)字,包括0;1*<element>需要至少1;
3*3<element>只允許3而1*2<element>允許1或2。
3.7指定循環(huán) nRule
如下形式的規(guī)則:
<n>element
等同于
<n>*<n>element
即,<element>正好出現(xiàn)<N>次。因而2DIGIT是一個(gè)2位數(shù),而3ALPHA是一個(gè)3字
母字符串。
3.8可選序列 [RULE]
方括弧包括了一個(gè)可選元素序列:
[foobar]
等同于
*1(foobar).
3.9;注釋
分號(hào)起始一行注釋直到行末。這是一個(gè)簡(jiǎn)單的方法,用于在說(shuō)明中平行地包括有用的注
解。
3.10操作符優(yōu)先級(jí)
上述各種機(jī)制具有以下優(yōu)先級(jí)關(guān)系,從上到下,優(yōu)先級(jí)依次從高(結(jié)合最緊密)到低(結(jié)
合最松散):
字符串,名字格式
注釋
值域
循環(huán)
分組,可選項(xiàng)
連接
選擇
隨意混用選擇操作符與連接操作符,會(huì)引起混淆。
再次提醒,推薦使用分組操作符顯式表明連接分組。
4.擴(kuò)展巴克斯范式形式的擴(kuò)展巴克斯范式定義
本語(yǔ)法使用附錄A(核心)中提供的規(guī)則
rulelist=1*(rule/(*c-wspc-nl))
rule=rulenamedefined-aselementsc-nl
;若下一行以空白字符開頭則繼續(xù)
rulename=ALPHA*(ALPHA/DIGIT/"-")
defined-as=*c-wsp("="/"=/")*c-wsp
;基本規(guī)則定義以及增式選擇
elements=alternation*c-wsp
c-wsp=WSP/(c-nlWSP)
c-nl=comment/CRLF
;注釋或新的一行
comment=";"*(WSP/VCHAR)CRLF
alternation=concatenation
*(*c-wsp"/"*c-wspconcatenation)
concatenation=repetition*(1*c-wsprepetition)
repetition=[repeat]element
repeat=1*DIGIT/(*DIGIT"*"*DIGIT)
element=rulename/group/option/
char-val/num-val/prose-val
group="("*c-wspalternation*c-wsp")"
option="["*c-wspalternation*c-wsp"]"
char-val=DQUOTE*(%x20-21/%x23-7E)DQUOTE
;SP和VCHAR的引用串,不使用DQUOTE
num-val="%"(bin-val/dec-val/hex-val)
bin-val="b"1*BIT
[1*("."1*BIT)/("-"1*BIT)]
;一系列的連續(xù)位值或單個(gè)ONEOF域
dec-val="d"1*DIGIT
[1*("."1*DIGIT)/("-"1*DIGIT)]
hex-val="x"1*HEXDIG
[1*("."1*HEXDIG)/("-"1*HEXDIG)]
prose-val="<"*(%x20-3D/%x3F-7E)">"
;括起來(lái)的SP和VCHAR字符串,不含尖括號(hào)
;行文描述,作為最后的方法來(lái)使用
5.安全考慮
本文檔確信與安全無(wú)關(guān)。
6.附錄A-核心
本附錄給出一個(gè)特定語(yǔ)法的便捷核心。附錄中的定義可作為規(guī)則的核心集使用。
6.1核心規(guī)則
某些基本規(guī)則使用大寫,如SP,HTAB,CRLF,DIGIT,ALPHA,等等。
ALPHA=%x41-5A/%x61-7A;A-Z/a-z
BIT="0"/"1"
CHAR=%x01-7F
;除NUL以外的任何7位US-ASCII字符
CR=%x0D
;回車
CRLF=CRLF
;互聯(lián)網(wǎng)標(biāo)準(zhǔn)格式的換行
CTL=%x00-1F/%x7F
;控制字符
DIGIT=%x30-39
;0-9
DQUOTE=%x22
;"(雙引號(hào))
HEXDIG=DIGIT/"A"/"B"/"C"/"D"/"E"/"F"
HTAB=%x09
;水平制表符
LF=%x0A
;換行
LWSP=*(WSP/CRLFWSP)
;線性空白字符(過去的換行)
OCTET=%x00-FF
;8位數(shù)據(jù)
SP=%x20
;空格符
VCHAR=%x21-7E
;可見(可打印)字符
WSP=SP/HTAB
;空白字符
6.2公共編碼
形式上,數(shù)據(jù)被描述成“網(wǎng)絡(luò)虛ASCII”,即有8位域的7位US-ASCII編碼,其中最高
位(第8位)置0。值串按“網(wǎng)絡(luò)字節(jié)順序”排列,高位字節(jié)在左邊并且在網(wǎng)絡(luò)中首先發(fā)送。
7.致謝
擴(kuò)展巴克斯范式的語(yǔ)法最初在RFC733中說(shuō)明。SRTInternational的KenL.Harrenstien
負(fù)責(zé)將巴克斯范式重新編碼成擴(kuò)展巴克斯范式,這樣使得描述更簡(jiǎn)短且更容易理解。
該新近項(xiàng)目始于一項(xiàng)簡(jiǎn)單的工作,希望從RFC822中精選出反復(fù)被非電子郵件規(guī)范作
者引用的部分,即,擴(kuò)展巴科斯范式的描述。工作組并非簡(jiǎn)單盲目地將已存在的文本轉(zhuǎn)變成
單獨(dú)的文檔,而是經(jīng)過15年對(duì)已有規(guī)范及相關(guān)規(guī)范優(yōu)缺點(diǎn)的仔細(xì)考慮,以求進(jìn)一步提高。
這使項(xiàng)目變得比最初的想法艱巨得多。有趣的是,盡管作出諸如刪除列表符這樣的讓人意外
的決定,結(jié)果并非與原作非常的不同。
最近一輪的規(guī)范由DRUMS工作組完成,感謝JeromeAbela,HaraldAlvestrand,Robert
Elz,RogerFajman,AvivaGarrett,TomHarsch,DanKohn,BillMcQuillan,KeithMoore,
ChrisNewman,PeteResnick和HenningSchulzrinne的杰出貢獻(xiàn)。
8.參考
[US-ASCII]CodedCharacterSet--7-BitAmericanStandardCodefor
InformationInterchange,ANSIX3.4-1986.
[RFC733]Crocker,D.,Vittal,J.,Pogran,K.,andD.Henderson,
"StandardfortheFormatofARPANetworkTextMessage,"RFC733,
November1977.
[RFC822]Crocker,D.,"StandardfortheFormatofARPAInternetText
Messages",STD11,RFC822,August1982.
9.作者地址
DavidH.CrockerPaulOverell
InternetMailConsortiumDemonInternetLtd
675SpruceDr.DorkingBusinessPark
Sunnyvale,CA94086USADorking
Surrey,RH41HN
UK
Phone:+14082468253
Fax:+14082496205
EMail:dcrocker@imc.orgpaulo@turnpike.com
10.完整版權(quán)聲明
Copyright(C)TheInternetSociety(1997).AllRightsReserved.
Thisdocumentandtranslationsofitmaybecopiedandfurnishedto
others,andderivativeworksthatcommentonorotherwiseexplainit
orassistinitsimplementationmaybeprepared,copied,published
anddistributed,inwholeorinpart,withoutrestrictionofany
kind,providedthattheabovecopyrightnoticeandthisparagraphare
includedonallsuchcopiesandderivativeworks.However,this
documentitselfmaynotbemodifiedinanyway,suchasbyremoving
thecopyrightnoticeorreferencestotheInternetSocietyorother
Internetorganizations,exceptasneededforthepurposeof
developingInternetstandardsinwhichcasetheproceduresfor
copyrightsdefinedintheInternetStandardsprocessmustbe
followed,orasrequiredtotranslateitintolanguagesotherthan
English.
Thelimitedpermissionsgrantedaboveareperpetualandwillnotbe
revokedbytheInternetSocietyoritssuccessorsorassigns.
Thisdocumentandtheinformationcontainedhereinisprovidedonan
"ASIS"basisandTHEINTERNETSOCIETYANDTHEINTERNET
ENGINEERING
TASKFORCEDISCLAIMSALLWARRANTIES,EXPRESSORIMPLIED,
INCLUDING
BUTNOTLIMITEDTOANYWARRANTYTHATTHEUSEOFTHE
INFORMATION
HEREINWILLNOTINFRINGEANYRIGHTSORANYIMPLIEDWARRANTIES
OF
MERCHANTABILITYORFITNESSFORAPARTICULARPURPOSE.