2012-02-28 3 views
7

私はBNFのBNFを定義しようとしています。言い換えれば、私はBNFのメタ文法を定義しようとしています。つまり、BNF文法はそれ自身のインスタンスであり、他のBNF文法を生成することができます。BNFのBNFとは何ですか?すなわち、どのようにしてBNFメタ文法を定義するのか?

ヒント/ヒント/スニペットがあれば幸いです。

ありがとうございました!

+1

あなたの質問は[BNF上のWikipediaの記事](http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form#Further_examples)で答えているようです。 –

+0

@GregHewgill興味深い。私はFrank de RemerによってBNFがそれ自体を記述することができないと教えられました。 – EJP

+0

@EJP:デ・レマーはパーサー・ジェネレーターや文法でかなり壮大でしたが、私は彼がそれを教えたとは思いません。私は、あなたが学んだことを間違って思い出したと思う。 –

答えて

6

は、ここに1つです:

bnf = rules ; 
rules = rule ; 
rules = rules rule ; 
rule = lefthandside EQUAL righthandside SEMICOLON ; 
lefthandside = IDENTIFIER ; 
righthandside = ; 
righthandside = righthandside token ; 
token = IDENTIFIER ; 
token = QUOTEDLITERAL ; 

これは葉IDENTIFIER、 下QUOTEDLITERAL、EQUALおよび未定義SEMICOLON、BNFはのlangaugeトークンの上に定義されていることを仮定。

文字の上にBNFを定義できます。ただ、追加:読者の練習として残し

EQUAL = '=' ; 
SEMICOLON = ';' ; 
IDENTIFIER = letter ; 
IDENTIFIER = IDENTIFIER letterordigit ; 
letterordigit = letter ; 
letterordigit = digit ; 
letter = 'A' ; 
... 
letter = 'Z' ; 
digit = '0' ; 
... 
digit = '9' ; 

を:選択追加(|)EBNFのためにこのBNFを作るために、複数のルール、およびクリーネ閉包を、この答えは明らかにブランクの取り扱いには苦労しますが、ブランクが許可されていればどこでも「ブランク」の非終端記号を挿入することで対応できます。基本的に文法を本質的に文字の上に書くBNF仕様システムがあり、そのような暗黙的な空白の非終端記号の挿入が行われます(例:Stratego's "Syntax Definition Formalism")。

BNF-about-BNFで思いがけないレッスンをしたい場合は、BNF処理システムの "MetaII"という正直なものから1965年までのpaper/do the tutorialを読んでください。このホワイトペーパーでは、BNFでBNFを実行する方法と、10ページすべてに2つのコンパイラを構築する方法について説明します。

(60年代から70年代のコンピュータサイエンスをすべて読んでください。それほど多くはありません。どれだけ良い素材があるかに驚くでしょう)。

0
<line> ::= '<' <word> '>' '::=' <definition> 
<definition> ::= <word> '|' | '' <definition> | '' 
関連する問題