Примеры практических контекстно-зависимых структур программирования

Итак, я реализую контекстно-зависимый синтаксический анализатор. Это своего рода экспериментальная вещь, и одна из вещей, которые мне нужны, это удобные и практичные синтаксические конструкции для тестирования.

Например, следующий пример невозможно проанализировать с использованием стандартной CFG (контекстно-свободной грамматики). В основном это позволяет объявлять несколько переменных не связанных типов данных и одновременно инициализировать их.

int bool string number flag str = 1 true "Hello";

Если я опущу несколько деталей, это можно формально описать так:

L = {anbncn | n >= 1}

Итак, я был бы признателен за столько подобных примеров, сколько вы можете себе представить, однако, они действительно должны быть практичными. Что-то, что оценят настоящие программисты.

1 ответ

Почти все двоичные форматы имеют некоторую чувствительность к контексту, один из простейших примеров - количество элементов, за которым следует неограниченный массив этой длины. (Технически это может быть проанализировано CFG, если возможные длины массива являются конечным набором, но только с миллиардами и миллиардами правил производства.) Pascal и другие языки традиционно представляют строки таким образом. Другой контекстно-зависимой грамматикой, которую часто используют программисты, является двумерная разметка исходного кода, которая прямо сейчас переводится в промежуточный CFG во время предварительной обработки. Ссылки на другую часть документа, например поиск метки. Тьюринг-полные макроязыки. Не уверен, какой именно язык должен распознавать ваш парсер.