Mr.*_*ite 6 html lisp xml scope s-expression
我在读XML不是S-Expressions.XML范围是一种严格的,S表达式也是如此.在我见过的每种编程语言中,你都不能拥有以下内容:
<b>BOLD <i>BOTH </b>ITALIC</i>== BOLD BOTH ITALIC
它甚至不能用S-Expressions表达:
(bold "BOLD" (italic "BOTH" ) "ITALIC" ) == :(
是否有任何编程语言支持这种"重叠"范围?它有什么实际用途吗?
可能没有任何编程语言在其正式定义中支持重叠范围。虽然技术上可行,但它会使实施变得比需要的更加复杂。它还会使语言变得含糊不清,无法接受很可能被认为是错误的内容。
我现在能想到的唯一实际用途是它的打字次数更少,并且编写得更直观,就像在标记中编写属性而不需要不必要的引号感觉更直观一样,而<foo id=45 />不是<foo id="45" />.
我认为强制执行嵌套结构也可以提高处理效率。通过强制执行嵌套结构,解析器可以将节点推入和弹出到单个堆栈上以跟踪打开节点的列表。对于重叠范围,您需要一个开放范围的有序列表,每当遇到开始新范围令牌时都必须附加到该列表,然后每次遇到结束范围令牌时进行扫描以查看哪个开放范围最有可能是它关闭的范围。
尽管没有编程语言支持重叠作用域,但有一些 HTML 解析器支持它作为其错误恢复算法的一部分,包括所有主要浏览器中的算法。
此外,Cswitch中的语句允许看起来像重叠作用域的构造,如Duff 的 Device中所示:
switch(count%8)
{
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while(--n>0);
}
Run Code Online (Sandbox Code Playgroud)
因此,从理论上讲,编程语言通常可以对范围具有类似的语义,以便在需要时允许使用这些类型的优化技巧,但可读性会非常低。
该goto语句以及某些语言中的break和continue还允许您构建程序以使其表现得像重叠范围:
BOLD: while (bold)
{ styles.add(bold)
print "BOLD"
while(italic)
{ styles.add(italic)
print "BOTH";
break BOLD;
}
}
italic-continued:
styles.remove(bold)
print "ITALIC"
Run Code Online (Sandbox Code Playgroud)