将转义序列从用户输入转换为真实表示

时间:2013-02-14 10:14:12

标签: c escaping lolcode

我正在尝试为LOLCODE编写一个解释器,它从表单中的文件中读取转义字符串:

VISIBLE "HAI \" WORLD!"

我希望显示输出:

HAI " WORLD!

我试图为printf动态生成一个格式字符串,但似乎转义是在声明字符串文字的阶段完成的。

从本质上讲,我正在寻找的是这个问题的正好相反: Convert characters in a c string to their escape sequences

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分: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