这是一个非常标准的扫描练习。取决于你打算如何接近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