7

http://www.cs.chalmers.se/Cs/Research/Language-technology/BNFC/

ラベル付きのBNFを記述して、BNFCにINIパーサーを生成させるにはどうすればよいですか?

私は今のところ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行き詰まっています..。

4

1 に答える 1

6

私はBNFC開発者の1人に質問し、彼の回答をここに引用します。

BNFCにはハードワイヤードのレクサータイプ「スペース」があるため、改行などのスペース文字はトークンで十分にサポートされていません。アイデアは、スペースは「行儀の良い」言語では意味を持たないということです。BNFCを非常に単純にしたこれらの制限の1つ...しかし、プリプロセッサを使用することでこれを解決できるはずです。たとえば、入力を1行ずつ解析します。


たとえば、次のようになります。

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

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

于 2009-06-25T11:20:02.060 に答える