45
Признак нормального окончания работы алгоритма: когда в стеке
остался единственный символ Z, а текущим символом является ‘#’- символ
конца входной последовательности, то мы считаем, что процедура
синтаксического анализа завершена успешно. В противном случае (если в
стеке есть другие символы) фраза построена неверно.
Основной недостаток синтаксически-управляемого перевода (как,
впрочем, и всех механизмов, основанных на применении грамматик в явном
виде) заключается в том, что фактически мы имеем дело с полным перебором
всех возможных вариантов применений правил грамматики. Избежать этого
перебора позволяют лишь введенные весьма искусственные соглашения
относительно условий применимости тех или иных правил в различных
ситуациях (см. те же правила (1), (2), (3) и (4)). Более того, поиск как таковой
и в схеме СУ-перевода, и в МП-автоматах, о которых мы будем говорить
ниже, категорически недопустим. Вот если бы мы работали с Прологом, то
тогда нам не пришлось бы вводить эти правила-ограничители поиска –
внутренний механизм Пролога сам перебрал бы все возможные варианты
применения правил. Здесь же нам нужно "стопроцентное" попадание в
нужное правило.
Вернемся вновь к вопросу об унарных операторах. Считается, что
унарные операторы имеют наивысший приоритет. Исходя из этого,
соответствующий правила грамматики должны записываться в конце списка.
Тогда мы получим примерно следующее:
…
T-F
T!F
…
Т.е. действие унарного оператора (‘-’ или ‘!’) будет направлено на F
(F(E), Fa). Если же поместить унарный оператор в правило
E-T (или E!T),
то оператор будет действовать уже на терм, а это означает, что в выражении
"!a*b" сначала будет вычислено произведение a*b, а затем только будет взято
его отрицание.
АВТОМАТЫ С МАГАЗИННОЙ ПАМЯТЬЮ
Мы уже говорили о том, что теория конечных автоматов пригодна
только для регулярных грамматик. Для контекстно-свободной грамматики
вида
G = { {a , +, * , /, - , . , ) , ( } , {E, T, F,}P, E }