0

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

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

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

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

L = {anbncn | n >= 1}

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

+0

Я думаю, что ваш пример уже не практичен. Требуется довольно много усилий, чтобы визуально «разобрать» эту строку, и я не знаю, почему «int bool string number flag str = 1 true« Hello »;' будет более удобным, чем более классический порядок, такой как 'int number 1, bool flag true, строка str "hello" '. – GolezTrol

+1

Как просто нужно объявить переменную перед использованием этой переменной? Это поражает меня как канонический пример общей черты языков программирования, которая не является свободной от контекста. – Patrick87

+0

@GolezTrol вы, вероятно, правы, что описанный вами синтаксис более читабельен, хотя, с другой стороны, это абсолютно бесполезная информация. Это не похоже на то, что я просто остановлюсь на имплантации ... Какой-то реальный контекстно-зависимый пример будет намного лучше. Или вы считаете, что контекстно-зависимые парсеры неэффективны? –

ответ

2

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

Смежные вопросы