Является ли синтаксическая грамматика Rust контекстно-зависимой или контекстно-зависимой?

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

let x = ((((()))));

Но синтаксическая грамматика Руста по крайней мере не зависит от контекста? Если нет, то какой элемент делает грамматику контекстно-зависимой? Или грамматика даже рекурсивно перечислима, как синтаксическая грамматика C++?


Связанный: Является ли лексическая грамматика Rust регулярной, контекстной или контекстно-зависимой?

1 ответ

Решение

Rust включает в себя макропроцессор, работа которого зависит от контекста.

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

Но я склонен сказать, что это просто означает, что язык Rust рекурсивно перечислим.

Существует ряд ограничений на допустимость определений макросов, которые, вероятно, делают язык (по крайней мере) контекстно-зависимым, даже если вы соглашаетесь не выполнять расширения макросов как часть синтаксического анализа.

Это не означает, что не зависящая от контекста грамматика не может быть полезна как часть синтаксического анализа Rust. Это, вероятно, важно, и даже может быть полезно использовать генератор синтаксического анализатора, такой как bison или Antlr (и существуют примеры того и другого). Как и большинство языков программирования, существует простой расширенный набор Rust, который не зависит от контекста и который может быть с пользой проанализирован с помощью контекстно-свободных грамматических инструментов; однако, в конце концов, есть тексты, которые нужно будет отклонить во время компиляции как недействительные, даже если они являются частью расширенного набора CF.

Ответ прямо из исходного кода Rust:

Лексическая грамматика Rust не зависит от контекста. Источником проблемы являются необработанные строковые литералы. Неформально необработанный строковый литерал представляет собой r, за которым следует N хешей (где N может быть нулем), цитата, любые символы, затем кавычка, за которой следует N хешей. Важно отметить, что, оказавшись внутри первой пары кавычек, за другой цитатой не может следовать N последовательных хешей. например, r###""###"### недопустимо.

Другие вопросы по тегам