【问题标题】:Convert escape sequences from user input into their real representation将来自用户输入的转义序列转换为其真实表示
【发布时间】:2023-03-06 01:31:01
【问题描述】:

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

VISIBLE "HAI \" WORLD!"

我希望显示以下输出:

HAI " WORLD!

我曾尝试为 printf 动态生成格式字符串以执行此操作,但似乎转义是在字符串文字的声明阶段完成的。

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

有没有办法解决这个问题?

【问题讨论】:

  • if(str[i] == '\\') { switch(str[++i]) { case 'a': printf("\a"); break; ... } } 好吧,这似乎是最简单的处理方式,但可能无法处理所有转义字符。有没有更优雅的方式?

标签: c escaping lolcode


【解决方案1】:

这是一个非常标准的扫描练习。根据您打算与 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

如果您想实现\r\n 等,您可能需要优化inEscape 案例。

使用词法分析器生成器

这里的传统工具是lexflex

获得灵感

您不是第一个编写 LOLCODE 解释器的人。偷看别人是怎么做的也没什么不好。例如,这里是the string parsing code from lci

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 2013-11-28
    • 2021-07-27
    • 2023-04-10
    相关资源
    最近更新 更多