XML, S-выражения и перекрывающиеся области видимости ... Как это называется? - PullRequest
6 голосов
/ 02 августа 2010

Я читал XML - это не S-выражения .Область видимости XML довольно строгая, как и S-выражения.И на каждом языке программирования, который я видел, вы не можете иметь следующее:

<b>BOLD <i>BOTH </b>ITALIC</i> == BOLD ОБА ITALIC

Это даже невозможно выразить с помощью S-выражений:

(bold "BOLD" (italic "BOTH" ) "ITALIC" ) ==: (

Поддерживает ли какой-либо язык программирования этот вид "перекрытия""scoping? Может ли быть какое-либо практическое применение для этого?

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Перекрывающиеся структуры разметки имеют множество практических применений. Рассмотрим, например, приложения одновременной разметки для анализа текста в гуманитарных науках . Международный семинар по разметке перекрывающихся конструкций отметил, что:

Перекрывающиеся структуры вездесущи и появляются в приложениях текстовой разметки, столь же разнообразных, как руководства по техническому обслуживанию самолетов и древние писания и литургические произведения. «Проблема перекрытия» поднимает свою уродливую голову всякий раз, когда кодировка текста выходит за рамки снимка определенной иерархии, чтобы представлять и обрабатывать несколько одновременных аспектов текста, включая функции, которые отражают эволюцию текста в разных версиях и вариантах, будь то типографская или презентационная, структурная , аннотационный или референтный, таксономический или тематический.

Наложение - это проблема в таких разнообразных текстах, как технические документы и руководства по продуктам (управление версиями), юридические коды (эффективность), литературные произведения (просадическая или драматическая структура, риторические структуры, аннотации), священные тексты (глава плюс ссылка на стих и предложение). структура и комментарии) и языковые корпуса (несколько уровней лингвистической аннотации).

Инициатива кодирования текста (TEI) публикует Рекомендации по обработке информации, не являющейся вложением и предоставляет синтаксис XML для перекрытия. В 2004 году они заявили, что:

[N] o еще не было предложено решение, которое сочетает в себе все желательные атрибуты формальной простоты, способность представлять все существующие или мыслимые типы структур, пригодность для формальной или механической проверки и четкую идентичность с обозначениями, необходимыми для более простых случаев. (т. е. случаи, когда текстовые элементы правильно вложены).

Некоторые опции для обработки перекрывающихся структур включают:

SGML имеет функцию CONCUR , которую можно использовать для поддержки перекрывающихся структур, хотя Goldfarb (автор стандарта) пишет, что «« поэтому я рекомендую не использовать CONCUR создать несколько логических представлений документа ".

GODDAG предоставляет структуру данных для представления документов с перекрывающимися структурами.

XCONCUR - это экспериментальный язык разметки, основной целью которого является предоставление удобного метода для выражения параллельных иерархий в стиле XML.

2 голосов
/ 02 августа 2010

Вероятно, нет никакого языка программирования, который поддерживает перекрывающиеся области в своем формальном определении. Хотя это технически возможно, это сделает реализацию более сложной, чем необходимо. Это также сделало бы язык двусмысленным, так как он признал бы действительным то, что, скорее всего, было бы ошибкой.

Единственное практическое использование, о котором я могу подумать сейчас, - это то, что он менее типизирован и написан более интуитивно, так же, как при написании атрибутов в разметке он кажется более интуитивным без лишних кавычек, как в <foo id=45 /> вместо <foo id="45" />.

Я думаю, что применение вложенных структур также способствует более эффективной обработке. Путем применения вложенных структур анализатор может помещать и вставлять узлы в один стек, чтобы отслеживать список открытых узлов. В случае перекрывающихся областей вам потребуется упорядоченный список открытых областей, к которым вам нужно будет добавлять всякий раз, когда вы сталкиваетесь с токеном begin-new-scope , а затем сканировать каждый раз, когда вы сталкиваетесь с end-scope токен, чтобы увидеть, какая открытая область, скорее всего, будет той, которую он закрывает.

Хотя ни один из языков программирования не поддерживает перекрывающиеся области действия, существуют анализаторы HTML, которые поддерживают его как часть своих алгоритмов восстановления после ошибок, в том числе во всех основных браузерах.

Кроме того, оператор switch в C допускает конструкции, которые выглядят как перекрывающиеся области, как в Устройство Даффа :

switch(count%8)
  {
   case 0:  do{ *to = *from++;
   case 7:      *to = *from++;
   case 6:      *to = *from++;
   case 5:      *to = *from++;
   case 4:      *to = *from++;
   case 3:      *to = *from++;
   case 2:      *to = *from++;
   case 1:      *to = *from++;

              } while(--n>0);
  } 

Таким образом, теоретически язык программирования может иметь аналогичную семантику для областей действия в целом, что позволяет использовать такие приемы для оптимизации при необходимости, но читаемость будет очень низкой.

Оператор goto вместе с break и continue в некоторых языках также позволяет структурировать программы, ведущие себя как перекрывающиеся области действия:

BOLD: while (bold)
 { styles.add(bold)
   print "BOLD"

   while(italic) 
    { styles.add(italic)
      print "BOTH";
      break BOLD;
    }
 }

italic-continued: 
    styles.remove(bold)
    print "ITALIC"
...