Я спросил одного из разработчиков 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
(не проверено, не знаю, работает ли оно, просто чтобы дать идею !!)