Парсер 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 — указывает общую длину разбираемого текста.Парсер удобно использовать, если вы пишете скриптовый язык, либо просто парсер командной строки.
Скачать парсер и пример
Посмотреть исходный код