2013-07-23 68 views
0

所以 - 我有.dtd文件這個大XML節點定義:xml .dtd文件。關於括號優先混亂

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

我對這些括號很迷茫,該規則將適用:

問題1:

可以node7顯示0或1次由於問號或0或更多次由於括號後面的星號?

什麼會勝 - 量詞立即節點定義:node3 *,node3 +,node3?或者括號後面的那些量詞?

問題2:

node2之前的括號?似乎完全沒有必要 - 這是否正確?

回答

2

內容模型中的括號與數學表達式或任何其他遞歸表達式語言的工作方式相同 - 在任何特定情況下,它們可能是必需的或不必要的,並且您可以通過理解來理解表達式的含義它的結構,因爲在任何表達方式中,表達方式的含義通常都會根據其結構來定義。

節點7是否因爲問號顯示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*)*中,最後的星號適用於整個節點4-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中的,|的定義來解決這個問題。

+0

很棒的回答。謝謝! – user2568737