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

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

Жанры

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

Григорьев Антон Борисович

Шрифт:

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;

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

 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]);

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

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Барон Дубов

Карелин Сергей Витальевич
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

Решала

Иванов Дмитрий
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала

Камень. Книга пятая

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

Отдельный танковый

Берг Александр Анатольевич
1. Антиблицкриг
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Отдельный танковый

Метатель. Книга 3

Тарасов Ник
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 3

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия