BNFCを使用してINIファイルの文法を定義するにはどうすればよいですか?
-
22-07-2019 - |
質問
http://www.cs.chalmers.se/Cs / Research / Language-technology / BNFC /
BNFCにINIパーサーを生成させるには、ラベル付きBNFをどのように書くべきですか?
これまでのところ、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
o__O立ち往生しています...
解決
BNFCの開発者の1人に質問し、彼の回答をここに引用します:
改行などのスペース文字は トークンでは十分にサポートされていません。 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
(チェックされていない、機能するかどうかわからない、アイデアを出すためだけに!!)
所属していません StackOverflow