Я пытаюсь сделать очень простой синтаксический анализ объявления функции 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; } ;