Я пишу компилятор для языка программирования реального времени PEARL.
PEARL поддерживает строки со встроенной последовательностью управляющих символов, например,
'some text'\1B 1B 1B\'some more text'.
Последовательность управляющих символов имеет префикс «\» и заканчивается «\».
Внутри последовательности управления находятся две цифры номера, которые определяют управляющий символ.
В приведенном выше примере результирующей строкой будет
'some textESCESCESCsome more text'
ESC обозначает непечатный escape-символ ASCII.
Кроме того, внутри последовательности контрольных символов новой строке разрешено создавать многострочные строки, например,
'some text'\1B
1B
1B\'some more text'.
, что приводит к той же строке, что и выше.
grammar stringliteral;
tokens {
CHAR,CHARS,CTRLCHARS,ESC,WHITESPACE,NEWLINE
}
stringLiteral: '\'' CHARS? '\'' ;
fragment
CHARS: CHAR+ ;
fragment
CHAR: CTRLCHARS | ~['\n\r] ;
fragment
ESC: '\'\\' ;
fragment
CTRLCHARS: ESC ~['] ESC;
WHITESPACE: (' ' | '\t')+ -> channel(HIDDEN);
NEWLINE: ( '\r' '\n'? | '\n' ) -> channel(HIDDEN);
Лексер / парсер выше ведет себя очень странно, потому что он принимает только
строка в форме 'x' и игнорирует несколько символов и последовательность управляющих символов.
Возможно, я наблюдаю за чем-то очевидным. Любая подсказка или идея, как решить эту проблему, приветствуется!
Я исправил грамматику в соответствии с подсказками Майка:
grammar stringliteral;
tokens {
STRING
}
stringLiteral: STRING;
STRING: '\'' ( '\'' '\\' | '\\' '\'' | . )*? '\'';
По-прежнему существует проблема с распознаванием конца последовательности контрольных символов:
Ввод 'A STRING' \ CTRL \ '' вызывает ошибки
Line 1:10 token recognition error at: '\'
line 1:11 token recognition error at: 'C'
line 1:12 token recognition error at: 'T'
line 1:13 token recognition error at: 'R'
line 1:14 token recognition error at: 'L'
line 1:15 token recognition error at: '\'
Есть идеи? Кстати: мы используем antlr v 4.5.