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