Скобки в моделях содержимого работают так же, как и в арифметических выражениях или любом другом языке рекурсивного выражения - в любом случае они могут быть необходимы или ненужны, и вы можете понять смысл выражения, лучше всего понимая его структура, потому что в любом выражении язык выражения выражения обычно определяется в терминах его структуры.
Может ли 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, если хотите.
Отличный ответ. Спасибо! – user2568737