А. Григорьев - О чём не пишут в книгах по Delphi

Здесь есть возможность читать онлайн «А. Григорьев - О чём не пишут в книгах по Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: СПб, Год выпуска: 2008, ISBN: 2008, Издательство: БХВ-Петербург, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

О чём не пишут в книгах по Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «О чём не пишут в книгах по Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Рассмотрены малоосвещённые вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные механизмы их работы, особенности для протоколов TCP и UDP и др. Большое внимание уделено разбору ситуаций возникновения ошибок и получения неверных результатов в "простом и правильном" коде. Отдельно рассмотрены особенности работы с целыми, вещественными и строковыми типами данных, а также приведены примеры неверных результатов, связанных с ошибками компилятора, VCL и др. Для каждой из таких ситуаций предложены методы решения проблемы. Подробно рассмотрен синтаксический анализ в Delphi на примере арифметических выражений. Многочисленные примеры составлены с учётом различных версий: от Delphi 3 до Delphi 2007. Прилагаемый компакт-диск содержит примеры из книги.
Для программистов

О чём не пишут в книгах по Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «О чём не пишут в книгах по Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Inc(P);

while (P <-=Length(S)) and (S[P) <> '}') do Inc(P);

if P > Length(S) then

raise ESyntaxError.Create('Незавершенный комментарий');

Inc(P);

end

else Inc(P);

end;

// Функция выделяет одну лексему и помещает ее в список

procedure TLexicalAnalyzer.ExtractLexeme(const S: string; var P: Integer);

begin

if P > Length(S) then Exit;

case S[P] of

'(': begin

PutLexeme(ltLeftBracket, P, '');

Inc(P);

end;

')': begin

PutLexeme(ltRightBracket, P, '');

Inc(P);

end;

'*': begin

PutLexeme(ltAsterisk, P, '');

Inc(P);

end;

'+': begin

PutLexeme(ltPlus, P, '');

Inc(P);

end;

'-': begin

PutLexeme(ltMinus, P, '');

Inc(P);

end;

'/': begin

PutLexeme(ltSlash, P, '');

Inc(P);

end;

'0'..'9': Number(S, P);

'<':if (P < Length(S)) and (S[P + 1] = '=') then

begin

PutLexeme(ltLessOrEqual, P, '');

Inc(P, 2);

end

else

if (P < Length(S)) and (S[P + 1] = '>') then

begin

PutLexeme(ltNotEqual, P, '');

Inc(P, 2);

end

else

begin

PutLexeme(ltLess, P, '');

Inc(P);

end;

'=': begin

PutLexeme(ltEqual, P, '');

Inc(P);

end;

'>': if (P < Length(S)) and (S[P + 1] = '=') then

begin

PutLexeme(ltGreaterOrEqual, P, '');

Inc(P, 2);

end

else

begin

PutLexeme(ltGreater, P, '');

Inc(P);

end;

'A'..'Z, 'a'..'z', '_': Word(S, P);

'^': begin

PutLexeme(ltCap, P, '');

Inc(P);

end;

else

raise ESyntaxError.Create('Некорректный символ в позиции ' +

IntToStr(Р));

end;

end;

// Выделение лексемы-числа

procedure TLexicalAnalyzer.Number(const S: string; var P: Integer);

var

InitPos, RollbackPos: Integer;

function IsDigit(Ch: Char): Boolean;

begin

Result := Ch in ['0'..'9'];

end;

begin

InitPos := P;

// Выделяем целую часть числа

repeat

Inc(P);

until (P < Length(S)) or not IsDigit(S[P]);

// Проверяем наличие дробной части и выделяем её

if (Р <= Length(S)) and (S[P] = DecimalSeparator) then

begin

Inc(P);

if (Р > Length(S)) or not IsDigit(S[P]) then Dec(P)

else repeat

Inc(P);

until (P > Length(S)) or not IsDigit(S(P));

end;

// Выделяем экспоненту

if (P <= Length(S)) and (UpCase(S[P]) = 'E') then

begin

// Если мы дошли до этого места, значит, от начала строки

// и до сих пор набор символов представляет собой

// синтаксически правильное число без экспоненты.

// Прежде чем начать выделение экспоненты, запоминаем

// текущую позицию, чтобы иметь возможность вернуться к ней

// если экспоненту выделить не удастся.

RollBackPos := P;

Inc(Р);

if Р > Length(S) then P := RollBackPos

else

begin

if S[P] in ['+', '-'] then Inc(P);

if (P > Length(S)) or not IsDigit(S(P)) then P := RollbackPos

else repeat

Inc(P);

until (P > Length(S)) or not IsDigit(S[P]);

end;

end;

PutLexeme(ltNumber, InitPos, Copy(S, InitPos, P- InitPos));

end;

// Выделение слова из строки и проверка его на совпадение

// с зарезервированными словами языка

procedure TLexicalAnalyzer.Word(const S: string; var P: Integer);

var

InitPos: Integer;

ID: string;

begin

InitPos := P;

Inc(P);

while (P <= Length(S)) and

(S[P] in ['0'..'9', 'A'..'Z', 'a'..'z', '_']) do

Inc(P);

ID := Copy(S, InitPos, P - InitPos);

if AnsiCompareText(ID, 'or') = 0 then

PutLexeme(ltOr, InitPos, '')

else if AnsiCompareText(ID, 'xor') = 0 than

PutLexeme(ltXor, InitPos, '')

else if AnsiCompareText(ID, 'div') = 0 then

PutLexeme(ltDiv, InitPos, '')

else if AnsiCompareText(ID, 'mod') = 0 then

PutLexeme(ltMod, InitPos, '')

else if AnsiCompareText(ID, 'and') = 0 then

PutLexeme(ltAnd, InitPos, '')

else if AnsiCompareText(ID, 'not') = 0 then

PutLexeme(ltNot, InitPos, '')

else if AnsiCompareText(ID, 'sin') = 0 then

PutLexeme(ltSin, InitPos, '')

else if AnsiCompareText(ID, 'cos') = 0 then

PutLexeme(ltCos, InitPos, '')

else if AnsiCompareText(ID, 'ln') = 0 then

PutLexeme(ltLn, InitPos, '')

else PutLexeme(ltIdentifier, InitPos, ID);

end;

В конец списка лексем помещается специальная лексема типа ltEnd. В предыдущих примерах приходилось постоянно сравнивать указатель позиции Pс длиной строки S, чтобы не допустить выход за пределы диапазона. Если бы не было лексемы ltEnd, точно так же пришлось бы проверять, не вышел ли указатель за пределы списка. Но лексема ltEndне рассматривается как допустимая ни одной из функций синтаксического анализатора, поэтому, встретив ее, каждая из них возвращает управление вызвавшей ее функции, и заканчивается эта цепочка только на функции Expr. Таким образом, код получается более ясным и компактным.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «О чём не пишут в книгах по Delphi»

Представляем Вашему вниманию похожие книги на «О чём не пишут в книгах по Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «О чём не пишут в книгах по Delphi»

Обсуждение, отзывы о книге «О чём не пишут в книгах по Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x