Как я могу определить грамматику INI-файла с помощью BNFC?

StackOverflow https://stackoverflow.com/questions/1042441

Вопрос

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

как я должен написать свой помеченный BNF, чтобы заставить BNFC сгенерировать для меня INI-анализатор?

Я зашел так далеко только о__О!

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

о__О , я застрял ...

Это было полезно?

Решение

Я спросил одного из разработчиков BNFC и процитировал его ответ здесь:

Символы пробела, такие как перевод строки не очень хорошо поддерживаются в токенах, потому что BNFC имеет жестко заданный тип лексера "пробел".Идея в том, что пробелы не могут нести смысл в слове "хорошо себя вести". языки.Одно из тех ограничений , которое сделало 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