質問

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

(チェックされていない、機能するかどうかわからない、アイデアを出すためだけに!!)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top