什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF
什么是BNF范式,什么又是EBNF范式?
巴科斯范式及其擴(kuò)展
BNF & Augmented BNF????
??????
???? 什么是巴科斯范式??
???
巴科斯范式(BNF: Backus-Naur Form 的縮寫(xiě))是由 John Backus 和 Peter Naur 首先引入的用來(lái)描述計(jì)算機(jī)語(yǔ)言語(yǔ)法的符號(hào)集。
現(xiàn)在,幾乎每一位新編程語(yǔ)言書(shū)籍的作者都使用巴科斯范式來(lái)定義編程語(yǔ)言的語(yǔ)法規(guī)則。????
??????
?????巴科斯范式的內(nèi)容??
在雙引號(hào)中的字("word")代表著這些字符本身。而double_quote用來(lái)代表雙引號(hào)。
在雙引號(hào)外的字(有可能有下劃線)代表著語(yǔ)法部分。?
尖括號(hào)( < > )內(nèi)包含的為必選項(xiàng)。?
方括號(hào)( [ ] )內(nèi)包含的為可選項(xiàng)。?
大括號(hào)( { } )內(nèi)包含的為可重復(fù)0至無(wú)數(shù)次的項(xiàng)。?
豎線( | )表示在其左右兩邊任選一項(xiàng),相當(dāng)于"OR"的意思。?
::= 是“被定義為”的意思。?
???
?????巴科斯范式示例??
???????? 這是用BNF來(lái)定義的Java語(yǔ)言中的For語(yǔ)句的實(shí)例:
| FOR_STATEMENT?::=? ????? "for" "(" ( variable_declaration |? ??( expression ";" ) | ";" )? ????? [ expression ] ";"? ????? [ expression ] ";"? ????? ")" statement |
???????? 這是Oracle packages的BNF定義:
| package_body ::= "package" package_name "is"? package_obj_body { package_obj_body }? [ "begin" seq_of_statements ]? "end" [ package_name ] ";" package_obj_body ::= variable_declaration? procedure_body ::= "procedure" procedure_name? statement ::= comment? |
??? 這是用BNF來(lái)定義的BNF本身的例子:
| syntax???? ::=? { rule } |
?????
?????擴(kuò)展的巴科斯范式 Augmented BNF??
??
RFC2234 定義了擴(kuò)展的巴科斯范式(ABNF)。近年來(lái)在Internet的定義中ABNF被廣泛使用。ABNF做了更多的改進(jìn),比如說(shuō),在ABNF中,尖括號(hào)不再需要。?
這里是要點(diǎn)一覽:
| "..." : 術(shù)語(yǔ)符號(hào)[...] : 選項(xiàng):最多出現(xiàn)一次{...} : 重復(fù)項(xiàng): 任意次數(shù),包括 0 次(...) : 分組| : 并列選項(xiàng),只能選一個(gè) 斜體字: 參數(shù),在其它地方有解釋 |
? <或項(xiàng)列表>::= ? ? <項(xiàng)> ? ? | ? ? <或項(xiàng)列表>|<項(xiàng)> ??
? <項(xiàng)>::= ? ? <非終結(jié)符> ? ? | ? ? <終結(jié)符> ? | ? <項(xiàng)><非終結(jié)符> ? | ? <項(xiàng)><終結(jié)符> ??
? <非終結(jié)符>::= ? ? ? <非終結(jié)符名> ??
? ??
? ( ? 但愿能有人看得懂:-) ? ) ??
? ??
? BNF就是巴科特·瑙爾式的縮寫(xiě), ??
? 在計(jì)算機(jī)的史前時(shí)代(1950s),曾有一位大師,他奠定了現(xiàn)代計(jì)算機(jī)的基礎(chǔ) ??
? 在他老人家的諸多成就之中,包括了對(duì)形式語(yǔ)言的研究,和發(fā)明了高級(jí)語(yǔ)言: ??
? FORTRAN。 ??
? 為了紀(jì)念他老人家,我們把他提出的一套描述語(yǔ)言的方法叫做BNF ??
? ??
? 其實(shí)BNF很簡(jiǎn)單::=表示定義 ? |表示或 ? 尖括號(hào)(<>)括起來(lái)的是非終結(jié)符 ??
? 所謂非終結(jié)符就是語(yǔ)言中某些抽象的概念,終結(jié)符就是可以直接出現(xiàn)在 ??
? 語(yǔ)言中的符號(hào) ??
? ??
? 比如:C語(yǔ)言的聲明語(yǔ)句可以用BNF這樣描述: ??
? <聲明語(yǔ)句> ? ::= ? <類(lèi)型><標(biāo)識(shí)符>; ? | ? <類(lèi)型><標(biāo)識(shí)符>[<數(shù)字>]; ??
? 這一句中<聲明語(yǔ)句>這個(gè)非終結(jié)符被定義成了兩種形式(上面用|隔開(kāi)的兩部分) ??
? 在這里引入了三個(gè)終結(jié)符: ? 分號(hào); ? ? 左右方括號(hào)[ ? ] ??
? ??
? <類(lèi)型> ? ::= ? <簡(jiǎn)單類(lèi)型> ? | ? <指針類(lèi)型> ? | ? <自定義類(lèi)型> ??
? <指針類(lèi)型> ? ::= ? <簡(jiǎn)單類(lèi)型> ? * ? | ? <自定義類(lèi)型> ? * ??
? <簡(jiǎn)單類(lèi)型> ? ::= ? int|char|double|float|long|short|void ??
? <自定義類(lèi)型> ? ::= ? enum<標(biāo)識(shí)符>|struct<標(biāo)識(shí)符>|union<標(biāo)識(shí)符>|<標(biāo)識(shí)符> ??
? 到這里就基本上把<類(lèi)型>定義清楚了 ??
? ??
? <數(shù)字> ? ::= ? 0X<十六進(jìn)制數(shù)字串> ? | ? 0<八進(jìn)制數(shù)字串> ? | ? <十進(jìn)制數(shù)字串> ??
? <十六進(jìn)制數(shù)字串> ? ::= ? <十六進(jìn)制數(shù)字> ? | ? <十六進(jìn)制數(shù)字串><十六進(jìn)制數(shù)字> ? ??
? <八進(jìn)制數(shù)字串> ? ::= ? <八進(jìn)制數(shù)字> ? | ? <八進(jìn)制數(shù)字串><八進(jìn)制數(shù)字> ? ??
? <十進(jìn)制數(shù)字串> ? ::= ? <十進(jìn)制數(shù)字> ? | ? <十進(jìn)制數(shù)字串><十進(jìn)制數(shù)字> ? ??
? <十六進(jìn)制數(shù)字> ? ::= ? <十進(jìn)制數(shù)字> ? | ? A ? | ? B ? | ? C ? | ? D ? | ? E ? | ? F ??
? <十進(jìn)制數(shù)字> ? ? ::= ? <八進(jìn)制數(shù)字> ? | ? 8 ? | ? 9 ? ??
? <八進(jìn)制數(shù)字> ? ::= ? 0 ? | ? 1 ? | ? 2 ? | ? 3 ? | ? 4 ? | ? 5 ? | ? 6 ? | ? 7 ??
? 到這里就把<數(shù)字>定義清楚了 ??
? ??
? <標(biāo)識(shí)符> ? ::= ? <字母> ? | ? <標(biāo)識(shí)符> ? <字母數(shù)字串> ??
? <字母數(shù)字串> ? ::= ? <字母>|<十進(jìn)制數(shù)字>|<字母數(shù)字串><字母>|<字母數(shù)字串><十進(jìn)制數(shù)字> ? ??
? <字母> ? ::= ? _ ? | ? <大寫(xiě)字母> ? | ? <小寫(xiě)字母> ??
? <小寫(xiě)字母> ? ::= ? a|b|c|d|e|f|g|h|i|j ? …… ? (偷個(gè)懶) ??
? <大寫(xiě)字母> ? ::= ? A|B|C|D|E|F|G|H|I|J ? …… ??
? ??
? 到此為止整個(gè)聲明語(yǔ)句就定義完了(就是說(shuō)已經(jīng)沒(méi)有非終結(jié)符了),雖然看起來(lái)很 ??
? 繁,但前面定義的各種非終結(jié)符都可以很容易的在別的地方重用比如,函數(shù)聲明 ??
? 可以定義成下面的樣子: ??
? <函數(shù)聲明語(yǔ)句> ? ::= ? <類(lèi)型><標(biāo)識(shí)符>(<形參表>); ??
? <形參表> ? ::= ? <類(lèi)型><標(biāo)識(shí)符> ? | ? <形參表>,<形參表> ??
? 只用兩句就描述完了,所以BNF實(shí)際上比用自然語(yǔ)言要簡(jiǎn)練得多 ??
? (整個(gè)C語(yǔ)言只用一二百句就可以描述清楚) ??
? 而且相當(dāng)?shù)木_,不會(huì)有自然語(yǔ)言中那種模棱兩可的表達(dá) ??
? 如果你對(duì)BNF比較敏感的話,會(huì)發(fā)現(xiàn)C里面的標(biāo)識(shí)符不能由數(shù)字開(kāi)頭 ??
? 而且在C里面下劃線是被當(dāng)做字母看待的(也就是說(shuō)能用字母的地方 ??
? 都可以用下劃線)比如:(最好用老一點(diǎn)的編譯器比如PDP11上的cc) ??
? #define ? ____ ? main ??
? #define ? ___ ? for ??
? typedef ? char* ? _____; ??
? int ? (*______)(char ? *, ? ...) ? = ? printf; ? //如果這一句不靈,就用下面這句 ??
? //#define ? ______ ? printf ? ? ? ? ? ? ? ? ? ? ? ? //如果你用的是C++可以試一下下面這個(gè) ??
? //int ? (*______)(const ? char ? *, ? ...) ? = ? printf; ? ??
? ??
? ____(_,char* ? __[]) ? //要是你編譯器不吃,可以改成int ? ____(int ? _,char*__[]) ??
? { ??
? ? ? ___( ? ; ? _ ? ; ? _ ? --) ??
? ? ? { ??
? ? ? ? ? ? ______("%s\n", ? __[_]); ??
? ? ? } ??
? } ??
? ??
? 另外,還有一種EBNF就沒(méi)有正宗的BNF這么爽了,也有很多人在用,前面的 ??
? 那些遞歸的定義被寫(xiě)成了{(lán)} ??
? ??
? 有一段時(shí)間PASCAL愛(ài)好者們喜歡用一個(gè)叫語(yǔ)法圖的東西,畫(huà)出來(lái)很難看,但 ??
? 功能和BNF差不多,現(xiàn)在好象已經(jīng)沒(méi)多少人用了 ??
? ??
? 近幾年流行另一種東西: ??
? digit ? = ? one ? of ??
? ? ? ? ? ? ? ? ? 0 ? 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ??
? 這里非終結(jié)符digit用斜體表示,one ? of是這種方法里定義的一個(gè)量詞(常用斜黑體) ??
? 我不喜歡這個(gè),因?yàn)槲已凵癫缓?#xff0c;常常分不清那個(gè)是斜體,那個(gè)是正體 ?
總結(jié)
以上是生活随笔為你收集整理的什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信用卡会自动提额吗 信用卡自动提额是多少
- 下一篇: 【转】3.3SharePoint服务器端