문제

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 개발자 중 하나를 물었고 그의 대답을 여기에 인용합니다.

BNFC에는 유선 유형의 "공간"이 있기 때문에 Newlines와 같은 공간 문자는 토큰으로 잘 지원되지 않습니다. 아이디어는 공간이 "잘 행동하는"언어로 의미를 지니지 못한다는 것입니다. 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