[英]Flex lexical analyzer not behaving as expected
我正在嘗試使用 Flex 來匹配基本模式並打印一些東西。
%%
^[^qA-Z]*q[a-pr-z0-9]*4\n {printf("userid1, userid2 \n"); return 1;}
%%
int yywrap(void){return 1;}
int main( int argc, char **argv )
{
++argv, --argc; /* skip over program name */
if ( argc > 0 )
yyin = fopen( argv[0], "r" );
else
yyin = stdin;
while (yylex());
}
解決了愚蠢的問題
我不知道你想做什么,所以我會關注眼前的問題,這是你的最后一個模式:
^[^qA-Z]*q[a-pr-z0-9]*4[a-pr-z0-9]*4[a-pr-z0-9]*\n
該模式首先匹配[^qA-Z]*
,它是任意數量的任何不是q
也不是大寫字母 ( AZ
) 的東西。 然后它匹配一個q
。
這里值得考慮所有不是q
也不是大寫字母 ( AZ
) 的東西。 顯然,這包括小寫字母,例如s
( q
除外)。 它還包括數字。 它包括任何其他字符:標點符號、空格,甚至控制字符。 特別是,它包括一個換行符。
所以當你輸入
10s10<newline>
那當然可能是最后一個模式的開始。 掃描儀還沒有看到q
所以它不知道模式最終是否會匹配,但它還沒有失敗。 所以它會繼續讀取更多的字符,包括更多的換行符。
當您最終鍵入q
,掃描儀可以繼續處理模式的其余部分。 根據您接下來鍵入的內容,它可能會或可能無法繼續。 如果,看起來很可能,您的輸入最終無法匹配模式,詞法分析器將回退到最長的成功匹配,即第一個模式。 此時,它將執行第一個動作
需要謹慎使用負字符類。 很容易陷入認為“不……”只包括“合理”輸入的陷阱。 但它包括一切。 通常,在這種情況下,您至少要排除換行符。,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.