XML、S表达式和重叠作用域……它被称为什么?

6
我正在阅读XML不是S-Expressions。XML的作用域有点严格,S-Expressions也是如此。在我看过的每种编程语言中,你都不能拥有以下内容: <b>BOLD <i>BOTH </b>ITALIC</i> == BOLD BOTH ITALIC 这甚至无法用S-Expressions表达: (bold "BOLD" (italic "BOTH") "ITALIC") == :(
是否有任何编程语言支持这种“重叠”的作用域?它可能有任何实际用途吗?
2个回答

3
重叠的标记结构有许多实际用途。例如,考虑在人文学科中使用并发标记分析文本的应用程序国际重叠结构标记研讨会指出:

重叠结构是无处不在的,在文本标记的应用程序中,如飞机维护手册和古代经典和礼仪作品等各种应用中都出现过。 "重叠问题" 在文本编码超越特定层次结构的快照视图以表示和处理文本的多个并发方面时会引起麻烦,其中包括反映文本跨多个版本和变体(无论是排版还是呈现,结构,注释或参考,分类或主题)演变的特征。

重叠是各种文本中的问题,例如技术文件和产品手册(版本控制),法规(有效性),文学作品(散文与戏剧结构,修辞结构,注释),神圣文本(章节加上诗句引用与句子结构和评论),以及语言语料库(多层语言注释)。

文本编码倡议(TEI)发布了处理非嵌套信息的指南,并提供了一种用于重叠的XML语法。他们在2004年表示:

尚未提出可以结合所有期望属性的解决方案,包括形式简单、能够表示所有发生或可想象的结构类型、适用于正式或机械验证以及与需要更简单情况(即文本特征嵌套正确的情况)所需符号的清晰标识。

处理重叠结构的一些选项包括:

SGML具有CONCUR功能,可用于支持重叠结构,尽管标准的作者Goldfarb认为“因此我建议不要使用CONCUR创建文档的多个逻辑视图”。

GODDAG提供了一种用于表示具有重叠结构的文档的数据结构。

XCONCUR是一种实验性的标记语言,主要目标是以类似XML的方式提供一种方便的方法来表达并发层次结构。


2
可能没有任何编程语言在其正式定义中支持重叠作用域。虽然从技术上讲是可能的,但这会使实现比必要的更加复杂。它还会使语言模糊不清,无法确定什么是有效的,而很可能是一个错误。
我现在能想到的唯一实际用途是它输入更少,写起来更直观,就像在标记中写属性感觉更直观,而不需要引号,如<foo id=45 />而不是<foo id="45" />
我认为强制嵌套结构也可以使处理更有效率。通过强制嵌套结构,解析器可以将节点推入和弹出单个堆栈,以跟踪打开节点的列表。对于重叠的范围,您需要一个有序的打开范围列表,每当遇到begin-new-scope标记时都需要添加到该列表中,然后每次遇到end-scope标记时扫描该列表,以查看最可能关闭的打开范围是哪个。
尽管没有编程语言支持重叠作用域,但有 HTML 解析器支持它作为其错误恢复算法的一部分,包括所有主要浏览器中的解析器。
此外,C中的switch语句允许类似于重叠作用域的结构,例如Duff's 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 语句以及某些语言中的 breakcontinue 也可以让您将程序结构化,使其表现得像重叠的作用域。
BOLD: while (bold)
 { styles.add(bold)
   print "BOLD"

   while(italic) 
    { styles.add(italic)
      print "BOTH";
      break BOLD;
    }
 }

italic-continued: 
    styles.remove(bold)
    print "ITALIC"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接