簡體   English   中英

Flex 詞法分析器未按預期運行

[英]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 ) 的東西。 顯然,這包括小寫字母,例如sq除外)。 它還包括數字。 它包括任何其他字符:標點符號、空格,甚至控制字符。 特別是,它包括一個換行符。

所以當你輸入

10s10<newline>

那當然可能是最后一個模式的開始。 掃描儀還沒有看到q所以它不知道模式最終是否會匹配,但它還沒有失敗。 所以它會繼續讀取更多的字符,包括更多的換行符。

當您最終鍵入q ,掃描儀可以繼續處理模式的其余部分。 根據您接下來鍵入的內容,它可能會或可能無法繼續。 如果,看起來很可能,您的輸入最終無法匹配模式,詞法分析器將回退到最長的成功匹配,即第一個模式。 此時,它將執行第一個動作

需要謹慎使用負字符類。 很容易陷入認為“不……”只包括“合理”輸入的陷阱。 但它包括一切。 通常,在這種情況下,您至少要排除換行符。,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM