Активная цепочка может рассматриваться как программа управления работой МП-преобразователя. Прежде чем посмотреть, как это происходит, обратимся к методике построения МП-преобразователя по транслирующей грамматике. Затем получим, преобразователь для Т-грамматики условного оператора и проследим работу преобразователя.
Рассматриваемая входная грамматика условных операторов (см. табл. 5.2.1) относится к классу LL(1)-грамматик. Поэтому вполне естественно вести здесь речь о построении преобразователя, подходящего для такого класса грамматик. Наш МП - преобразователь будет использовать нисходящую стратегию анализа, он будет также детерминированным. Методика построения МП - распознавателя для LL(1)-грамматик была рассмотрена ранее. Повторим здесь полностью все пункты указанной методики с учетом особенностей, которые привносит в нее Т-грамматика.
Прежде всего, сохраним, по возможности, обозначения подпрограмм в управляющей таблице преобразователя:
- 3 (, ) - Замена символа в вершине магазина строкой и запись в выходную строку части перевода, соответствующей цепочке операционных символов.
|
|
- П - перемещение указателя входной строки на одну позицию вправо.
- И() - Исключение символа из вершины магазина и вывод в выходную строку части перевода, соответствующей цепочке операционных символов.
- О - Обнаружение Ошибки в программе и завершение работы.
- В - Выход, нормальное завершение работы.
Если один из аргументов подпрограммы 3 отсутствует, сохраняем разделяющую запятую. При отсутствии единственного аргумента подпрограммы И пишем И(). Теперь дадим пункты методики построения ДМП-преобразователя М = (Q, , Г, , , q0, Z0, F) с одним состоянием по Т-грамматике GT = (VT, VN, , R, S), входная грамматика G = (VT, VN, Р, S) которой обладает свойством LL(1)-грамматик.
1.Q={q};q0= q;F=
2. = VT {#}, # — концевой маркер входной строки.
3. Г= VN {#} {t\ t VT,(A -> t ) Р, V+, V*}
{r\r , (А- > 1B 2 r 3) R, B VN; 1 2, 3 (V )*}, где
t - не головной символ в правой части правила;
r - операционный символ, слева от которого в правой части правила имеется хотя бы один нетерминал;
# — маркер дна магазина.
4. Z0 = S#, S располагается в вершине магазина.
5. Заготовить управляющую таблицу преобразователя со строками Z Г и столбцами а (одну, так как состояние одно).
6.Последовательно проанализировать правила Т-грамматики и заполнить позиции (Z, а) таблицы обозначениями подпрограмм преобразователя:
а) 3(,fg), П —для правила вида Z->fag , где Z VN,a VT, f,g *; {V }* и h1() V, т.е. головной символ строки не должен быть операционным;
б) 3(, f)—для правила вида Z-> f и всех a D S(Z, ), где f *;
= A , Z,A V N; { V }*, ;DS (Z, ) вычисляется по правилам входной грамматики G;
|
|
в) И(f)—для правил вида Z -> f и всех a DS(Z, ), где Z V N ;
f *, а ; DS(Z, ) вычисляется по грамматике G;
г) И(fg),П —для правил вида Z-> fag, где Z VN,а VT;f, g *.
7. Завершение заполнения позиций (Z, д) таблицы обозначениями подпрограмм преобразователя:
а) И(), П — для всех позиций Z = а, где Z,a VT;
б) И — для всех позиций строки Z ;
в) В — для позиции Z = а = #;
г) О — для всех оставшихся пустыми позиций.
Теперь формируются заготовки текстов сообщений об ошибках, и на этом разработка МП-преобразователя завершается.
Задача Построить МП-преобразователь по транслирующей грамматике условных операторов