什么是巴科斯范式?
巴科斯范式(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ī)則。
擴(kuò)展的巴科斯范式(Augmented BNF):
RFC2234 定義了擴(kuò)展的巴科斯范式(ABNF)。近年來(lái)在Internet的定義中ABNF被廣泛使用。ABNF做了更多的改進(jìn),比如說(shuō),在ABNF中,尖括號(hào)不再需要。
巴科斯范式基本語(yǔ)法:在雙引號(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)于”O(jiān)R”的意思。
::= 是“被定義為”的意思。
終結(jié)符就是可以直接出現(xiàn)在語(yǔ)言中的符號(hào),非終結(jié)符就是語(yǔ)言中某些抽象的概念。
用BNF定義BNF( 有意思吧 :)):
<BNF>::= <非終結(jié)符>::=<或項(xiàng)列表> <或項(xiàng)列表>::= <項(xiàng)> | <或項(xiàng)列表>|<項(xiàng)> <項(xiàng)>::= <非終結(jié)符> | <終結(jié)符> | <項(xiàng)><非終結(jié)符> | <項(xiàng)><終結(jié)符> <非終結(jié)符>::= <非終結(jié)符名> 比如可以用BFN這樣描述C語(yǔ)言的聲明語(yǔ)句:
<聲明語(yǔ)句> ::= <類(lèi)型><標(biāo)識(shí)符>; | <類(lèi)型><標(biāo)識(shí)符>[<數(shù)字>];
這一句中 <聲明語(yǔ)句> 這個(gè)非終結(jié)符被定義成了兩種形式(上面用 | 隔開(kāi)的兩部分),在這里引入了三個(gè)終結(jié)符: 分號(hào)(;)、左方括號(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á)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注