回答

7

首先,我不認爲它確實是真的:在很多編譯器中,大部分時間並不花在Lexing源代碼上。例如,在C++編譯器(例如g ++)中,大部分時間都花在語義分析上,特別是在重載解析中(試圖找出要執行的隱式模板實例)。另外,在C和C++中,大多數時間通常用於優化(創建單個函數或整個翻譯單元的圖形表示,然後在這些圖表上運行長算法)。

當比較詞法和語法分析時,詞法分析確實可能更昂貴。這是因爲兩者都使用狀態機,即每個元素有固定數量的動作,但詞法分析(字符)中元素的數量要多於語法分析(令牌)中的元素數量。

+0

我完全不確定,但也可能相關的是,還存在更多種字符值,這些字符值存在易變的標記類型(例如,與例如僅100個標記類型相比,2^16個可能的字符值)。 – ChrisW 2009-07-09 01:02:30

1

詞法分析是將源代碼中的所有字符都轉換爲令牌的過程。例如

foreach (x in o) 

由字符讀取字符 - 「F」,「O」等

詞法分析器必須確定的關鍵字被人看見(「的foreach」,而不是「對」等)

在句法分析發生的時候,程序代碼「只是」一系列的標記。也就是說,我同意上面的答案,詞法分析不一定是最耗時的過程,只是它有最大的合作空間。

0

這實際上取決於你在抽出和解析之間畫線的位置。我傾向於對令牌的含義非常有限,因此我的解析器花費了大量的時間進行解析,而不是因爲它們更快,而不是因爲它們更快。

0

它當然以前是lexing昂貴的情況。部分原因是有限的內存和多個文件操作來讀取程序位。現在內存以GB來衡量,這不再是一個問題,出於同樣的原因可以做更多的工作,所以優化更重要。當然,優化是否有很大幫助是另一個問題。

相關問題