Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 205

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 199 200 201 202 203 204 < 205 > 206 207 208 209 210 211 .. 316 >> Следующая

оследний недостаток неустраним ни в каком язке, если проверки и действия трактовать как процедуры, которые работают в общем контексте,
584
ГЛАВА 10. МЕТОДЫ ПРОГРАММИРОВАНИЯ ОТ СОСТОЯНИЙ
задаваемом в заголовке таблиц . Так что, быть мо ет луче сразу отказаться от описания этого контекста в рамках таблицы (задание инициализации в ней возможно). Что касается первого недостатка, то он носит почти чисто синтаксический характер, и, если бы мо но было задавать тела процедур как значения полей структур, то наглядность представления мо но бло бы сохранить. В стиле, похо ем на язык C/C++/C#, это выглядело бы как следу -щее присваивание значения Table в качестве инициализации:
Программа 10.2.6 Table[]= {
{{return true;}, /* инициализация */, 1},
/*St1*/ {{return 'a'<=symbol &&
symbol <= 'z';}, {printf ("%c", symbol); cnt = 1;}, 4},
{{return symbol != '\n';}* Так как нужно печатать
только слова, действия не заполняются */,
1},
{{return true}, /* Переход не требует
чтения, symbol == '\n' не нужно читать */, 0},
/*St2*/ {{return 'a'<=symbol &&
symbol <= 'z';}, {printf ("%c", symbol); cnt++;}, 4}, {{return symbol!='\n';}, {printf ("- %i\n",cnt);},
1},
{{return true}, {printf ("- %i\n",cnt);}, 0}
};
Несколько нагляднее и ближе к табличному заданию то же самое может быть записано на Алголе 68 (фактически представлен не точный перевод на этот язык, а некий гибрид его с C/C++, к тому е избавленнй от ряда специфич-нх деталей):
Программа 10.2.7
10.2.
585
[0: ] структ ( имя проц Condition = ()лог, имя проц Action = ()ничто, цел iRef
)= (
((истина), co инициализация co), 1), ( co St1: co
('a'<=symbol и symbol<='z';), (ne4aTaTb(symbol); cnt = 1;),
4),
((symbol <> '\n';), co пустые действия co), 1), ((истина), (co пустые действия co), 0), ( co St2: co
('a'<=symbol и symbol<='z';), (ne4aTaTb(symbol); cnt+= 1;),
4),
(symbol <> '\n';), (ne4aTaTb(symbol+'- \n',cnt), 1), ((истина), (ne4aTaTb(symbol+'- \n',cnt), 0)
);
Символ co перекл чает меду реимами комментария и основного текста. Эта запись таблицы более наглядна за счет того, что:
• есть возможность описывать процедурный тип (вид, по терминологии Алголa 68);
• есть возмо ность литерального изобра ения процедурных значений;
• проще выглядит так называемое "3aMKHyToe предложение, Bb>ipa6aTb>i-BaKDinee значение".
Но и для С/С++/С#, и для Алгс^ 68, как и для других языков, не ориентированных на работу с таблицами, говорить о естественности представления не приходится. Так что, в таких ситуациях, по-видимому, наиболее разумно строить автоматический преобразователь (типа препроцессора, но не путать этот термин с С!), который составляет текст программы по таблице. В этом случае снимается много проблем:
a) для программиста сохраняется наглядность;
b) при исполнении достигается алгоритмичность;
c) легко разносить фрагменты таблицы по разным участкам программы;
586
ГЛАВА 10. МЕТОДЫ ПРОГРАММИРОВАНИЯ ОТ СОСТОЯНИЙ
d) можно жертвовать наглядностью результирующего текста, поскольку фактически с ним никто, кроме транслятора не работает (пример: вставка новых строк в таблицу — проблема для человека, но не для препроцессора);
e) по той же причине можно жертвовать даже структурностью результирую-щего текста (в рассматриваемом примере, в частности, можно отказаться от представления условий и действий процедурами и функциями).
Это решение часто является приемлемым, но недостатков оно не лишено. Прежде всего, становится трудным делом поиск ошибок, допущенных в текстах условий и действий, возникает проблема двойной интерпретации (когда приходится понимать как исходное представление, так и внутренне). Так что ручной перевод остается ваным методом преобразования таблиц.
Проанализировав исходную таблицу, легко заметить, что фактически используется всего два варианта функций-условий и три — функций-действий.
з-за нестандартности работ с инициализацией (нулевая строка таблицы) удобно пополнить этот набор еще двумя функциями: "условием" и "действием", выполняемыми при переходе к этой строке, которая интерпретируется как завершение работы автомата (таким образом, предикат OUTSIDE (iSt) можно представить как равенство аргумента нулю).
Теперь почти все готово для составления программы 10.2.8, реализую -
ей интерпретатор диаграммы переходов. сталось реить вопрос о неявном для таблицы, но с необходимость явном для программы чтении потока символов. Этот вопрос имеет три аспекта:
• Когда читать? Поскольку, прочитанный символ используется после его распознавания (например, он мо ет выводиться на экране), естественно "не терять" его, пока выполняется действие. Следовательно, читать очередной символ целесообразно после отработки действия.
• Как поступать в начале процесса: должен ли быть прочитан символ перед первым вызовом функции handler? Понятно, что чтение символов является часть функциональности этой функции, и, если в ней реализовать чтение до вызовов условия и действия, то это противоречит пред -дуему соглаени , а противополо ное реение делает нестандартным начало процесса. В предлагаемой программе принято решение об особой обработке нулевой строки. Поскольку, являясь инициализацией, она действительно особая, это соответствует сделанному соглае-нию.
Предыдущая << 1 .. 199 200 201 202 203 204 < 205 > 206 207 208 209 210 211 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100