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