Подтвердить что ты не робот

Почему С++ 11 поддерживает 6 различных грамматик регулярных выражений?

Похоже, что С++ 11 поддерживает колоссальные шесть различных грамматик регулярных выражений:

  • Регулярные выражения ECMA-262 (ECMAScript) (слегка измененные?)
  • Основные регулярные выражения POSIX
  • Расширенные регулярные выражения POSIX
  • регулярные выражения awk
  • регулярные выражения grep
  • регулярные выражения egrep

Почему было решено включить так много вариантов вместо того, чтобы поселиться в одной грамматике? Почему эти конкретные 6?

4b9b3361

Ответ 1

Процесс стандартизации - это все о прагматизме. Есть льготы, включая грамматику RE в стандарте, если она правильно указана, но нет никакой выгоды для ее удаления.

Исключение облегчило бы разработчику библиотеки применить значок "100% С++ 11-совместимый", но кто действительно заботится? В любом случае никто не должен делать это требование, и только невежественные PHB будут искать его. В библиотеках всегда есть ошибки, которые препятствуют достижению 100%, а хорошая библиотека имеет избыток функций.

Обратите внимание, что все включенные грамматики указаны уже существующими международными стандартами. Настолько мало усилий требуется для комитета С++. Просто §28.13, который длится пару страниц.

Если они не учитывают стандартизованную грамматику, тогда различные разработчики Стандартной библиотеки добавят ее под разными именами, что приведет к несовместимости. Это вряд ли произойдет для грамматики, которая просто определяется популярной библиотекой, где разработчик библиотеки будет отвечать за интерфейс С++, а не от поставщиков стандартной библиотеки.

Ответ 2

Это охватывается предложением TR1. Я попытаюсь обобщить.

Понятно, что разумно основываться на существующем стандарте, а не на забастовку самостоятельно.

Были определены два существующих стандарта, которые они могли бы использовать: POSIX REs и ECMAScript REs. Perl RE были исключены из-за стандартизации стандартов. (С какими разумными людьми могут не согласиться.) Кроме того, ECMAScript RE были рассмотрены как более простое подмножество REL Perl, которое охватывает наиболее полезные (или, возможно, наиболее используемые) функции.

Из двух, POSIX REs "самая левая самая длинная" реализация не очень хорошо играла с важными функциями, такими как нежелательные повторы, и не соглашалась с тем, как работают большинство двигателей RE в наши дни.

С другой стороны, ECMAScript REs не имела поддержки локализации POSIX REs. Таким образом, они расширили REMS ECMAScript, включив поддержку локализации POSIX-RE.

Поддержка POSIX RE была включена как необязательная, поскольку ее поведение отличается от ECMAScript REs, чтобы оправдать его как стандартную опцию. Стандарт POSIX поставляется с двумя грамматиками: базовым и расширенным. REK awk, grep и egrep - это всего лишь тривиальные вариации базовых или расширенных грамматик POSIX, а не действительно отдельных грамматик.

Итак: два стандарта, три грамматики, шесть вариантов.

Ответ 3

Я думаю, что bacause С++ - это многоплатформенный язык. Он выпускал программы по различным программам. И большинство пользователей ожидают, что программа будет следовать соглашениям, например, ОС.

Для решения этих задач существуют два решения:

  • Создайте API для любого из этих
  • Включите все популярные стандарты на языке

Второй из них более изящный, потому что, если вы меняете интерфейс одного API, возникают проблемы совместимости.

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