Не удается заставить грамматику ANTLR4 пропускать комментарии

Я пытаюсь написать грамматику ANTLR4 для анализа actionscript3. Я решил начать с чего-нибудь довольно грубого:

grammar actionscriptGrammar;

OBRACE:'{';
CBRACE:'}';
STRING_DELIM:'"';

BLOCK_COMMENT : '/*' .*? '*/' -> skip;
EOL_COMMENT : '//' .*? '/n' -> skip;
WS: [ \n\t\r]+ -> skip;

TEXT: ~[{} \n\t\r"]+;

thing
    : TEXT
    | string_literal
    | OBRACE thing+? CBRACE;

string_literal : STRING_DELIM .+? STRING_DELIM;

start_rule
    : thing+?;

По сути, мне нужно дерево вещей, сгруппированных по их лексическому объему. Я хочу, чтобы комментарии игнорировались, а строковые литералы были их собственными вещами, чтобы любые фигурные скобки, которые они могут включать, не влияли на лексическую область видимости. Правило string_literal работает нормально (например, оно есть), но два правила комментариев не имеют никакого эффекта. (т.е. комментарии не игнорируются).

Что мне не хватает?


person spierepf    schedule 01.05.2014    source источник


Ответы (2)


Это из упрощенной грамматики Java, которую я написал в ANTLR v4.

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

COMMENT
    : '/*' .*? '*/' -> skip
;

LINE_COMMENT
    : '//' ~[\r\n]* -> skip
;

Может быть, это могло бы вам помочь.

Кроме того, попробуйте изменить код. Сначала напишите правила синтаксического анализатора, а затем - правила лексера. Используйте подход "сверху вниз". Я считаю это намного более полезным при отладке. Это также будет хорошо выглядеть, когда вы создадите HTML-экспорт своей грамматики из подключаемого модуля ANTLR 4 Eclipse.

Удачи!

person Lallu Anthoor    schedule 01.05.2014

Ответ заключается в том, что ваше правило ТЕКСТА потребляет ваши комментарии. Вместо использования отрицательного набора используйте что-то вроде:

TEXT: [a-zA-Z0-9_][/a-zA-Z0-9.;()\[\]_-]+ ;

Таким образом, ваши комментарии не могут быть сопоставлены ТЕКСТОМ.

person GRosenberg    schedule 02.05.2014