2011-11-01 54 views
0

我想使用yy_scan_bytes(),因爲我有定義規則的空字符。我的問題是我的字符串可以匹配多個規則。我想要掌握所有匹配的規則。我想一次性提供yylex()函數一個字符,並檢查是否匹配。我嘗試了下面的代碼進行測試,但這不起作用。帶有多個緩衝區的lex flex掃描程序

for(int i=0;i<length;i++) 
{ 
    yy_scan_bytes(&temp[i],1); 
    index=TomsonTalkslex(); 
} 

爲了簡單起見,我只是返回從掃描儀匹配規則的索引。 temp是一個char緩衝區。我嘗試使用yy_switch_to_buffer(yy_scan_bytes(& temp [i],1));但這沒有奏效。

如何告訴掃描程序不要重置其狀態並繼續處理具有相同狀態的後續緩衝區。

+0

爲什麼你需要使用掃描字節?默認情況下,yylex每次讀取一個字符直到EOF,所以空字節應該正常讀取。另外,您是否希望保存當前緩衝區狀態,以便以後使用此緩衝區,或者在切換緩衝區時使用新緩衝區的*最後一個緩衝區狀態保持狀態*? –

+0

我在運行時輸入了數據,所以我需要使用掃描字節。我也想爲每個字符調用yylex,我不想讓它重置狀態機,這就是爲什麼我想保存緩衝區狀態。我想用新的緩衝區使用我的最後緩衝區狀態。例如,我有2個規則,一個用於匹配ab和另一個用於遊行cd。如果我輸入「abcd」來掃描字節,它將只返回一個我認爲是cd的匹配。我想要規則,ab處理時需要ab規則,cd處理時cd,這隻能通過掃描字節完成。 – Saba

回答

1

好吧,這只是對lex/flex如何工作的誤解。默認情況下,yylex掛鉤到stdin,讀取直到它接收到EOF,並匹配每個規則。這就是爲什麼它是一個標記器。因此,下面的示例程序將從標準輸入讀取,直到您輸入-c發送EOF。

%option 8bit outfile="scanner.c" 
%option nounput nomain noyywrap 
%option warn 

%% 

ab { fprintf(yyout, "We ran the ab rule.\n"); } 
cd { fprintf(yyout, "We ran the cd rule.\n"); } 

    // echo everything else we find to yyout 
. { ECHO; } 
\n { ECHO; } 

%% 

編譯上面,使用:

flex -Cf scanner.l 
gcc -O -o flexer.exe scanner.c 

保存源文件scanner.l當你做到這一點。一旦編譯完成,您將在同一個目錄中獲得一個名爲flexer.exe的文件。從終端運行它,你會得到一個空白提示等待輸入。您輸入的所有內容都會根據規則進行嘗試和匹配,直到您找到一個匹配項爲止。然後它將執行與規則相關的代碼。

因此,如果您鍵入abcd,那麼您將匹配abcd規則。

我建議您閱讀lex and yacc以獲得更詳細的介紹。

+0

嗯,我真的想要做同樣的事情,但不想使用stdin,我想用掃描字節來完成。我從lex和yacc手冊嘗試了很多東西,但沒有一個適用於掃描字節。我想調用我的原始文章中的代碼中給出的掃描字節。 – Saba

+0

@Saba [flex手冊](http://flex.sourceforge.net/manual/Multiple-Input-Buffers.html#Multiple-Input-Buffers)表示yy_scan_bytes在每次調用時切換到新創建的緩衝區。我不認爲它會做你想做的。 –

+0

謝謝Spencer,有沒有其他方法可以做我想做的,但我想在內存緩衝區中使用:( – Saba