我设计的字符串
遇到的问题
最初字符串是这样的:“hello world”
如何表示换行符呢?于是有了转义符:"\n"
想要说:she said:“hello” → 边界符冲突
想要说:C:\abc\123.txt → 转义符冲突
更变态的需求,再套一层:
第一层:print("hello\n")
第二层:print("print(\"hello\\n\")")
第三层:print("print(\"print(\\\"hello\\\\n\\\")\")")
我的设计
25" \25 "25
以数字(如25)或一个标识符,做为双引号的前缀。
转义符相应地就从反斜线变成了\25,右边界符变成了"25。
上述套三层的例子,用新的设计写出来就是这样:
第一层:print(“hello\n”)
第二层:print(1"print(“hello\n”)"1)
第三层:print(2"print(1"print(“hello\n”)"1)"2)
再多套几层也可以,不会出现4个反斜线,甚至8个、16个反斜线的情况。
如何实现
也需要用有限状态机,但和正则表达式等价的那种有限状态机,恐怕不能完成任务。需要手写有限状态机,并在适当的位置添加代码。例如,前缀25需放在一个变量里,判断是不是转义符和右分界符时,结合这个变量来处理。
已有的研究显示,用“函数族”可以代替有限状态机。例如,正则表达式/\d+/对应的有限状态机,可以先用一个函数实现判断是否数字,再用一个函数实现量词+,在函数2中调用函数1,即可实现/\d+/的功能。在手写有限状态机的过程中,可适当使用函数族。
