確定假設我正在解析一些XML(在閱讀任何「語言」時存在該問題,但XML是許多人熟悉的)。在C++中查找字符串中的子串標記
的XML如下所示:
<Tag>
<[CDATA[ blah blah]]>
<Tag2>
<Tag3/>
</Tag2>
<Tag>
現在我想找到那個流上的各種標記。重要的代幣如下(請原諒我蹩腳的「代幣」名稱;))。
< = Open Token
<[CDATA[ = Open CDATA Token
]]> = Close CDATA Token
<! = Open Comment Token
/> = Close Open Token
</ = Open Close Token
> = Close Token
我的問題是,我有以上的數組,我試圖正確地識別上述令牌之一,因爲我在用字符的文件字符閱讀。
所以我讀了第一個字符'<'。即時的想法是,這與「Open Token」相匹配,所以我們會選擇它。但是,這也與「打開關閉令牌」的第一個字符相匹配。因此,讓我們說我們讀了第二個字符和它的a'T'。所以我立即知道這是「Open Token」而不是「Open Close Token」。
同樣在完成一個標籤,例如「/>」。我讀了第一個字符,並得到'/'。這匹配「關閉開放令牌」。但它不完整,所以我應該檢查下一個字符,在這種情況下是'>'給我「/>」,它與Close Token匹配。
我的問題是,當這些令牌的數量顯着增加時,很難跟蹤可能的匹配項。有沒有一個優雅的方式來做到這一點?或者我應該,只要當我遇到「標記字符串」之一的第一個字符時,將該標記推到一個向量上,然後只在隨後的讀取中檢查這些標記?如果下一個字符不匹配,我可以清除令牌列表,然後重新開始。
這是解決問題的正確方法嗎?有沒有更好的辦法?
(編輯:請不要指向我往Lexx,YACC等等......我想在這裏學到一些基礎知識)
任何幫助,將不勝感激:)
您提到的問題被稱爲預測和回溯。我認爲,如果你想爲解析器構建優雅的解決方案,那麼你應該檢查函數解析器和解析器組合器:這可以讓你構建一個解析器,主要是聲明語法生成規則。 – 2010-12-03 23:33:03