Скрытый токен в канал по умолчанию - AntlrV3 - PullRequest
1 голос
/ 03 февраля 2010

Предположим, у меня есть пробелы (WS) в скрытом канале. А также для одного конкретного правила, я хочу, чтобы также были рассмотрены пробелы, это возможно ли привести WS к каналу по умолчанию для этого конкретного правила в парсере?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2010

Вы всегда можете запросить скрытый поток токенов

то есть в C ++

myrule: MYTOK { static_cast<antlr::CommonHiddenStreamToken*>(LT(1).get())->getHiddenAfter()->getType() == WS}? MYTOK 

Семантический предикат проверяет, есть ли токен пробела после сопоставления лексическому токену MYTOK

0 голосов
/ 04 февраля 2010

Правила Lexer оцениваются в порядке их перечисления в файле грамматики.

Это означает, что у вас может быть что-то вроде этого:

STRING_LITERAL: '"' NONCONTROL_CHAR* '"';   


fragment NONCONTROL_CHAR: LETTER | DIGIT | UNDERSCORE |  SPACE | BACKSLASH | MINUS | COMMA;
fragment LETTER: LOWER | UPPER;
fragment LOWER: 'a'..'z';
fragment UPPER: 'A'..'Z';
fragment DIGIT: '0'..'9';
fragment SPACE: ' ' | '\t';
fragment UNDERSCORE: '_';   
fragment MINUS:  '-';
fragment BACKSLASH: '\\';

COMMA: ',';     

NEWLINE: ('\r'? '\n')+ { $channel = HIDDEN; };
TERMINATOR  : ';';


WHITESPACE: SPACE+ { $channel = HIDDEN; };

LINE_COMMENT
    :   
    '//' ~('\n'|'\r')*  ('\r\n' | '\r' | '\n') 
    {
        $channel = HIDDEN;
    }
    |   
    '//' ~('\n'|'\r')*     
    {
        $channel = HIDDEN;
    }
    ;   

Как видите, строковый литерал может содержать пробел или табуляцию. Однако отдельное пространство или вкладка будут отправлены на скрытый канал.

0 голосов
/ 03 февраля 2010

Посмотрите на ответ на вопрос о пути, обратите внимание, как я вставил '\ n' в правило синтаксического анализатора. Вы должны быть в состоянии поставить '', а также. Теперь, все опции для вашего WS на скрытом канале должны быть в правиле, это будет единственной заботой.

например

rulename : Token1 ' ' Token2 ' ' Token1 {place action here};

Обратите внимание, что имя правила начинается со строчной буквы и является правилом синтаксического анализа, в то время как «Token #» начинается с заглавной буквы и является правилом лексера. Между разными токенами в этом примере правило требует пробела, и я полагаю, вы могли бы поставить что-то вроде ('' | '\ t' | '\ r' | '\ n') +, но я не пробовал это оставь это для тебя.

...