dhrnameのブログ

プログラミング関連を語るよ

ヴィルト拡張バッカスナウア記法(EBNF)をXML化する

この記事の目的

 ソフトウェア開発者のために、EBNFをXML文書化するのが、今回の目的である。

EBNFとXMLについてのおさらい

拡張バッカスナウア記法(EBNF)とは

 拡張バッカスナウア記法(EBNF)とは、Algol60言語で採用されたバッカスナウア記法(BNF)をヴィルトが拡張したものである*1形式言語の文法を記述したいときに使う。

拡張マークアップ言語(XML)とは

 拡張マークアップ言語(XML)とは、W3Cが提唱したマークアップ言語である。当初はISO SGMLのサブセット規格として出発した。

EBNFをXML文書に落とし込む

 簡単のため、HTML言語を拡張したものを「XML文書」として扱うよう約束しておく。そうすると、sample.xmlのような、ファイルの拡張子に「xml」を付けた文書のソースは次のようになる。

sample.xmlソースコード

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"><head>
 <title>EBNFをXML化</title>
    <link rel="stylesheet" href="style.css"/>
 <meta http-equiv="content-type" content="application/xml; charset=UTF-8"/>
</head>


<body>
 <h1>EBNFをXML化</h1>
    <section>
        <h2>文法</h2>
        <開始記号>
            <連接>主語 目的語 述語</連接>
        </開始記号>
        <定義><名前>主語</名前>文字列
        </定義>
        <定義><名前>述語</名前>文字列
        </定義>
        <定義><名前>目的語</名前>文字列
        </定義>
        <定義><名前>文字列</名前>
            <連接>文字
                <反復>文字</反復>
            </連接>
        </定義>
        <定義><名前>文字</名前>
            <選択>英字|ひらがな|カタカナ|漢字</選択>
        </定義>
        <定義><名前>英字</名前>
            <選択>"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"|"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"</選択>
        </定義>
</section>
</body></html>

スタイルシートを用いる

 さらに、以下のようなstyle.cssというスタイルシートを作っておいて、sample.xmlと同じディレクトリ(フォルダ)に置いておく。

style.cssソースコード

連接{display:inline;}
連接::before{content:"("}
連接::after{content:")"}
選択{display:inline;}
選択::before{content:"("}
選択::after{content:")"}
反復{display:inline;}
反復::before{content:"("}
反復::after{content:")*"}
有無{display:inline;}
有無::before{content:"("}
有無::after{content:")?"}
開始記号{display:block; color:blue;}
定義{display:block;}
名前{display:inline;}
名前::after{content:":="}

ブラウザで表示させる

 今回はFirefox145.0.1 (Win11 HOME)を用いて、sample.xmlをローカルで表示させたところ、

            主語 目的語 述語        
       
主語:=文字列        
       
述語:=文字列        
       
目的語:=文字列        
       
文字列 :=           ( 文字                 (文字)*)                    
       
文字:=             (英字|ひらがな|カタカナ|漢字)

英字:=             ("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"|"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")

と表示された。 

注意点

.htmlのように拡張子が「html」だと失敗するので、xmlの拡張子を付けるようにしなければならない。

課題

 まだ、スタイルシートを使った装飾という点では、問題がある。例えば、開始記号は青い文字色で表現しているだけである。しかし、DOMで処理させればコンパイラの処理も楽になるのではないかという期待もある。EBNFとの比較と解説はいずれ時間があるときに書いていく。

*1:『ヴィルトのコンパイラ構成法』(ニクラウス・ヴィルト著、滝沢徹・牧野裕子訳、アジソン・ウェスレイ・パブリッシャーズ・ジャパン社、1997.11.28