Предположим, строка имеет максимальную длину 5. Я хочу, чтобы идентификатор продолжался, когда символ новой строки помещается на позицию 5.
примеры:
- abcd '\ n'ef приведет к одному идентификатору "abdef"
- ab' \ n'def приведет к идентификатору "ab" (и еще один "def")
Почему-то я не могузаставить его работать ...
Попытка 1 выглядит примерно так:
NEWLINE1 : '\r'? '\n' { _tokenStartCharPositionInLine == 5 } -> skip;
NEWLINE2 : '\r'? '\n' { _tokenStartCharPositionInLine < 5 } -> channel(WHITESPACE);
Identifier : Letter (LetterOrDigit)*;
fragment
Letter : [a-zA-Z];
fragment
LetterOrDigit : [a-zA-Z0-9];
Попытка 2 выглядит примерно так:
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ -> channel(WHITESPACE);
Identifier : Letter (LetterOrDigit NEWLINE?)*;
NEWLINE: '\r'? '\n' { _tokenStartCharPositionInLine == 5}? -> skip;
fragment
Letter : [a-zA-Z];
fragment
LetterOrDigit : [a-zA-Z0-9];
Кажется, это работает, однако знак '\ n' все еще является частью Идентификатора при обработке его в синтаксическом анализаторе.Почему-то мне не удается «игнорировать» символ новой строки, когда он находится на последней позиции строки.