2011-10-03 70 views
0

我有一個文件,我將其中的所有字符串進行標記。令牌化文件中的字符串

因此,每個令牌都被存儲在char *token = (char *) malloc(len + 1);令牌在新的令牌被分配之前被釋放,所以我需要一種方法來存儲令牌以供進一步使用。

什麼是存儲令牌的好方法?我有一個函數可以一次打印出一個令牌字符串。

我在這裏的問題不是如何來標記或解析所以請忽略的是落實。我的問題是,我有一堆字符串在一個循環中被分配和釋放了好幾次。那麼,如何將每個分配存儲在別處以供進一步使用呢?

+2

我們可以看到這個文件的例子嗎? –

+3

你能提供一些更多的上下文嗎?你想做什麼? –

+1

目前,您的問題的答案範圍從完整的詞法分析解決方案(如lex)或簡單的字符串標記器(如strtok)。正如其他人所說的提供更多細節。 – Joe

回答

0

一般令牌不存儲到文件。當解析器準備好讀取更多輸入時,解析器會請求它們。

這樣,令牌被存儲在該程序的堆內存,並且它們已被處理後(這可能是長前的文件被完全解析)它們被釋放。

---更新跟隨編輯---

如果你擔心過多的分配和釋放,那麼你就有了一些解決方案,這取決於你正試圖解決這一問題的細節。

對於字符串,你可以通過一個「字符串生成器」界面,檢查是否字符串已經存在與文本創建它們,如果是這樣,返回到已經存在的字符串的引用。請注意,爲了正常工作,所有返回的字符串必須是不可變的(因爲在一個引用中更改字符串將更改所有引用中的字符串)。類似的解決方案是可能的數字,布爾值等

對於令牌再利用,可以使令牌爲結構主要由指針引用可能「拿來主義」解析器的數據。這樣解析器抓取標記的「字段」,並且「骨架」標記可以被添加回「重用隊列」。重用隊列應在重置標記器的「數據」引用之前將其返回給標記器,重寫器會重寫該標記器以向隊列請求其數據結構。在隊列中沒有令牌的情況下,隊列應該靜靜地分配它們。

其他的解決方案也存在,這取決於你想如何狡猾獲得。

+0

請參閱編輯。謝謝 – darksky

+0

我已更新問題以解決某些編輯問題。 –