這是一個非常標準的掃描練習。取決於你打算如何接近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
等。
使用詞法分析器發電機
這裏的傳統工具是lex和flex。
獲取靈感
你不是第一個寫LOLCODE解釋器的人。偷看別人是怎麼做的沒什麼問題。例如,這裏是the string parsing code from lci。
'如果(STR [1] == '\\') { 開關(STR [++ I]) { 殼體 'A':輸出( 「\一」); 突破; ... } }' 好吧,這似乎是最簡單的做事方式,但可能並沒有處理所有的轉義字符。有沒有更優雅的方式? – peteykun 2013-02-14 10:29:09