Как установить приоритеты для правил?
Я написал правила, но я не понял, почему правила желаний не совпадают, потому что в документации сказано следующее:
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);}