日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF

發(fā)布時(shí)間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是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?
| subtype_declaration?
| cursor_declaration?
| cursor_body?
| exception_declaration?
| record_declaration?
| plsql_table_declaration?
| procedure_body?
| function_body

procedure_body ::= "procedure" procedure_name?
[ "(" argument { "," argument } ")" ]?
"return" return_type?
"is"?
[ "declare" declare_spec ";" { declare_spec ";" } ]?
"begin"?
seq_of_statements?
[ "exception" exception_handler { exception_handler } ]?
"end" [ procedure_name ] ";"

statement ::= comment?
| assignment_statement?
| exit_statement?
| goto_statement?
| if_statement?
| loop_statement?
| null_statement?
| raise_statement?
| return_statement?
| sql_statement?
| plsql_block

??? 這是用BNF來(lái)定義的BNF本身的例子:

syntax???? ::=? { rule }
rule?????? ::=? identifier? "::="? expression
expression ::=? term { "|" term }
term?????? ::=? factor { factor }
factor???? ::=? identifier |
??????????????? quoted_symbol |
??????????????? "("? expression? ")" |
??????????????? "["? expression? "]" |
??????????????? "{"? expression? "}"
identifier ::=? letter { letter | digit }
quoted_symbol ::= """ { any_character } """

?????
?????擴(kuò)展的巴科斯范式 Augmented BNF??
??
  RFC2234 定義了擴(kuò)展的巴科斯范式(ABNF)。近年來(lái)在Internet的定義中ABNF被廣泛使用。ABNF做了更多的改進(jìn),比如說(shuō),在ABNF中,尖括號(hào)不再需要。?

什么是EBNF? 基本?(EBNF)?定義有關(guān)?EBNF?協(xié)定的詳細(xì)情況,可以參看?Computing Dictionary.?
這里是要點(diǎn)一覽:
"..." : 術(shù)語(yǔ)符號(hào)[...] : 選項(xiàng):最多出現(xiàn)一次{...} : 重復(fù)項(xiàng): 任意次數(shù),包括 0 次(...) : 分組| : 并列選項(xiàng),只能選一個(gè) 斜體字: 參數(shù),在其它地方有解釋
http://estone.nease.net/sgf/sgf4.html#2?里會(huì)給出一個(gè)EBNF在棋牌類(lèi)的應(yīng)用. -------------------------------------------------------------------------------------------- <BNF>::= ? ? <非終結(jié)符>::=<或項(xiàng)列表> ??
? <或項(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。