Я разместил это в группе новостей D несколько месяцев назад, но по какой-то причине ответ меня так и не убедил, поэтому я подумал, что спрошу здесь.
Грамматика D очевидно, контекстно-свободный .
Однако грамматика C ++ не является (даже без макросов). ( Пожалуйста, прочтите внимательно! )
Разрешено, Я ничего не знаю (официально) о компиляторах, лексерах и синтаксических анализаторах. Все, что я знаю, это то, что я узнал в сети.
И вот что (я полагаю) я понял относительно контекста, на не совсем техническом жаргоне:
Грамматика языка - это контекст. бесплатно тогда и только тогда, когда вы всегда можете понять смысл (хотя и не обязательно точное поведение) данной части ее кода без необходимости «искать» где-либо еще.
Или даже в ] less строгость:
Грамматика не может быть контекстно-свободной, если мне нужно, я не могу определить тип выражения, просто взглянув на него.
Так, например, C ++ не справляется с контекстно-независимой тест, потому что значение из сбивает с толку
, зависит от значения из 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
(что делает его контекстно-зависимым).
Я просто подумал, что прокомментирую: действительно интересно увидеть ответы, так как:
Я не могу сказать, учусь я или больше запутываюсь, но в любом случае я отчасти рад, что спросил об этом ... спасибо, что нашли время, чтобы ответьте всем!