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

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

Жанры

О чём не пишут в книгах по 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]);

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

Изгой. Трилогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
8.45
рейтинг книги
Изгой. Трилогия

Старатель 2

Лей Влад
2. Старатели
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Старатель 2

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Кодекс Охотника. Книга IX

Винокуров Юрий
9. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга IX

Школа Семи Камней

Жгулёв Пётр Николаевич
10. Real-Rpg
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Школа Семи Камней

Тайны ордена

Каменистый Артем
6. Девятый
Фантастика:
боевая фантастика
попаданцы
7.48
рейтинг книги
Тайны ордена

Убивать чтобы жить 9

Бор Жорж
9. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 9

Мимик нового Мира 11

Северный Лис
10. Мимик!
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 11

Пришествие бога смерти. Том 5

Дорничев Дмитрий
5. Ленивое божество
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Пришествие бога смерти. Том 5

Аномальный наследник. Том 3

Тарс Элиан
2. Аномальный наследник
Фантастика:
фэнтези
7.74
рейтинг книги
Аномальный наследник. Том 3

Опер. Девочка на спор

Бигси Анна
5. Опасная работа
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Опер. Девочка на спор

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Приручитель женщин-монстров. Том 8

Дорничев Дмитрий
8. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 8

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник