Как установить приоритеты для правил?

Я написал правила, но я не понял, почему правила желаний не совпадают, потому что в документации сказано следующее:

When the generated scanner is run, it analyzes its input looking for strings 
which match any of its patterns. If it finds more than one match, it takes the 
one matching the most text (for trailing context rules, this includes the length 
of the trailing part, even though it will then be returned to the input). If it 
finds two or more matches of the same length, the rule listed first in the flex 
input file is chosen.

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

 ...
 ANY_CHAR .
 ...

 %%
 "gago"                         { BEGIN V_TYPE; }
 <V_TYPE>"If"                   { printf("print If");       exit(1);}
 <V_TYPE>"Then"                 { printf("print Then");     exit(1);}
 <V_TYPE>"Endif"                { printf("print Endif");    exit(1);}
 <V_TYPE>"While"                { printf("print While");    exit(1);}
 <V_TYPE>"EndWhile"             { printf("print EndWhile"); exit(1);}
 <V_TYPE>{ANY_CHAR}*            { printf("print Other");    exit(1);}

простой ввод:

gago
EndWhile

Желаемый результат:

print EndWhile

Фактический вывод:

print Other

1 ответ

Решение

Если ваш ввод действительно в двух разных строках, то ваше правило ANY_CHAR соответствует символу новой строки. Если вы не заботитесь о новых строках, вы должны их игнорировать. Я также рекомендовал бы сбросить * модификатор включен ANY_CHAR согласно комментариям Дэвида Горслина.

...
ANY_CHAR .
NEW_LINE [\n\r]
...

%%
"gago"                         { BEGIN V_TYPE; }
<V_TYPE>"If"                   { printf("print If");       exit(1);}
<V_TYPE>"Then"                 { printf("print Then");     exit(1);}
<V_TYPE>"Endif"                { printf("print Endif");    exit(1);}
<V_TYPE>"While"                { printf("print While");    exit(1);}
<V_TYPE>"EndWhile"             { printf("print EndWhile"); exit(1);}
<V_TYPE>{NEW_LINE}+            { /* ignore */  }
<V_TYPE>{ANY_CHAR}             { printf("print Other");    exit(1);}
Другие вопросы по тегам