Как я могу определить грамматику файла INI, используя BNFC? - PullRequest
6 голосов
/ 25 июня 2009

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 Я застрял ...

1 Ответ

5 голосов
/ 25 июня 2009

Я спросил одного из разработчиков 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

Preprocess:

[name]//
x = 10//
y = 20//

Анализировать:

Ini [Sect (ID "name") [Bind (ID "x") (ID "10"), Bind (ID "y") (ID "20")]]

Transform:

                                          ↓                       ↓
Ini [Sect (ID "name") [Bind (ID "x") (ID "0"), Bind (ID "y") (ID "0")]]

Запись:

[name]//
x = 0//
y = 0//

постобработки:

[name]
x = 0
y = 0

(не проверено, не знаю, работает ли оно, просто чтобы дать идею !!)

...