我已经写了规则,但我不明白为什么欲望规则不匹配,因为文档说这个:
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.
我也看到了这个答案,但没有帮助:Is it possible to set priorities for rules to avoid the "longest-earliest" matching pattern?
...
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
答案 0 :(得分:1)
如果您的输入确实在两个不同的行上,则您的ANY_CHAR规则与换行符匹配。如果您不关心换行符,则应忽略它们。我还建议根据David Gorsline的评论在*
上删除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);}