2013-03-13 4 views
-2

Я пишу сканер в прогибается, и я следующие два определения:Странная ситуация по поводу соответствия в гибком

%% 
"int" printf("JUST_INT"); 
"int"[ \t\n]+"matrix" printf("MATRIX_INT"); 
[A-Za-z][A-Za-z0-9]* printf("IDENTIFIER"); 
%% 

Когда вход в сканере int matrixM = 3; выход MATRIX_INT IDENTIFIER. Он видит ввод как int matrix M=3. Но на самом деле это не matrix, имя идентификатора matrixM. Выходной сигнал должен быть JUST_INT IDENTIFIER. Почему это происходит? Это из-за моих определений?

ответ

2

Неплохо иметь правила, которые сканируют через пробелы, такие как "int"[ \t\n]+"matrix". Просто верните «int», «matrix» и IDENTIFIER как три отдельных токена, и пусть парсер разбирается. Это намного лучше, чем flex есть. flex только делает первый самый длинный матч.

1

Если вы действительно хотите, чтобы решить эту проблему на уровне сканера, вы можете соответствовать на

"int"[ \t\n]+"matrix"/($|[ \t\n]|;|whateverelsedelimitsanidentifier) 

Это гарантирует, что matrix только соответствует, если она сопровождается «не словом». Как сказал EJP, это не очень хорошая идея, и вы должны сделать это очень вероятно на уровне анализатора.

Смежные вопросы