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? )+ )) >

これらの括弧と、どの規則が適用されるかについて、私は非常に混乱しています:

質問1:

node7は、疑問符が原因で0 回または 1 回表示されますか? または、括弧の後の星印が原因で0 回以上表示されますか?

ノード定義の直後の数量子: node3*、node3+、node3? またはグループ化括弧の後に来る量指定子?

質問2:

node2? の前の括弧? 完全に不必要なようです-それは正しいですか?

4

1 に答える 1

2

コンテンツ モデルの括弧は、算術式やその他の再帰式言語の場合とまったく同じように機能します。どのような場合でも、括弧が必要な場合と不必要な場合があります。式の意味を理解するには、その構造を理解することが最も効果的です。どの式言語においても、式の意味は通常、その構造によって定義されます。

node7 は、疑問符が原因で 0 回または 1 回表示されますか? または、括弧の後の星印が原因で 0 回以上表示されますか?

node7 の直後の疑問符は、node7 が特定のコンテキストで 0 回または 1 回発生する可能性があることを意味します。グループの閉じ括弧の後のアスタリスク(node4?, (node5 | node6)?, node7?, node8?, node9?, node10*, node11?, node12*)は、そのシーケンス (「node4-12 シーケンス」と呼びます) 自体が 0 回以上発生する可能性があることを意味します。

ここで、node4-12 シーケンスのすべてのノードはオプションであるため、そのシーケンスの特定のオカレンスには、シーケンスで名前が付けられた要素のセットから正確に 1 つのノードを含めることができます。また、シーケンスは任意に繰り返すことができるため(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 に表示されることがあります。DTD は、パラメーター エンティティが適切に展開されたコンテンツ モデルの意味的に重要なチャンクを表すために使用されます。

コンテンツ モデル式では、コンマまたは or-bar で接続された式は、単純にすることも任意に複雑にすることもできます。一般的な規則として、部分式が周囲の式と同じ結合子を持つ場合、部分式の括弧は冗長です。たとえば、(a, ((b, c), d)) は (a, b, c, d) と同等であり、((a | b) | (c | d)) は (a | b | b | d) と同等です。 c | d)。,必要に応じて、DTD のおよびDTD 内の定義からこれを解決でき|ます。

于 2013-07-24T17:57:34.287 に答える