2012-01-11 63 views
2

我正在設計一個小的領域特定語言的過程。 作爲掃描儀/解析器生成器,我使用Flex/BisonC++。 現在,生成的DSL編譯器前端能夠解析八進制,十進制和十六進制數字。 剩下的唯一剩下的就是在C/C++中對浮點數(FPN)的支持。何處理浮點數解析 - 掃描儀還是解析器?

有在 http://rosettacode.org/wiki/Literals/Floating_point#C

的浮點數語法一個RegExp一)我知道,解析,可以在掃描完成或/和分析器, 但我不知道什麼是最好的 - 在性能和效率方面。

b)另外一個限制是,我想避免觸碰輸入的每個字符不止一次,即我想避免使用STL或其他字符串到浮點數轉換函數 ,在解析過程中進行飛行轉換。 這可能嗎?

回答

2

讓掃描器(flex代碼)識別並轉換浮點數,就像它應該識別和轉換整數一樣,這是完全可行的,而且通常是合理的。如果您已經在文法(bison代碼)中編寫了整數識別代碼而不是掃描器,那麼您可能也會在其中寫入浮點識別代碼,但這不是它通常的做法。您可能需要爲令牌類型使用更復雜的(讀取「複雜」)數據類型;請閱讀%union

+0

整數識別存在於掃描儀中,因此FPN識別應根據乾淨設計進行。 – user1142580 2012-01-11 10:28:14

+0

對不起,我不清楚以下內容:雖然我可以在掃描程序中實現它,但它會給掃描程序規範帶來很多複雜性(涉及大量狀態處理),而解析程序中的實現可能更加容易。但是,由於整數識別存在於掃描儀中,因此FPN識別應具有乾淨的設計。我必須做出的決定是:執行表現如何?是基於掃描儀還是基於解析器的FPN識別更快? – user1142580 2012-01-11 10:36:12

+1

忽略性能;你可能無法衡量差異。如果可以的話,這將是因爲當掃描儀處理FPN識別時語法代碼更小(語法不必處理混亂)。如果您將FPN識別功能踢到語法上,您的掃描儀必須將'-23.00456E + 34'作爲5個單獨的標記('-23',''','00456','E'和'+ 34',保留前導零,有時你必須處理一個字符兩次,後退是不可避免的(例如,你需要在數字的末尾讀取一個字符,以知道你已經達到了最後的結果,例如) – 2012-01-11 13:48:29