簡體   English   中英

計算DFA狀態

[英]Computation of DFA states

我想使用FLEX計算某個正則表達式的DFA狀態總數。 哪些C文件或函數可以幫助我使用FLEX完成此任務?

如果查看flex生成的文件,則yy_accept (和yy_base )中的條目數可能會很好地指示生成的DFA使用的狀態數。 如果您使用-Cf選項,則yy_nxt包含DFA的轉換函數,表中的行數也是使用狀態的數量。

您可能有不同版本的flex ,其中表的命名方式不同,但很可能它們的名稱非常相似。

在回答下面的問題時:假設DFA已經最小化,DFA中的狀態數量可以被認為是非常明確的。 然而,過渡的數量不太明確。

首先, flex對每個輸入字符都有一個轉換,因為它將ECHO任何不屬於定義語言的字符。 這是通過一個新的新狀態來實現的。 使用調試器可以反向設計這是哪種狀態。 但請注意,如果使用開始條件,則可能必須考慮存在多個此類狀態的可能性。 如果您想分析許多正則表達式,那么您可能需要查看其他一些工具或從中獲取flex的來源。

第二, flex有策略來最小化所有表的總大小。 -Cf選項指示它不這樣做。 一個這樣的優化是找到字符的等價類,並且僅對每個字符類使用轉換。 輸入字符首先被轉換為其類,而后者又用於確定轉換。 因此,轉換的數量要低得多,但是需要一個額外的表(參見yy_ec )來確定字符類。

因此,轉換數量是一個不太明確的概念。 如果您對確定掃描儀的內存占用率感興趣,那么我會查看掃描儀數據部分的大小。 例如,在lex.yy.o文件中使用objdump -h .rodata部分的大小將給出表的總大小的非常准確的估計。

您似乎已經找到了flex-v選項,它以更詳細的形式提供DFA中的狀態數。 為了回答"a" {}給出5個狀態的原因,您也可以使用--trace選項,因為它在生成時為DFA提供。 顯然還有一個End Marker規則,我認為它用於文件結束。 對於每個開始條件,有兩種狀態,一種在線的開始處使用,一種在線的中間使用。 這使得3個接受狀態(一個用於"a" ,一個用於End Marker ,一個用於(.|"\\n") )加上兩個狀態用於單個開始條件。

源文件dfa.c不是生成的代碼的一部分,但是如果你覺得很勇敢,你當然可以改變flex的來源來進一步分析你自己的。 我快速瀏覽了一下,似乎代碼的生成與轉換交織在一起,這使得它的模塊化程度低於實驗平台所需的模塊化程度。 還要注意K&R原型,這些原型可以有效地禁用原型上的任何類型檢查。

暫無
暫無

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

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