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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

Пример калькулятора с лексическим анализатором также находится на компакт-диске и называется LexicalSample.

Лексический анализатор на входе получает строку, на выходе он должен дать список структур, каждая из которых описывает одну лексему. В нашем примере эти структуры выглядят следующим образом (листинг 4.11).

Листинг 4.11. Тип TLexemeдля хранения информации об одной лексеме

TLexemeType = (

ltEqual, ltLess, ltGreater, ltLessOrEqual,

ltGreaterOrEqual, ltNotEqual, ltPlus, ltMinus,

ltOr, ltXor, ltAsterisk, ltSlash, ltDiv, ltMod,

ltAnd, ltNot, ltCap,

ltLeftBracket, ltRightBracket,

ltSin, ltCos, ltLn,

ltIdentifier, ltNumber, ltEnd);

TLexeme = record

LexemeType: TLexemeType;

Pos: Integer;

Lexeme: string;

end;

LexemeType— поле, содержащее информацию о том, что это за лексема. Тип TLexemeType— это специально определенный перечислимый тип, каждое из значений которого соответствует одному из возможных типов лексемы. Поле Posхранит номер позиции в строке, начиная с которой идет данная лексема. Это поле нужно только для того, чтобы синтаксический анализатор мог точно указать место ошибки, если встретит недопустимую лексему.

Поле Lexemeхранит саму подстроку, распознанную как лексема. Оно используется, только если тип лексемы равен ltIdentifierили ltNumber. Для остальных типов лексем достаточно информации из поля LexemeType.

Лексический анализатор реализован в виде класса TLexicalAnalyzer. В конструкторе класса выполняется разбор строки и формирование списка лексем. Через этот же класс синтаксический анализатор получает доступ к лексемам: свойство Lexemeвозвращает текущую лексему, метод Nextпозволяет перейти к следующей. Так как наша грамматика предусматривает разбор слева направо, таких примитивных возможностей навигации синтаксическому анализатору вполне хватает. Код анализатора показан в листинге 4.12.

Листинг 4.12. Код лексического анализатора

type

TLexicalAnalyzer = class

private

FLexemeList: TList;

// Номер текущей лексемы в списке

FIndex: Integer;

function GetLexeme: PLexeme;

// Пропуск всего, что является разделителем лексем

procedure SkipWhiteSpace(const S: string; var P: Integer);

// Выделение лексемы, начинающейся с позиции P

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

// Помещение лексемы в список

procedure PutLexeme(LexemeType: TLexemeType; Pos: Integer; const Lexeme: string);

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

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

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

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

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

public

constructor Create(const Expr: string);

destructor Destroy; override;

// Переход к следующей лексеме

procedure Next;

// Указатель на текущую лексему

property Lexeme: PLexeme read GetLexeme;

end;

constructor TLexicalAnalyzer.Create(const Expr: string);

var

P: Integer;

begin

inherited Create;

// Создаем список лексем

FLexemeList := TList.Create;

// И сразу же заполняем его

Р := 1;

while Р <= Length(Expr) do

begin

SkipWhiteSpace(Expr, P);

ExtractLexeme(Expr, P);

end;

// Помещаем в конец списка специальную лексему

PutLexeme(ltEnd, Р, '');

FIndex := 0;

end;

destructor TLexicalAnalyzer.Destroy;

var

I: Integer;

begin

for I := 0 to FLexemeList.Count - 1 do

Dispose(PLexeme(FLexemeList[I]));

FLexemeList.Free;

inherited Destroy;

end;

// Получение указателя на текущую лексему

function TLexicalAnalyzer.GetLexeme: PLexeme;

begin

Result := FLexemeList[FIndex];

end;

// Переход к следующей лексеме

procedure TLexicalAnalyzer.Next;

begin

if FIndex < FLexemeList.Count - 1 then Inc(FIndex);

end;

// Помещение лексемы в список. Параметры метода задают

// одноименные поля типа TLexeme.

procedure TLexicalAnalyzer.PutLexeme(LexemeType: TLexemeType; Pos: Integer; const Lexeme: string);

var

NewLexeme: PLexeme;

begin

New(NewLexeme);

NewLexeme^.LexemeType := LexemeType;

NewLexeme^.Pos := Pos;

NewLexeme^.Lexeme := Lexeme;

FLexemeList.Add(NewLexeme);

end;

// пропускает пробелы, символы табуляции, комментарии и переводы строки,

// которые могут находиться в начале и в конце строки и между лексемами

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

begin

while (P <= Length(S)) and (S[P] in [' ', #9, #13, #10, '{']) do

if S[P] = '{' then

begin

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

Интервал:

Закладка:

Сделать

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

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


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

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

x