2013-07-23 3 views
0

Так что - у меня есть это большое определение XML-узел в .dtd файла: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:

Может ли узел 7 показать 0 или 1 раз по причине вопроса или 0 или более из-за знака звезды после круглой скобки?

Что бы выиграть - кванторы сразу после определения узла: node3 *, node3 +, node3? или тех квантификаторов, которые появляются после группировки скобок?

Вопрос 2:

Скобки перед тем node2? кажется совершенно ненужным - это правильно?

ответ

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*)* конечная звездочка применяется ко всей последовательности узла 4-12.

Иногда либо внутренний индикатор возникновения или внешний один является избыточным и может быть опущен без изменения формулировки, принятой по выражению: (a*)+ эквивалентно (a*) или (a)* или до тех пор, как это не весь контент модель a*.

Скобки перед узлом2? кажется совершенно ненужным - это правильно?

Круглые скобки вокруг группы, начинающиеся с node2 и продолжающиеся до node20, не нужны. То есть, модель контента как написанная означает то же самое, что и в случае, если мы удалим эти круглые скобки. Быстрые круглые скобки, подобные этому, иногда появляются в DTD, которые были первоначально составлены с использованием объектов параметров для представления семантически значимых фрагментов моделей контента, в которых объекты параметров были расширены.

В любом выражении модели содержимого выражения, связанные запятой или или-баром, могут быть простыми или произвольно сложными. Общее правило заключается в том, что скобки для подвыражения являются избыточными, если подвыражение имеет тот же коннектор, что и окружающее выражение. Например, (a, ((b, c), d)) эквивалентно (a, b, c, d) и ((a | b) | (c | d)) эквивалентно (a | b | c | d). Вы можете это сделать из определений , и | в DTD, если хотите.

+0

Отличный ответ. Спасибо! – user2568737

 Смежные вопросы

  • Нет связанных вопросов^_^