我正在阅读XML is not S-Expressions。XML 范围有点严格,S 表达式也是如此。在我见过的每一种编程语言中,你都不能拥有以下内容:
<b>BOLD <i>BOTH </b>ITALIC</i>
==加粗 斜体 _
它甚至不能用 S-Expressions 表达:
(bold "BOLD" (italic "BOTH" ) "ITALIC" )
== :(
是否有任何编程语言支持这种“重叠”范围?它有什么实际用途吗?
我正在阅读XML is not S-Expressions。XML 范围有点严格,S 表达式也是如此。在我见过的每一种编程语言中,你都不能拥有以下内容:
<b>BOLD <i>BOTH </b>ITALIC</i>
==加粗 斜体 _
它甚至不能用 S-Expressions 表达:
(bold "BOLD" (italic "BOTH" ) "ITALIC" )
== :(
是否有任何编程语言支持这种“重叠”范围?它有什么实际用途吗?
重叠标记结构有许多实际用途。例如,考虑在人文学科文本分析中应用并发标记。重叠结构标记国际研讨会指出:
重叠结构无处不在,出现在文本标记的应用中,如飞机维修手册和古代圣经和礼仪作品。每当文本编码超越特定层次结构的快照视图来表示和处理文本的多个并发方面时,“重叠问题”就会浮出水面,包括反映文本跨多个版本和变体演变的特征,无论是印刷的还是表现的、结构的,注释或参考,分类或主题。
重叠是各种文本中的问题,如技术文档和产品手册(版本控制)、法律法规(有效性)、文学作品(散文与戏剧结构、修辞结构、注释)、神圣文本(章节加经文参考与句子结构和评论) )和语言语料库(多层语言注释)。
文本编码倡议 (TEI) 发布了处理非嵌套信息的指南,并为重叠提供了 XML 语法。他们在 2004 年表示:
[N] 尚未提出任何解决方案,它结合了形式简单性的所有理想属性、表示所有发生或可想象的结构类型的能力、形式或机械验证的适用性,以及与更简单案例(即案例文本特征正确嵌套的地方)。
处理重叠结构的一些选项包括:
SGML有一个CONCUR特性,可用于支持重叠结构,尽管 Goldfarb(该标准的作者)写道“因此我建议不要使用 CONCUR 来创建文档的多个逻辑视图”。
GODDAG提供了一种数据结构来表示具有重叠结构的文档。
XCONCUR是一种实验性标记语言,其主要目标是提供一种方便的方法来以类似 XML 的方式表达并发层次结构。
可能没有任何编程语言在其正式定义中支持重叠范围。虽然在技术上是可行的,但它会使实现变得比它需要的更复杂。它还会使语言模棱两可地接受很可能是错误的内容。
我现在能想到的唯一实际用途是它减少了输入并且写得更直观,就像在标记中写属性感觉更直观,没有不必要的引号,就像在<foo id=45 />
而不是<foo id="45" />
.
我认为强制嵌套结构也可以提高处理效率。通过强制嵌套结构,解析器可以将节点推送和弹出到单个堆栈以跟踪打开节点列表。对于重叠的范围,您需要一个有序的开放范围列表,每当您遇到begin-new-scope令牌时都必须附加到该列表,然后在每次遇到end-scope令牌时扫描以查看哪个开放范围很可能是它关闭的范围。
尽管没有编程语言支持重叠作用域,但有一些 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);
}
因此,理论上,编程语言通常可以对范围具有相似的语义,以便在需要时允许使用这些技巧进行优化,但可读性会非常低。
该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"