Почему ANTLR анализирует пропускающий токен? - PullRequest
1 голос
/ 21 июля 2010

Я пытаюсь сделать очень простой синтаксический анализ объявления функции C ++. Вот мое правило для анализа входного параметра:

arg : 'const'? 'unsigned'? t=STRING m=TYPEMOD? n=STRING 
 -> ^(ARG $n $t $m?) ;

STRING  : ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'::')+ ;

TYPEMOD 
 : ('*' | '&')+ ;

Проблема в том, что я пытаюсь передать что-то вроде:

int *param

Он сопоставляет «int» с t, но затем пропускает TYPEMOD, выдает исключение, говорящее, что * нежелателен при попытке сопоставить n, а затем сопоставляет «param» с n. Почему он пропускает токен TYPEMOD и не соответствует ему?

Заранее спасибо!

EDIT:

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

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

COMMENT_BLOCK 
    :   '/*' .* '*/' { $channel = HIDDEN; } ;

NL      :   ('\r' | '\n')+ { $channel = HIDDEN; } ;

WS      :   (' '|'\t')+ { $channel = HIDDEN; } ;

1 Ответ

1 голос
/ 22 июля 2010

Только с небольшими изменениями я думаю, что вы хотите, чтобы правила выглядели так, чтобы продолжить вашу работу:

 arg : 'const'? 'unsigned'? t=STRING m=typemod? n=STRING 
 -> ^(ARG $n $t $m?) ;

typemod : TYPEMOD+;

STRING  : ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'::')+ ;

TYPEMOD 
 : '*'|'&' ;

Правило лексера STRING я не изменил, но я изменил ваш аргумент иTYPEMOD управляет и создает новое правило синтаксического анализа typemod.

О да, я использовал цель java, так что, надеюсь, это сработает для вас.

Надеюсь, это поможет, удачи.

...