• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            擴展巴科斯范式----EBNF

            擴展巴科斯-瑙爾范式(EBNF)是表達作為描述計算機編程語言形式語言的正規方式的上下文無關文法元語法符號表示法。它是基本巴科斯范式(BNF)元語法符號表示法的一種擴展。

            它最初由尼古拉斯·沃斯開發,最常用的 EBNF 變體由標準,特別是 ISO-14977 所定義。

             

            基本

            代碼,如由終結符即可視字符、數字、標點符號、空白字符等組成的計算機程序源代碼

            EBNF 定義了把各符號序列分別指派到非終結符產生規則:

            digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
            digit                = "0" | digit excluding zero ;

            這個產生規則定義了在這個指派的左端的非終結符 digit。豎杠表示可供選擇,而終結符被引號包圍,最后跟著分號作為終止字符。所以 digit 是一個 0 或可以是 1 2 3 直到 9 的一個 digit excluding zero

            產生規則還可以包括由逗號分隔的一序列終結符或非終結符:

            twelve                          = "1" , "2" ;
            two hundred one                 = "2" , "0" , "1" ;
            three hundred twelve            = "3" , twelve ;
            twelve thousand two hundred one = twelve , two hundred one ;

            可以省略或重復的表達式可以通過花括號 { ... } 表示:

            natural number = digit excluding zero , { digit } ;

            在這種情況下,字符串 1, 2, ...,10,...,12345,... 都是正確的表達式。要表示這種情況,于花括號內設立的所有東西可以重復任何次,包括根本不出現。

            可選項可以通過方括號 [ ... ] 表示:

            integer = "0" | [ "-" ] , natural number ;

            所以 integer 是一個零(0)或可能前導可選的負號的一個自然數。

            EBNF 還包括描述指定次數的重復,和排除產生式的某部分或向 EBNF 文法插入注釋的語法。

            依據 ISO 的擴展

            依據 ISO 14977 標準,提供了兩個設施來擴展 EBNF。其一是在 EBNF 文法部分的特殊序列,它是在問號包圍內的任意文本,其解釋超出了 EBNF 標準的范圍。例如,空格字符可以用如下規則定義:

            space = ? US-ASCII character 32 ?;

            其二利用圓括號在 EBNF 中不能放置到緊隨標識符之后的事實。下列不是有效的 EBNF:

            something = foo ( bar );

            所以 EBNF 的擴展可以使用這種表示法。例如,在 Lisp 文法中,函數應用可以用如下規則定義:

            function application = list( symbol , [ { expression } ] );

            擴展 BNF 的動機

            BNF 有著可選項和重復不能直接表達的問題。作為替代,它們需要利用中介規則或兩選一規則,對于可選項,定義要么是空的要么是可選的產生式的規則,對于重復,遞歸的定義要么是被重復的產生式要么是自身的規則。同樣的構造仍可用在 EBNF 中。

            可選項:

            signed number = [ sign , ] number ;

            可按 BNF-風格定義為:

            signed number = sign , number | number ;

            signed number = optional sign , number ;
            optional sign = ε | sign ; (* 使用 ε 來更清晰的指示空產生式 *)

            重復:

            number = { digit } ;

            可按 BNF-風格定義為:

            number = digit | number digit;

            其他增加和修改

            EBNF 排除了 BNF 的一些缺陷:

            • BNF 為自身使用了符號 (<, >, |, ::=)。當它們出現在要定義的語言中的時候,BNF 不能不加以修改或解釋的使用。
            • BNF-語法在一行中只表示一個規則。

            EBNF 解決了這些問題:

            • 終結符被嚴格的包圍在引號 ("..." '...') 中。給非終結符的尖括號 ("<...>")可以省略。
            • 通常使用終止字符分號結束一個規則。

            進一步還提供了定義重復次數,排除法選擇(比如除了引號的所有字符)和注釋等的增強機制。

            不管所有這些增強,EBNF 在能定義的語言的意義上不比 BNF 更強大。在原理上用 EBNF 定義的任何文法都可以用 BNF 表達。但是經常導致可觀的更多規則的表示。

            EBNF 已經被ISO用代碼 ISO/IEC 14977:1996(E) 標準化了。

            在某些場合任何擴展的 BNF 都被稱為 EBNF。例如 W3C 使用 one EBNF 來規定 XML

            另一個例子

            只允許賦值的簡單編程語言可以用 EBNF 定義為:

            (* a simple program in EBNF ? Wikipedia *)
            program = 'PROGRAM' , white space , identifier , white space ,
                       'BEGIN' , white space ,
                       { assignment , ";" , white space } ,
                       'END.' ;
            identifier = alphabetic character , [ { alphabetic character | digit } ] ;
            number = [ "-" ] , digit , [ { digit } ] ;
            string = '"' , { all characters ? '"' } , '"' ;
            assignment = identifier , ":=" , ( number | identifier | string ) ;
            alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G"
                                 | "H" | "I" | "J" | "K" | "L" | "M" | "N"
                                 | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
                                 | "V" | "W" | "X" | "Y" | "Z" ;
            digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
            white space = ? white space characters ? ;
            all characters = ? all visible characters ? ;

            一個語法上正確的程序:

            PROGRAM DEMO1 
            BEGIN
              A0:=3;
              B:=45;
              H:=-100023;
              C:=A;
              D123:=B34A;
              BABOON:=GIRAFFE;
              TEXT:="Hello world!";
            END.

            這個語言可以輕易的擴展上控制流,算術表達式和輸入/輸出指令。就可以開發出一個小的、可用的編程語言了。


            使用了在標準中提議為正規表示的下列字符:

            用途

            符號表示

            定義

            =

            串接

            ,

            終止

            ;

            分隔

            |

            可選

            [ ... ]

            重復

            { ... }

            分組

            ( ... )

            雙引號

            " ... "

            單引號

            ' ... '

            注釋

            (* ... *)

            特殊序列

            ? ... ?

            除外

            -

            約定

            1. 使用了如下約定:

            • 擴展 BNF 每個元標識符都被寫為用連字號連接起來的一個或多個字;
            • 結束于“-symbol 的元標識符是擴展 BNF 的終結符的名字。

            2. 表示擴展 BNF 的每個操作符的正常字符和它所蘊涵的優先級(頂部為最高優先級):

            * repetition-symbol
            - except-symbol
            , concatenate-symbol
            | definition-separator-symbol
            = defining-symbol
            ; terminator-symbol

            3. 下列括號對超越正常優先級:

              first-quote-symbol            first-quote-symbol  
            "  second-quote-symbol          second-quote-symbol  "
            (* start-comment-symbol          end-comment-symbol *)
            (  start-group-symbol              end-group-symbol  )
            [  start-option-symbol            end-option-symbol  ]
            {  start-repeat-symbol            end-repeat-symbol  }
            ?  special-sequence-symbol   special-sequence-symbol ?

            作為例子,下列語法規則展示了表達重復的設施:

            aa = "A";
            bb = 3 * aa, "B";
            cc = 3 * [aa], "C";
            dd = {aa}, "D";
            ee = aa, {aa}, "E";
            ff = 3 * aa, 3 * [aa], "F";
            gg = {3 * aa}, "D";

            這些規則定義的終結字符串如下:

            aa: A
            bb: AAAB
            cc: C AC AAC AAAC
            dd: D AD AAD AAAD AAAAD etc.
            ee: AE AAE AAAE AAAAE AAAAAE etc.
            ff: AAAF AAAAF AAAAAF AAAAAAF
            gg: D AAAD AAAAAAD etc.

            有關工作

             

            posted on 2008-09-20 02:09 肥仔 閱讀(1609) 評論(0)  編輯 收藏 引用 所屬分類: LEX & YACC

            91久久精品国产91性色也| 亚洲欧美精品一区久久中文字幕 | 久久精品国产免费观看| 97久久婷婷五月综合色d啪蜜芽| 国产成人综合久久久久久| 婷婷久久精品国产| 亚洲精品国产美女久久久| 色8久久人人97超碰香蕉987| 久久国产影院| 欧美日韩精品久久免费| Xx性欧美肥妇精品久久久久久| 久久久久亚洲Av无码专| 精品永久久福利一区二区| 亚洲国产精品无码久久SM | 久久最新精品国产| 亚洲精品高清一二区久久 | 日韩人妻无码精品久久久不卡 | 久久国产精品无码一区二区三区 | 久久青青草原国产精品免费 | 麻豆精品久久精品色综合| 久久精品国产一区二区三区| 亚洲女久久久噜噜噜熟女| 9999国产精品欧美久久久久久 | 久久强奷乱码老熟女网站| 日韩精品久久无码人妻中文字幕| 久久天天躁狠狠躁夜夜avapp| 久久一区二区三区免费| 久久99热精品| 99久久精品国产一区二区| 伊人色综合久久天天人手人婷| 伊人久久大香线蕉精品| 日韩一区二区久久久久久 | 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 97久久精品人人做人人爽| 97久久国产露脸精品国产| 亚洲中文字幕无码久久综合网| 亚洲国产成人久久精品99 | 久久婷婷五月综合成人D啪| 国产精品狼人久久久久影院| 丁香五月综合久久激情| 久久久久久免费视频|