2016-10-12 53 views
1

我想用C++編寫一個XML掃描器。我最好喜歡使用正則表達式庫,因爲它會容易得多。使用正則表達式庫在C++中創建詞法分析器?

不過,我有點難倒就如何做到這一點。所以,首先我需要爲語言中的每個標記創建正則表達式。除了令牌的名稱之外,我可以使用映射來存儲這些正則表達式的對。

接下來,我會打開一個輸入文件,並想用一個迭代器通過我的文件中的字符串進行迭代,並將它們匹配到正則表達式。但是,在XML中,您沒有間隔來分隔字符串。

所以我的問題是這種方法甚至可以工作嗎?另外,正則表達式庫會如何滿足我的需求? regex_match足以以一種萬無一失的方式滿足我的需求,使我的掃描儀不被欺騙?

我只是想在我的頭上,以創建進程的框架,這樣我就可以開始這方面的工作。我想從別人那裏得到一些意見,看看我是否正確思考問題。

我會很感激這方面的任何想法。非常感謝!

+2

爲什麼要重新發明輪子? lex/flex已經存在了幾十年,並且已經解決了所有的問題。 –

+0

我正在學習如何做詞法分析。只是爲我生成的代碼不會有所幫助。 –

+0

我同意這樣的工具是有用的,但我想學習如何自己做。 –

回答

0

詞法分析通常通過順序匹配的令牌,其中,每個標記對應於最長可能的匹配從一組可能的正則表達式進行。由於每個匹配都是在前一個令牌結束的地方錨定的,因此不會執行搜索。

在這裏,我稍微鬆散地使用「token」這個詞;空格和註釋也被用作令牌,但是在大多數編程語言中,它們在被識別後被簡單地忽略。但是,一致的XML標記器需要將它們識別爲令牌,因此對於問題域來說,它的使用是精確的。

,而不是惱人的細節海沉浸,你可能想了解(F)法,它有效地實現了這個算法給出的正則表達式的集合。它還處理緩衝區處理和一些其他細節,讓您專注於理解詞法分析過程的性質。

0

這位一個工具,稱爲RE /柔性,其生成掃描儀:

https://sourceforge.net/projects/re-flex

所生成的掃描儀使用正則表達式引擎如Boost.Regex。 Boost.Regex通過API來處理不同類型的輸入,所以還有一些額外的C++代碼。不是您可能正在尋找的簡單Boost.Regex API調用。

包含RE /柔性的例子包括在C++中XML掃描儀,可以幫助您開始。 RE/flex還支持您需要正確掃描XML的UTF-8編碼。

相關問題