Примеры практических контекстно-зависимых структур программирования
Итак, я реализую контекстно-зависимый синтаксический анализатор. Это своего рода экспериментальная вещь, и одна из вещей, которые мне нужны, это удобные и практичные синтаксические конструкции для тестирования.
Например, следующий пример невозможно проанализировать с использованием стандартной CFG (контекстно-свободной грамматики). В основном это позволяет объявлять несколько переменных не связанных типов данных и одновременно инициализировать их.
int bool string number flag str = 1 true "Hello";
Если я опущу несколько деталей, это можно формально описать так:
L = {anbncn | n >= 1}
Итак, я был бы признателен за столько подобных примеров, сколько вы можете себе представить, однако, они действительно должны быть практичными. Что-то, что оценят настоящие программисты.
1 ответ
Почти все двоичные форматы имеют некоторую чувствительность к контексту, один из простейших примеров - количество элементов, за которым следует неограниченный массив этой длины. (Технически это может быть проанализировано CFG, если возможные длины массива являются конечным набором, но только с миллиардами и миллиардами правил производства.) Pascal и другие языки традиционно представляют строки таким образом. Другой контекстно-зависимой грамматикой, которую часто используют программисты, является двумерная разметка исходного кода, которая прямо сейчас переводится в промежуточный CFG во время предварительной обработки. Ссылки на другую часть документа, например поиск метки. Тьюринг-полные макроязыки. Не уверен, какой именно язык должен распознавать ваш парсер.