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 개발자 중 하나를 물었고 그의 대답을 여기에 인용합니다.
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
(점검하지 않고, 그것이 효과가 있는지 모르고, 그냥 아이디어를주기 위해 !!)
제휴하지 않습니다 StackOverflow