公共命名空间的例子3

有这样一个句子

用x语言解释[1+2*3]。
在x语言中,不符合“先乘除后加减”,这个句子应该怎样解释呢?
第一步,进行词法分析,目的是识别出注释和字符串,其中可能包括任意符号,干扰编译过程。
第二步,用句号、分号分割,并用数数的方法处理括号,识别出单个语句。这种分析方法是先用优先级低的符号进行分割,再分别处理每个段落。
以1+2×3为例,原本的做法是先算乘除,新的方法是:先用加号分割,再处理1和2×3,最后构建起一棵语法树。
现有的语言中也有类似情况,如正则表达式。
用正则表达式[...]处理字符串[...]。
正则表达式被当成一个字符串,在运行时编译并执行。
新编译原理的目标是,在编译阶段就处理好这些事情。这需要修改编译器,并采用新的编译技术。如果难以实现,就继续沿用正则表达式的方案,推迟到运行时再编译。
如果是这样,上述句子应该写成:
用x语言解释["1+2*3"]。
加上一对双引号,按字符串处理。
追求极致的程序员希望去掉这对双引号。

字符串

不管怎么说,语言中需要有字符串。在公共命名空间的理论中只有句子符合这一要求。所以说,“字符串”是一个句子,在公共命名空间中占据单独的一行。不同语言对于字符串的不同定义,在这一行的不同列。
本文仅仅是举个例子,没有强制要求语言应该是什么样子,抛砖引玉。
最基本的字符串,是C语言中的样子,双引号字符串。
"hello world\n"
扩展后的字符串,主要参考了Python语言。包括单引号字符串、三个双引号的、三个单引号的。
'He said:"hello".'
在字符串内部出现双引号,可以采用单引号标识字符串的首尾,这样可以避免使用反斜线转义。
"He said:\"hello\"."
三个双引号、三个单引号的字符串可以跨越多行。
在Python中还有raw-string和format-string,其中raw-string用于正则表达式就很方便,否则,要写下连续四个反斜线来表示一个反斜线。
r"\d{4,7}"
如果没有raw-string,要写成:
"\\\\d{4,7}"
这是因为连续两个反斜线表示一个反斜线,在C语言或Java语言解析字符串时,四个就变成了两个,再交给正则表达式引擎去解释,两个才变成一个。这很麻烦,有了raw-string就方便多了。

关于format-string,它的形式为f"hello {name}",其中name是一个变量。在Perl语言中的写法是"hello $name"或"hello ${name}",这叫做字符串内插。

程序员可以在公共命名空间中说出自己的想法,然后语言的制作者参考这些想法,落实到语言中。例如,关于字符串内插,就有以下变化。
"hello \=name"或"hello \(=name)"或"hello \name"
第一个是第二个的简写形式,省略了小括号。
第三个是最简形式,还省略了等于号。
当反斜线后边可以正确解析出一个单词时,可以省略小括号;当这个单词可以和\n, \t相区分时,可以省略等于号。设计小括号和等于号是因为有如下字符串:
"hello \namegood"
"the value of n is \n"
这一设计使得转义字符尽可能少,只剩下一个反斜线了。Python语言中,format-string中使用大括号还要求特殊写法。

>>> a=2.5
>>> b=f"a={a}"
>>> b
'a=2.5'
>>> c=f"a={{a}}"
>>> c
'a={a}'
>>>

连续两个左大括号表示一个左大括号。
字符串中尽可能少地定义转义符,是这一设计的核心。

中括号

例子[ \] ]或[ \[ ]
例子[ [ ] ]
在中括号里使用不配对的中括号,加反斜线。或者是,在中括号里使用配对的中括号,构成嵌套的括号。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值