2015-09-08 50 views
-2

例如,如果輸入是x+=5,程序應該返回一個數組x,+=,5。請注意,x+=之間沒有空格,因此只能按空格分隔可能無效,因爲這樣您就不得不重複遍歷整個關鍵字以找到關鍵字。如何從關鍵字字符串中檢索令牌?

我該怎麼做這樣的事情? 有沒有一種有效的方法可以做到這一點C

+0

最通用的建議是使用詞法分析器。你可能想要谷歌。如果你想要更輕的東西,你應該手工編寫代碼。 –

+1

請發佈您的嘗試到目前爲止,或者提供一個最小工作示例(MWE),以便我們可以看到您迄今嘗試過的內容,並引導您朝着正確的方向前進。 – DevNull

+1

解析器將輸入表達式,逐字符輸入,並應用標識符運算符等的規則來提取所需的數組。還要注意,一個好的解析器會採用'最長'的標記,所以它不會將'+ ='分成兩個標記。一般而言,您希望對錶達式執行一些詞法分析以提取令牌。這種活動會迅速升級到很多代碼,特別是如果你正確處理所有的邊緣情況。 – user3629249

回答

5

Lexing並不特定於C(就其他編程語言而言,您將使用類似的技術)。您可以使用手寫代碼(使用finite automaton編碼技術)來完成此操作。您可以使用像flex這樣的詞法分析生成器。您甚至可以使用regexprs,例如regex.h在POSIX系統上的功能。

Parsing也是一個衆所周知的領域與標準技術(至少爲context free languages,如果你想要一些效率)。您可以使用recursive descent parsing,您可以使用bison(它的examples非常接近您的作業)或ANTLR生成解析器。詳細瞭解LL parsing & LR parsing。順便說一句,解析技術可以用於lexing。

BTW,有噸的free software(如腳本語言解釋器一樣GuileLuaPython,等...),JSONYAML,XML解析器...幾個編譯器(如tinycc)等。說明這些技術。通過學習他們的源代碼,你將學到很多東西。

您可能更容易看到一個或兩個字符,例如通過首先讀取整個行(getline(3)或,甚至可能readline,它給你一個行編輯器)。如果您無法讀取整行,請考慮在需要時使用fgetc(3)ungetc。來自<ctype.h>的分類實用程序(如isalpha)可能會有所幫助。

如果您關心的是UTF-8(原則上您應該),因爲某些Unicode字符(如€,é,...)以UTF-8字符表示幾個字節,所以事情會變得稍微複雜一些。像libunistring這樣的圖書館應該非常有幫助。

+0

如果我想從頭開始,我會如何處理這個問題? – Anon

+1

手動編碼某種有限自動機 –

+0

來手動編寫代碼,您需要編寫一個「狀態機」,該狀態機對於每種可能的情況都具有狀態(實際上這不是很多狀態),最難的部分將編碼狀態轉換。 – user3629249