Действительно ли грамматика D контекстно-свободна?

Я разместил это в группе новостей D несколько месяцев назад, но по какой-то причине ответ меня так и не убедил, поэтому я подумал, что спрошу здесь.


Грамматика D очевидно, контекстно-свободный .

Однако грамматика C ++ не является (даже без макросов). ( Пожалуйста, прочтите внимательно! )

Разрешено, Я ничего не знаю (официально) о компиляторах, лексерах и синтаксических анализаторах. Все, что я знаю, это то, что я узнал в сети.
И вот что (я полагаю) я понял относительно контекста, на не совсем техническом жаргоне:

Грамматика языка - это контекст. бесплатно тогда и только тогда, когда вы всегда можете понять смысл (хотя и не обязательно точное поведение) данной части ее кода без необходимости «искать» где-либо еще.

Или даже в ] less строгость:

Грамматика не может быть контекстно-свободной, если мне нужно, я не могу определить тип выражения, просто взглянув на него.

Так, например, C ++ не справляется с контекстно-независимой тест, потому что значение из сбивает с толку :: q (2) , зависит от значения из q .

Пока все хорошо.

Теперь мой вопрос: можно ли то же самое сказать о D?

В D хэш-таблицы могут быть созданы с помощью Value [Key] объявление, например

int[string] peoplesAges;   // Maps names to ages

Статические массивы могут быть определены в аналогичном синтаксисе:

int[3] ages;   // Array of 3 elements

И шаблоны могут быть использованы ред., чтобы запутать их:

template Test1(T...)
{
    alias int[T[0]] Test;
}

template Test2(U...)
{
    alias int[U] Test2;  // LGTM
}

Test1!(5) foo;
Test1!(int) bar;
Test2!(int) baz;  // Guess what? It's invalid code.

Это означает, что я не могу определить значение T [0] или U , просто взглянув на него (т.е. это может быть число, это может быть тип данных или это может быть кортеж Бог знает что). Я даже не могу сказать, является ли выражение грамматически правильным (поскольку int [U] определенно нет - у вас не может быть хеш-таблицы с кортежами в качестве ключей или значений).

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

Учитывая это, действительно ли D контекстно-независимый, или я неправильно понимаю концепцию?

Почему / почему нет?


Обновление:

Я просто подумал, что прокомментирую: действительно интересно увидеть ответы, так как:

  • В некоторых ответах утверждается, что C ++ и D не могут быть контекстно-свободным
  • В некоторых ответах утверждается, что C ++ и D оба контекстно-свободные
  • Некоторые ответы подтверждают утверждение, что C ++ контекстно-зависимый, а D - нет
  • Нет еще утверждалось, что C ++ контекстно-f ree, в то время как D является контекстно-зависимым: -)

Я не могу сказать, учусь я или больше запутываюсь, но в любом случае я отчасти рад, что спросил об этом ... спасибо, что нашли время, чтобы ответьте всем!

59
задан Mehrdad 8 August 2011 в 15:53
поделиться