Как стать автором
Поиск
Написать публикацию
Обновить

Парсер NPParser

Парсер NPParser


Сейчас я пишу программу-интерпретатор. Рабочее название — «SP-NetP» — расшифровываю так: Simple Programming — Net Programming. Хотелось бы придумать какое-нибудь интересное название… Для него написал свой парсер, так как стандартный мне не нравится. И решил выложить его код сюда, в блог: вдруг кому-то понадобится… Осознаю, что у каждого программиста особых проблем с написанием парсера не должно быть, но если писать его не хочется, то берите :).
Реализован как объект «TNPParser».

Для того, чтоб начать работу, надо добавить модуль NPParser в секцию uses и объявить экземпляр объекта, например — var parser:TNPParser;

Далее, для начала работы, надо инициализировать парсер текстом. Для этого есть два метода:
procedure TNPParser.SetFile(s: string);
procedure TNPParser.SetText(s: string);

Из названий следует, что первый — открывает файл и использует содержимое файла для разбора. Второй — использует для разбора текст, который передается в переменной s.

Давайте создадим проект — Application, с одной формой. Кинем на форму TMemo, допустим с именем Memo1.
Добавим в проект NPParser.pas и NPParser в uses модуля unit1.
Напишем в секции public формы parser:TNPParser;
Кинем 2 кнопки, одна — инициализация, другая — переход к следующей лексеме.
И, напоследок, TEdit — для просмотра текущей лексемы — «токена».
Для того, чтоб узнать, какая лексема рассматривается в данный момент используйте метод
function NowStr: string;

Напишем:
procedure TForm1.InitButtonClick(Sender: TObject);
begin
parser.SetText(Memo1.Lines.Text);
edit1.Text:=parser.NowStr;
end;

procedure TForm1.NextButtonClick(Sender: TObject);
begin
parser.Next;
edit1.Text:=parser.NowStr;
end;

Можете запустить. Введите какой-нибудь текст и нажмите инициализацию. Увидите первую лексему в edit1.
Нажимайте кнопку Next для просмотра последующих лексем.

Краткий обзор остальных методов и свойств:

function TNPParser.NextPreview:TNPLexeme; — позволяет, без перехода на следующую лексему, просмотреть ее.

function TNPParser.GetInfo: TNPLexeme; — узнать информацию о текущей лексеме.

function TNPParser.ReadIdent:string; — очень важный метод, позволяет прочитать несколько лексем подряд по правилу идентификаторов (как переменную). Например, «hello_1» прочитает как одну лексему. После вызова этого метода указатель будет стоять на следующей лексеме после идентификатора.

function TNPParser.NowType:TParserExpType; — также важный метод. Возвращает тип лексемы под указателем (текущей). Может принимать такие значения:
petNone, petString, petInt, petFloat, petOther, petSpace, petEOLN, petEOF. В объявлении типа также присутствует petOper, но он не используется здесь, а используется в математическом парсере.


function TNPParser.ReadToEOLN:string; — позволяет прочитать весь текст, пока не встретится конец строки.property ReadSpaces:boolean — свойство, указывающее парсеру, считать ли пробелы лексемами.

property ReadNegativeNumbers:boolean - считывать ли отрицательный числа, или разделять на 2 лексемы — отдельно знак минуса и число.

property ReadEOLN:boolean — аналогично ReadSpaces указывает, считать ли конец строки лексемой.


property NowPosition:cardinal — указывает текущее положение указателя.

property NowLength:cardinal — указывает общую длину разбираемого текста.Парсер удобно использовать, если вы пишете скриптовый язык, либо просто парсер командной строки.

Скачать парсер и пример

Посмотреть исходный код
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.