具有唯一键的XML和JSON是哪种正式语言类?


12

我把这个问题从 id没有答案的stackoverflow中移了出来。我们有一个类似的问题,JSON是否是常规的

JSON和XML都经常被称为无上下文语言-它们都主要由EBNF中的形式语法指定。但是,这仅适用于RFC 4329第2.2节中定义的JSON 它不需要对象键的唯一性(许多人可能不知道,但是{“ a”:1,“ a”:2}是有效的JSON!)。但是,如果您需要JSON中的唯一键或XML中的唯一属性名,则不能用上下文无关的语法来表示。但是,这是具有唯一键和格式正确的XML(这意味着唯一的属性名称)的JSON语言类。

我找到的关于该主题的最佳论文之一(Murato等,2001:“ 使用形式语言理论的XML模式语言分类法”)明确排除了完整性约束,例如键/键引用和唯一性,需要在附加层上进行检查。除此之外,由XML Schema或DTD定义的XML子集不受上下文限制。但不是所有格式良好的XML文档的全部。

我认为嵌套堆栈自动机(=索引语言)应该能够解析具有唯一键约束的JSON。对于XML,可以将问题简化为所有用逗号分隔的唯一整数列表的语言S。有谁知道更多,最好是被引用吗?

PS:一种确定语言的简单算法(与上下文无关的部分除外)基于良好的排序算法。因此,在“线性时间”下应确定为O(n log n)最坏的情况。我还没有发现复杂性类是“轻度上下文相关”还是“索引”,但可能介于上下文无关和上下文敏感之间(?)。

编辑:也许我更好地为理论性更强的计算机科学家重新提出了这个问题。给定Backus-Naur-Form可以重复(x := a+ x := a | x a)表示的所有语言的CFL类。现在我该怎么获得计算能力,如果我介绍了“重复独特的实例”操作^,所以a^是一个序列a,其中在终端的不同序列的每个元素的结果吗?


具有可重复对象键的JSON是上下文无关的(请参阅JSON语法),但是如何在通用语法或自动机中表达唯一键约束?或:如果XML解析器可以检测到所有格式正确的XML文档的集合(格式正确意味着每个元素具有唯一的属性名称),那么哪个复杂度类别属于XML解析器。
雅各布

1
在此处使用编译器生成器术语。JSON和XML 各自的语法当然是上下文无关的。诸如唯一标识符或值类型限制之类的属性是静态语义(有人也称这种语法,但出于多种原因,我拒绝使用该命名法)。解析器生成器通常使您可以通过不需要上下文无关的语法/语义谓词之类的东西来丰富通用解析器。理论上,使用归因语法。我不知道这些功能是否可以用任何能力的形式语法自然表达。
拉斐尔

1
形式语言的哪些部分超出了语法,取决于观点。下推自动机可以解析XML和JSON等简单的嵌套结构。我只是想知道,如果自动机中充斥着字典来查找以前是否已读取存储值,以确保唯一性约束,那么您将获得哪种计算能力。我猜它是一个索引语法(一个嵌套堆栈自动机?),但是有几种索引语法。
雅各布

@Jakob,我将把讨论内容(简短的)折叠成一个问题,这样您就可以清楚知道您要问什么
Suresh Venkat

LBA应该足够了,因为您不必再​​存储比文本中包含字符更多的标识符。我对CFL和CSL之间的类了解不足,无法在那里获得帮助。
拉斐尔

Answers:


6

将BNF与您的唯一重复运算符配合使用时,x := S^表示an xasymbol 的实例S,可以选择后面跟b有set 的实例S - a,本身是后面可以跟着cset 的实例S - a - b,依此类推。如果|S|是的数目S,并且是有限的,那么2 ^ |S|! - 1是的数目S^

就所描述的语言的计算能力而言,谈论实际上没有意义,因为这是关于静态语义的,介于语法和普通(动态)语义之间。语法的表达能力得到了扩展,因为它具有表达特定类型的输入适应的形式化手段。

具体而言,它提供了一种接受特定集合的子集排列的方法。我认为此类语言没有任何现有名称。它当然不是上下文无关的,但是上下文要求至少受到了严格控制。如果您需要一个术语,只需投一个即可。我建议针对上下文类别的语言,如果没有其他有关静态语义约束的嵌入式信息,就无法用上下文无关的语法来描述,这在本质上模糊的语法。

特定扩展名最有用的应用可能就是引入唯一键约束的功能,但是它也使您可以将诸如的有趣集描述为x := [0-7]^,它与8个八进制数或更少的非重复数字匹配。至于它的复杂性,确定是否可以看到集合中的元素并不差于对数,并且检查的频率在匹配的元素数量中是线性的,因此^操作员的确可以在最坏情况下的线性时间确定。


感谢您的回答和提示以考虑子集的排列。尽管唯一重复操作符不会捕获具有唯一键的键值对,但是在这种情况下,复杂度应该相同。但是,如果我开始将运算符应用于任意结构,则某些CFL S^所在的类S可能会变得不受上下文限制,因为CFL在不同情况下不会关闭。如果S是常规语言,则应该可行,但是不幸的是,您无法确定给定的CFL是否为常规语言。也许我会提出另一个问题,因为这超出了JSON和XML的限制。
雅各布
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.