[英]Why I am getting bad output in this flex file?
我正在嘗試編寫一個允許讀取systemctl output 的 Flex 文件。 這個想法是只顯示那些未能啟動的服務。 我的代碼是:
%{
#include <iostream>
#include <fstream>
using namespace std;
ifstream file;
char* service_name;
int nfs=0;
%}
failed_service *failed*
%%
failed_service {nfs++;cout << yytext << endl;}
%%
int main()
{
system("systemctl > /var/tmp/system_start.txt");
file.open("/var/tmp/system_start.txt");
yyFlexLexer strm (&file,0);
strm.yylex();
}
你能告訴我我哪里失敗了嗎? output 向我展示了整個系統ctl output謝謝。
Flex 可能不是完成這項任務的最佳工具。 我建議使用grep命令行實用程序。
Flex 是用於編寫解析器的工具; 它的目標是將輸入拆分為一系列標記。 它從不搜索模式。 在每個輸入點,它會嘗試所有配置的模式以找到從該點開始的匹配,並選擇最長的可能性。 然后它執行相關的動作,然后在前進到匹配后的第一個字符后繼續。
如果它在任何時候都無法匹配當前輸入字符,它會使用一個默認規則,其模式匹配任何單個字符,並且其操作是打印該字符。 由於您唯一的規則永遠不會匹配,因此使用此默認規則一次一個字符將整個輸入復制到 output。
它絕不是面向線的。 您可以使用顯式模式將輸入拆分為行,但這些都不會自動發生。
如果你打算使用 flex,你至少需要學習一點正則表達式。 *failed*
不是一個有效的正則表達式; 在正則表達式中, *
運算符表示其后面的內容的零次或多次重復,因此它不能出現在模式的開頭。 ( *failed*
中的第二個*
有效,但表示“零個或多個d
s”,這不是您的意思。您可能會將正則表達式與 shell 路徑名擴展(“globbing”)混淆,其中*
表示“零或/
"以外的更多字符。
在任何情況下, *failed*
都不是您在該彈性文件中匹配的模式。 模式是failed_service
,它是一個匹配自身的有效正則表達式。 您之前定義了相當不必要的宏failed_service
,但擴展宏的彈性語法是{macro-name}
。 如果你設法擴展了那個宏,flex 會報告一個無效的模式。 但是,flex 文件中不需要宏。 您可以簡單地將模式本身放在規則中。
flex 手冊中對 flex 接受的正則表達式的語法有一個簡短的描述,但它假設您對這些概念有一些基本的熟悉。 該手冊還解釋了 flex 文件格式和匹配算法。
盡管如此,我真的認為您最好將systemctl的 output 輸送到grep (例如systemctl | grep -Fw failed
)。 Grep是面向行的,針對此類任務進行了高度優化,並且不需要您想出一套涵蓋所有可能性的模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.