2009-06-25 18 views
6

BNFCを使用してINIファイルの文法を定義するにはどうすればよいですか?

BNFCにINIパーサを生成させるために、ラベル付きBNFを書くにはどうすればよいですか?

私は今までにo__Oを手に入れました!

私がこだわっているO__O
entrypoints File ; 

comment "#" ; 

token ID (letter | digit | ["-_'"])+ ; 

Ini. File ::= [Section] ; 
Sect. Section ::= "[" ID "]" [Statement] ; 
Bind. Statement ::= ID "=" ID ; 

separator Statement "\n" ; 
terminator Section "" ; 

[name] 
#x = 10 
y = 20 

Parse Successful! 

[Abstract Syntax] 

Ini [Sect (ID "name") [Bind (ID "y") (ID "20")]] 

[Linearized tree] 

[name]y = 20 

[name] 
x = 10 
#y = 20 

Parse Successful! 

[Abstract Syntax] 

Ini [Sect (ID "name") [Bind (ID "x") (ID "10")]] 

[Linearized tree] 

[name]x = 10 

...

+0

次は何をしますか?このように思えるのは、iniファイルを解析するためのニーズをほぼ満たしているようです。上記の文法セクションでは、単一のバインディングしかないため、 –

+0

というわけではありません。私はあらゆる種類のiniファイルを解析できるようにしたいと思います。 –

答えて

5

私はBNFCの開発者のいずれかを尋ね、ここで彼の返事を引用:

BNFCは、ハードワイヤードレクサー・タイプ 「スペース」を持っているため、このような改行として空白文字がよく、トークンでサポート されていません。アイデアは、空白は が "正常に動作する"という意味を持つことができないということです。 言語。これらの制限のうちの1つ はBNFCをとてもシンプルにしましたが、 プリプロセッサを使用すると解決できます。行ごとに入力行 をパースします。例えば


枚:

entrypoints File ; 

comment "#" ; 

token ID (letter | digit | ["-_'"])+ ; 

Ini. File ::= [Section] ; 
Sect. Section ::= "[" ID "]" [Statement] ; 
Bind. Statement ::= ID "=" ID ; 

separator Statement "//" ; 
terminator Section "//" ; 

読む:

[name] 
x = 10 
y = 20 

を前処理:

[name]// 
x = 10// 
y = 20// 

解析:

Ini [Sect (ID "name") [Bind (ID "x") (ID "10"), Bind (ID "y") (ID "20")]] 

変換:

          ↓      ↓ 
Ini [Sect (ID "name") [Bind (ID "x") (ID "0"), Bind (ID "y") (ID "0")]] 

書き込み:

[name]// 
x = 0// 
y = 0// 

後処理:

[name] 
x = 0 
y = 0 

(チェックされていない、それが動作するかどうか、単にアイデアを与えることを、知りません!)

関連する問題