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

Только строки в двойных кавычках интерпретируют escape-последовательности \r и \n как '0x0D' и '0x0A' соответственно, поэтому вы хотите:

"\r\n"

Строки в одинарных кавычках , с другой стороны, знают только escape-последовательности \\ и \'.

Таким образом, если вы не объедините строку в одинарных кавычках с разрывом строки, сгенерированным в другом месте (например, с помощью строки в двойных кавычках "\r\n" или с помощью функции chr chr(0x0D).chr(0x0A)), единственный другой способ получить разрыв строки в одной строке в кавычках состоит в том, чтобы буквально напечатать ее с помощью вашего редактора:

$s = 'some text before the line break
some text after';

Обязательно проверьте ваш редактор на наличие настроек разрыва строки, если вам требуется определенная последовательность символов (например, \r\n) ).

6
задан Cetin Sert 25 June 2009 в 06:39
поделиться

1 ответ

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

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

5
ответ дан 17 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: