2013-01-05 66 views
1

为什么它在大括号内引用,你必须转义所有括号(不应该包括在嵌套中),但是在括号替换中,你没有逃避所有括号(不应包括在嵌套中)。嵌套{}和[]之间的差异

puts "}" ;# ok in top-level (1) 
if {1} {puts "}"} ;# but not ok when inside a brace quote (2) 

puts {]} ;# ok in top-level (3) 
set output [puts {]}] ;# and still ok inside a bracket substitution (4) 

回答

4

当解释一个单词的开头遇到{,它会寻找匹配}得到了这个词(命令名执行或其中一个参数发送到命令)。

但是,当口译人员遇到未转义的[时,它不会查找匹配的]。它会停止解析脚本本身并递归调用另一个解释器。该解释器开始解析[后面的字符。当它在例4中找到{时,它开始引用模式,因此]被视为正常字符。

那么为什么不是在遇到{时递归地调用解释器,并且摆脱了示例2中的大括号问题?因为你用大括号引用的单词并不总是一个脚本,即使它是,它可能不应该马上运行。 Brace引述必须精确;解析器不能根据它们是否在",[]等等之内来区别对待字符,就像脚本解析器一样。

+1

在实现级别,我们解析语言解析器中的'['...']'序列,并依靠命令编译器确定要分析哪些序列。 –