Чтение онлайн

на главную - закладки

Жанры

Программист-прагматик. Путь от подмастерья к мастеру
Шрифт:
Упражнение 11 из раздела "Обработка текста"

Ответ: Ответ к данному упражнению составлен на языке Perl.

my @consts;

my $name = <>;

die "Invalid format – missing name" unless defined($name);

chomp $name;

# Read in the rest of the file

while (<>) {

chomp;

s/"\s*//; s/\s*$//;

die "Invalid line: $_" unless /"(\w+)$/;

push @consts, $_;

}

# Now generate the file

open(HDR, ">$name.h") or die "Can't open $name.h: $!";

open(SRC, ">$name.c") or die "Can't open $name.c: $!";

my $uc_name = uc($name);

print HDR "/* File generated automatically – do not edit */\n";

print HDR "extern const char *$ {ucjiame)_name[];";

print HDR "typedef enum {\n"; print HDR join",\n", @consts;

print HDR "\n) $uc_name;\n\n";

print SRC "* File generated automatically – do not edit */\n";

print SRC "const char *$ {uc name}_name[] = {\n \"";

print SRC join "\",\n \"", @consts;

print SRC "\"\n};\n";

close(SRC);

close(HDR);

Используя

принцип DRY, мы не будет вырезать и вклеивать этот вновь написанный файл в нашу программу. Вместо этого мы «включим» его – данный плоский файл является главным источником этих констант. Поэтому нам понадобится файл сборки для восстановления заголовка при изменении файла. Следующий фрагмент содержится в системе отладки в исходном дереве (имеется на web-сайте).

etest.c etest.h: etest.inc enumerated.pl

perl enumerated.pl etest.inc

Упражнение 12 из раздела "Обработка текста"

Ответ: Вот ответ, написанный на языке Perl.

my $dir = shift or die "Missing directory" ,

for my Sfile (glob(u$dir/*.pr)) {

open(IP, "$file") or die "Opening $file: $!";

undef $/; # Turn off input record separator -

my Scontent = <IP>; # read whole file as one string.

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 из раздела "Проектирование по контракту"
Поделиться:
Популярные книги

Эволюционер из трущоб. Том 9

Панарин Антон
9. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 9

Бастард Императора. Том 5

Орлов Андрей Юрьевич
5. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 5

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Прометей: Неандерталец

Рави Ивар
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Прометей: Неандерталец

"Никто" так не смотрит

Кистяева Марина
Территория любви
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Никто так не смотрит

Честное пионерское! 2

Федин Андрей Анатольевич
2. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! 2

Шлейф сандала

Лерн Анна
Фантастика:
фэнтези
6.00
рейтинг книги
Шлейф сандала

Измена. Возвращение любви!

Леманн Анастасия
3. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Возвращение любви!

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Тактик

Земляной Андрей Борисович
2. Офицер
Фантастика:
альтернативная история
7.70
рейтинг книги
Тактик

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19