簡體   English   中英

為什么我在這個 flex 文件中變得糟糕 output ?

[英]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.

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