基于Chez Scheme的编译器开发:向输出端口写入特殊字符问询
在Chez Scheme中向输出端口写入特殊字符的几种方法
嘿,刚好我之前写Scheme到汇编的编译器时也踩过类似的坑!针对你现在用拼接巨型字符串生成汇编再写入文件的场景,这里有几种处理特殊字符的实用方式:
1. 拼接字符串时直接嵌入转义序列
如果你还是习惯先把所有汇编代码拼成一个大字符串str,那在构建字符串的时候可以直接用Chez Scheme支持的转义序列来表示特殊字符:
- 换行符:用
"\n",你已经在用来分隔汇编行啦 - 制表符:用
"\t",用来对齐汇编代码的注释很方便 - 反斜杠:用
"\\",如果你的汇编里需要输出反斜杠的话 - 双引号:用
"\"",如果汇编字符串里要包含双引号 - 任意ASCII字符:用十六进制转义
"\xNN"或者八进制转义"\NNN",比如"\x0D"表示回车符,"\000"表示NULL字符
举个例子,拼接一行带制表符和换行的汇编:
(define str (string-append "mov rax, rbx" "\t; 把rbx的值移到rax" "\n"))
2. 直接向输出端口写入特殊字符(跳过字符串拼接)
如果有些特殊字符不想先拼进大字符串,或者需要动态生成,你可以直接操作输出端口来写入:
- 用
put-char写入单个特殊字符:比如写换行符可以用(put-char port #\newline),写制表符用(put-char port #\tab),甚至可以直接用ASCII码生成字符:(put-char port (integer->char 0x07))(这是响铃符) - 用
newline快捷写入换行:(newline port)等价于(put-char port #\newline),代码更简洁
比如,如果你已经打开了输出端口port,可以这样混合写入字符串和特殊字符:
(call-with-output-file "output.s" (lambda (port) (display "mov rax, rbx" port) (put-char port #\tab) (display "; 注释" port) (newline port)))
3. 注意写入文件时的函数选择
当你把拼接好的字符串str写入文件时,一定要用display而不是write:
display会直接输出字符串的原始内容,不会添加额外的引号或转义,正好符合你生成汇编文件的需求write会把字符串当成Scheme对象输出,会自动给字符串加双引号,还会转义里面的特殊字符,这会导致你的汇编代码出现多余的引号,绝对不是你想要的
正确的写入方式示例:
(call-with-output-file "output.s" (lambda (port) (display str port)))
这样不管你字符串里的特殊字符是用转义序列还是字符对象拼接的,都会正确输出到汇编文件里~
内容的提问来源于stack exchange,提问作者erap129
相关产品推荐
相关产品推荐

