Вы просили пример кода использования TParser. Хорошо, вот несколько процедур
для модуля Parser для создания документации Delphi-компонент напрямую из
исходного кода.
TDelphiUnitParser - подкласс со специфическими методами, позволяющими
парсировать секцию Interface модуля Delphi. Вы можете не использовать этого
наследника TParser в вашем коде - это просто иллюстрация того, как можно
использовать некоторые свойства и методы TParser. Присылайте мне другие ваши
решения по этому вопросу.
{ TDelphiUnitParser }function TDelphiUnitParser.CheckSectionBreak: Boolean;
beginwith Parser dobegin
Result := (Token = toSymbol) and
(Compare('Var') or
Compare('Const') or
Compare('Type') or
Compare('Implementation') or
Compare('Procedure') or
Compare('Function'));
end;
end;
procedure TDelphiUnitParser.ParseParameterList;
beginwith Parser dobegin{ пропускаем '(' }
NextToken;
while Token <> ')' do
NextToken;
NextToken;
end;
end;
procedure TDelphiUnitParser.ParseRecord;
beginwith Parser dobegin{ пропускаем 'record' }
NextToken;
while (Token <> toSymbol) ornot Compare('End') dobeginif Token = 'Record' then
ParseRecord
else
NextToken;
end;
end;
end;
procedure TDelphiUnitParser.ParseDeclaration;
beginwith Parser dobeginwhile Token <> ';' dobeginif Token = '(' then
ParseParameterList
elseif (Token = toSymbol) and Compare('Record') then
ParseRecord
else
NextToken;
end;
end;
end;
procedure TDelphiUnitParser.ParseConst;
var
AString: string;
AStart: PChar;
EndOfConsts: Boolean;
beginwith Parser dobegin
NextToken;
repeatif Token <> toSymbol then
ErrorStr('Неопознанный идентификатор');
AString := TokenString;
AStart := FSourcePtr;
NextToken;
ifnot (Token in ['=', ':']) then
ErrorStr('''='' or '':''
ожидалось' ) ;
ParseDeclaration;
FindToken(';');
until CheckSectionBreak;
end;
end;
Класс TParser, используемый для парсинга единиц Delphi и создания документации. Подкласс TDelphiUnitParser имеет специфические методы для парсинга разделов интерфейса в единицах Delphi.
Предоставленные процедуры:
CheckSectionBreak: Функция проверяет, является ли текущий токен разделом (например, Var, Const, Type и т.д.). Возвращает True, если это так, и False в противном случае.
ParseParameterList: Процедура пропускает открывающую скобку списка параметров и затем читает до тех пор, пока не найдет закрывающую скобку.
ParseRecord: Процедура пропускает ключевое слово record и затем читает до тех пор, пока не найдет ключевое слово end или другую декларацию записи.
ParseDeclaration: Процедура читает декларации (например, переменная, функция и т.д.) до тех пор, пока не найдет точку с запятой.
ParseConst: Процедура парсит декларации констант в формате идентификатор = значение;.
Шаг за шагом: как эти процедуры работают:
CheckSectionBreak:
Проверяет, является ли текущий токен символом (то есть не ключевым словом).
Если это так, сравнивает его с известными разделами (например, Var, Const, Type и т.д.). Если совпадает, возвращает True.
ParseParameterList:
Пропускает открывающую скобку.
Затем читает до тех пор, пока не найдет закрывающую скобку.
ParseRecord:
Пропускает ключевое слово record.
Затем читает до тех пор, пока не найдет ключевое слово end или другую декларацию записи.
ParseDeclaration:
Читает декларации (например, переменная, функция и т.д.) до тех пор, пока не найдет точку с запятой.
ParseConst:
Читает идентификатор и затем проверяет, является ли он равен = или :. Если нет, выкидывает ошибку.
Затем парсит декларацию используя ParseDeclaration.
Наконец, повторяет это процесс до тех пор, пока не достигнет раздела.
Обратите внимание, что эти процедуры специфичны для единиц Delphi и могут не быть применимы к другим языкам программирования.
Пример использования класса TParser в Delphi для парсинга секции Interface модуля и создания документации компонента напрямую из исходного кода.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.