iifatВидимо это сложно и надо пояснить мысль.
Ну, таки в ДКА переводят отнюдь не скорости для. Для скорости используют компиляцию в ДКА вместо интерпретации.
Алгоритм разбор строки классический НКА является многопроходным, в отличии от ДКА. Поэтому и переводят НКА в ДКА. Отсюда и прирост в скорости.
Пусть есть правило
животное:=
| 'кот'
| 'пёc';
И входная строка которую надо разобрать 'котопёс'.
Суть в том что при разборе строки. У нас есть каретка которая перемещается вдоль строки до тех пор пока автомат не встанет на развилке.
В нашем примере грамматика сразу начинается с развилки.
Алгоритм А)
Если одна ветка правила не срабатывает, то корректора возвращается в исходное состояние и проверяется следующая ветка.
Алгоритм Б)
Порождаются две или более кареток, каждая из которых идёт своим путем по грамматике.
котопёс
^0--------- исходное состояние
котопёс
^1------- сработало
кот
//Возвращаем каретку проверяем вторую ветку.
котопёс
^2--------- не сработало
пёс
//далее смещается исходное состояние
котопёс
^0--------- исходное состояние
//и далее алгоритм идёт по кругу
Отличия ДКА от НКА в том что все возможные состояния(положения кареток) автомата НКА перечисляются в программе-автомата ДКА. При этом состояния, которые относятся к одной позиции в строке и к одной общей букве объединяются в одно общее состояние автомата. Теперь каретке не нужно бегать взад и вперёд по строке, достаточно идти от элемента к элементу.
котопёс
^----------- s1 - работа
котопёс
^----------- s2 - работа
котопёс
^----------- s4 - вывод от -3 позиции
котопёс
^----------- s5 - работа
..
котопёс
^----------- s100 - работа
котопёс
^----------- s101 - вывод от -3 позиции
Странная фраза. Язык с обязательным описанием переменных не может задаваться КС-грамматикой.
А где говорилось о задании? Задание подразумевает полное описание языка. Здесь речь шла только о формальное описание языка. Разумеется в нормальном языке программирования помимо этого присутствует семантическая часть. Если хотите детально это обсудить давайте заведём отдельную тему.