Вероятно, нет никакого языка программирования, который поддерживает перекрывающиеся области в своем формальном определении. Хотя это технически возможно, это сделает реализацию более сложной, чем необходимо. Это также сделало бы язык двусмысленным, так как он признал бы действительным то, что, скорее всего, было бы ошибкой.
Единственное практическое использование, о котором я могу подумать сейчас, - это то, что он менее типизирован и написан более интуитивно, так же, как при написании атрибутов в разметке он кажется более интуитивным без лишних кавычек, как в <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"