0

所以 - 我在 .dtd 文件中有这个大的 xml 节点定义:

<!ELEMENT def ( node1?, 
                ( node2?, 
                  node3*, 
                  ( ( node4?, 
                      (node5 | node6)?, 
                      node7?, node8?, node9?, 
                      node10*, node11?, node12* )*, 
                    node13, 
                    ( node14, node15?, node16?, 
                      node17*, node18 )?, 
                    node19*, node20? )+ )) >

我对这些括号以及适用哪些规则感到非常困惑:

问题一:

node7 是否可以因为问号出现0 次或 1 次,或者因为括号后的星号出现0 次或多次?

什么会赢得 - 节点定义后的量词:node3 *,node3 +,node3?还是分组括号之后的那些量词?

问题2:

node2之前的括号?似乎完全没有必要——对吗?

4

1 回答 1

2

内容模型中的括号的工作方式与算术表达式或任何其他递归表达式语言中的括号相同——在任何给定的情况下,它们可能是必要的或不必要的,您可以通过理解表达式的结构来最好地理解表达式的含义,因为在任何表达式语言中,表达式的含义通常根据其结构来定义。

node7 是否可以因为问号出现 0 次或 1 次,或者因为括号后的星号出现 0 次或多次?

紧跟在 node7 之后的问号表示 node7 在给定的上下文中可以出现零次或一次。该组右括号后的星号(node4?, (node5 | node6)?, node7?, node8?, node9?, node10*, node11?, node12*)表示该序列(我将其称为“node4-12 序列”)本身可以出现零次或多次。

现在,由于 node4-12 序列中的每个节点都是可选的,因此该序列的任何给定出现都可以恰好包含序列中命名的元素集合中的一个节点。并且由于序列可以任意重复,这意味着(node4?, ..., node12*)*内容模型中的星号表达式相当于更简单的表达式(node4 | node5 | node6 | node7 | node8 | node9 | node10 | node11 | node12)*

什么会赢得 - 节点定义后的量词:node3 *,node3 +,node3?还是分组括号之后的那些量词?

两者都适用。每个出现指示符都适用于前面的表达式:在 中node7?,问号适用于表达式node7,而在较大的组(node4?, ... node12*)*中,最后的星号适用于整个 node4-12 序列。

有时,内部出现指示符或外部出现指示符都是多余的,可以在不改变表达式接受的语言的情况下省略: (a*)+等效于(a*)或到(a)*或只要它不是整个内容模型到a*

node2之前的括号?似乎完全没有必要——对吗?

组周围的括号开始node2和继续node20是不必要的,是的。也就是说,所写的内容模型的含义与我们删除这些括号时的含义相同。像这样的多余括号有时会出现在最初使用参数实体起草的 DTD 中,以表示语义上重要的内容模型块,其中参数实体已被扩展到位。

在任何内容模型表达式中,用逗号或or-bar 连接的表达式可以是简单的,也可以是任意复杂的。一般规则是,如果子表达式与周围的表达式具有相同的连接符,则子表达式的括号是多余的。例如 (a, ((b, c), d)) 等价于 (a, b, c, d),并且 ((a | b) | (c | d)) 等价于 (a | b | c | d)。如果您愿意,可以从 DTD 的定义,和DTD 中解决这个问题。|

于 2013-07-24T17:57:34.287 回答