2013-07-01 4 views
1

В ANTLR4 это заставит маркер LINE_FOLD быть пропущено:Пропуск токены, которые являются частью ANTLR4 грамматики

LINE_FOLD 
: CRLF WSP -> skip 
; 

Но если я это сделать:

ESCAPED_CHAR 
: '\\' LINE_FOLD? '\\' 
| '\\' LINE_FOLD? ';' 
| '\\' LINE_FOLD? ',' 
| '\\' LINE_FOLD? N 
; 

он будет возвращать ESCAPED_CHAR без LINE_FOLD, и если нет, то как я могу это сделать?

ответ

1

Нет, внутри ESCAPED_CHAR, CRLF WSP не будет skip педаль.

ANTLR (4) Лучшая практика заключается в том, чтобы обрабатывать такие целевые конкретные действия на этапе после разбора (в слушателе или посетителе).

Однако, вы можете добавить определенный блок целевого в конце вашего правила, отбрасывает \\ CRLF WSP из ESCAPED_CHAR правил:

ESCAPED_CHAR 
: '\\' LINE_FOLD? [\\;,nN] 
    { 
    String s = getText(); 
    setText(s.substring(s.length() - 1)); 
    } 
; 

Предполагая, что ваше правило лексера N матчей либо 'n' или 'N'.

Теперь правило ESCAPED_CHAR будет производить только маркеры, содержимое которых будет на из: \\, ;, ,, n или N.

Иглы говорят, что это будет работать только с целью Java.

+0

Итак, если я хочу придерживаться наилучшей практики ANTLR4 и поместить это в прослушиватель (как я уже разработал с прослушивателями), как бы я проработал свой путь через контексты, чтобы найти мои экранированные символы и настроить их соответственно? У меня есть TextContext, который содержит в себе различные токены ... – jgm

+0

Я боюсь, что есть не так много, как ручная замена этих символов с использованием встроенных строковых методов целевого языка, AFAIK. Возможно, вы захотите обрезать дискуссионную группу ANTLR (https://groups.google.com/forum/#!forum/antlr-discussion), чтобы узнать, есть ли (или было) обсуждение таких действий. А если нет, вы можете начать один :) –

Смежные вопросы