Вход/Регистрация
Программист-прагматик. Путь от подмастерья к мастеру
вернуться

Хант Эндрю

Шрифт:

close(IP);

if (Scontent Гrusestrict/m) {

rename Sfile, "$file.bak" or die "Renaming $file: $!"; open(OP, ">$file") or die "Creating $file: $!";

# Put 'use strict' on first line that

# doesn't start #

Scontent =" sr(V.#)/\nuse strict;\n\n/m',

print OP Scontent; close(OP);

print "Updated $file\n";

)

else {

print "Sfile already strict\n":

)

}

Упражнение 13 из раздела "Генераторы исходных текстов"

Ответ: Решение реализовано на языке Perl. В программе происходит динамическая загрузка модуля для генерации требуемого языка, так что добавление новых языков не представляет труда. Главная программа загружает внутреннюю часть (основанную на параметре командной строки), затем считывает ее входные данные и вызывает подпрограммы генерации текста, основанные на содержимом каждой из строк. Мы особенно не суетимся, если речь идет об обработке ошибок: если что-то не так, узнаем об этом довольно быстро.

my lang = shift or die "Missing language";

$lang .= "_cg.pm";

require <$lang> or die "Couldn't load $lang";

# Read and parse the file

my $name;

while (<>) {

chomp;

if (/^ \s*$/) {CG::blankLine;)

elsif ((/^ \#(.*)/) {CG::comment($1);}

elsif ((/^M\s*(.+)/) {CG::startMsg($1); $name = $1;}

elsif ((/^E/) {CG::endMsg($name);}

elsif (/^F\s*(\w+)\s+(\w+)$/) {CG::simpleType($1,$2);}

elsif (/^F\s*(\w+)\s+(\w+)\[(\d+)\]$/) {CG::arrayType $1,$2,$3);}

else {

die "Invalid line: $ ";

}

}

Написание языковой серверной части не составит труда: создайте модуль, который реализует шесть точек входа. Вот генератор текста на языке С:

#!/usr/bin/perl – w

package CG;

use strict;

# Code generator for 'C' (see cg_base.pl)

sub blankLine {print "\n"; }

sub comment {print "/*$_[0] */\n"; }

sub startMsg {print "typedef struct {\n"; }

sub endMsg {print "} $_[0];\n\n"; }

sub arrayType {

my ($name, $type, $size) = @_;

print " $type $name\[$size];\n":

}

sub simpleType{) {

my ($name, $type) = @_;

print " $type $пате;\п";

}

1;

А вот генератор текста на языке Pascal:

#!/usr/bin/perl – w

package CG;

use strict;

# Code generator for 'Pascal' (see cg_base.pl)

sub blankLine {print "V;)

sub comment {print "{$_[0] }\n";)

sub startMsg {print "$_[0] = packed record\n"; }

sub endMsg {print "end;\n\n"; }

sub arrayType {

my ($name, $type, $size) = @_;

$size--;

print" $name: array[0…$size] of $type;\n";

)

sub simpleType {

my ($name, $type) = @_;

print" $name: $type;\n7 ',

}

1;

Упражнение 14 из раздела "Проектирование по контракту"

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

Упражнение 15 из раздела "Проектирование по контракту"

Ответ: Это неудачно. Математическое действие в индексном выражении (index-1) не будет работать с граничными условиями, подобными первой точке входа. Постусловие предполагает определенную реализацию; контракты должны быть более абстрактными по сравнению с указанным выше.

Упражнение 16 из раздела "Проектирование по контракту"

Ответ 16: Это удачный контракт, но неудачная реализация. Здесь высовывает свою уродливую голову ошибка типа "Heisenbug" [URL52]. Вероятно, программист допустил опечатку – набрал pop вместо top. Хотя это простой и надуманный пример, весьма трудно диагностировать побочные эффекты в утверждениях (или в любом, самом неожиданном месте в программе).

  • Читать дальше
  • 1
  • ...
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: