2013-02-14 58 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