2013-02-14 57 views
4

我想寫讀取從格式的文件逃脫字符串LOLCODE一個解釋:轉換轉義序列到他們的真實再現

VISIBLE "HAI \" WORLD!" 

因我所希望顯示的輸出:

HAI " WORLD! 

我試圖動態生成爲了做到這一點對printf格式字符串,但似乎轉義是在一個字符串的申報階段完成。

從本質上說,我所尋求的正是這個問題的反面: Convert characters in a c string to their escape sequences

有什麼辦法去了解呢?

+0

'如果(STR [1] == '\\') { 開關(STR [++ I]) { 殼體 'A':輸出( 「\一」); 突破; ... } }' 好吧,這似乎是最簡單的做事方式,但可能並沒有處理所有的轉義字符。有沒有更優雅的方式? – peteykun 2013-02-14 10:29:09

回答

3

這是一個非常標準的掃描練習。取決於你打算如何接近LOLCODE規範(目前我無法達到這個目標,所以這是來自內存),你有幾條路要走。

用手寫一個詞法分析器

這不像聽起來那麼難。您只需要一次分析您輸入的一個字符,同時保留一些上下文信息。在你的情況下,重要的上下文由兩個標誌組成:

  • 一個人要記住你目前正在瀏覽一個字符串。讀取"時將被設置,並在讀取"時清除。
  • 要記住以前的人物是一個逃生。在閱讀\時它會被設置,並且在閱讀完字符後被清除,無論它是什麼。

那麼一般的算法是這樣的:(僞)

loop on: c ← read next character 
    if not inString 
    if c is '"' then clear buf; set inString 
    else [out of scope here] 
    if inEscape then append c to buf; clear inEscape 
    if c is '"' then return buf as result; clear inString 
    if c is '\' then set inEscape 
    else append c to buf 

您可能要細化inEscape情況下,如果你想實現\r\n等。

使用詞法分析器發電機

這裏的傳統工具是lexflex

獲取靈感

你不是第一個寫LOLCODE解釋器的人。偷看別人是怎麼做的沒什麼問題。例如,這裏是the string parsing code from lci