Я начал работать с antlr несколько дней назад. Я хотел бы использовать его для анализа макросов #include в c. Меня интересуют только включения, все остальные части не имеют значения. здесь я написал простой файл грамматики:
... parser part omitted...
INCLUDE : '#include';
INCLUDE_FILE_QUOTE: '"'FILE_NAME'"';
INCLUDE_FILE_ANGLE: '<'FILE_NAME'>';
fragment
FILE_NAME: ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'.'|' ')+;
MACROS: '#'('if' | 'ifdef' | 'define' | 'endif' | 'undef' | 'elif' | 'else' );
//MACROS: '#'('a'..'z'|'A'..'Z')+;
OPERATORS: ('+'|'-'|'*'|'/'|'='|'=='|'!='|'>'|'>='|'<'|'<='|'>>'|'<<'|'<<<'|'|'|'&'|','|';'|'.'|'->'|'#');
... other supporting tokens like ID, WS and COMMENT ...
Эта грамматика создает двусмысленность, когда встречаются такие утверждения:
(;i<listLength;i++)
output: mismatched character ';' expecting '>'
Кажется, он пытается сопоставить INCLUDE_FILE_ANGLE вместо обработки ";" как ОПЕРАТОРЫ.
Я слышал, что есть оператор, называемый синтаксическим предикатом, но я не уверен, как правильно его использовать в этом случае.
Как я могу решить эту проблему с помощью Antlr?