Читаем О чём не пишут в книгах по Delphi полностью

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

// одноименные поля типа 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

   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;

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

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT