ANTLR4 - как прервать - PullRequest
       4

ANTLR4 - как прервать

0 голосов
/ 06 июня 2018

Предположим, строка имеет максимальную длину 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' все еще является частью Идентификатора при обработке его в синтаксическом анализаторе.Почему-то мне не удается «игнорировать» символ новой строки, когда он находится на последней позиции строки.

1 Ответ

0 голосов
/ 06 июня 2018

Кажется, это работает, однако знак '\ n' все еще является частью идентификатора при обработке его в анализаторе.

Это потому, что NEWLINE пропускается только при сопоставлении "независимо".Всякий раз, когда он является частью другого правила, например Identifier, он остается частью указанного правила.

IMO, вам следует просто пойти на это решение и не добавлять слишком много предикатов в свой лексер (или анализатор).Просто удалите разрыв строки из Identifier после анализа.

...