Лексер NetBeans выдает исключение, распознающее завершающие пробелы

У меня есть простая грамматика, написанная на ANTLR4, которая включает (среди прочего) правило пробелов:

WhiteSpace : [ \t\r\n]+ -> skip;

Он интегрирован в приложение платформы NetBeans с помощью org.netbeans.spi.lexer.Lexer. Когда на входе есть завершающий пробел (до EOF), я получаю следующее исключение:

java.lang.IllegalStateException: Lexer ExpressionLexer@2cdea2eb
  returned null token but lexerInput.readLength()=1
  lexer-state: null
  tokenStartOffset=20, readOffset=21, lookaheadOffset=22
  Chars: "\n" - these characters need to be tokenized.
Fix the lexer to not return null token in this state.

Как я могу сделать так, чтобы этот конечный пробел не вызывал ошибку?

Изменить: это работает правильно без ошибок, используя только код лексера и парсера ANTLR. Ошибка возникает только при интеграции с лексером NetBeans (и, возможно, другими интеграциями).


person Rangi Keen    schedule 31.12.2013    source источник


Ответы (1)


Измените правило WhiteSpace, чтобы токен отправлялся на скрытый канал, а не пропускал его полностью.

WhiteSpace : [ \t\r\n]+ -> channel(HIDDEN);

Синтаксический анализатор не увидит пробел, но лексер NetBeans будет рад, что для всех входных данных был возвращен действительный токен.

person Rangi Keen    schedule 31.12.2013