Реферат: Синтаксический разбор строк и конечные автоматы
case State of
ReadValue : Values.Add(GetSubString(Tag, StartPos, i));
ReadAttr : Attrs.Add(GetSubString(Tag, StartPos, i));
ReadTag : TagName := GetSubString(Tag, StartPos, i);
WaitAttr, WaitAttrOrEq: ; // ничегонеделаем
else Result := resBadSyntax; // другиесостояниянедопустимы
end;
end;
Одной из важных особенностей такого подхода к разбору строк является то, что анализ выполняется по мере считывания символов, с использованием информации о текущем символе и символах, прочитанных ранее. Это позволяет вести обработку данных, передающихся по некоторому последовательному каналу, непосредственно в процессе их поступления.
Фактически представленная функция выполняет две операции: выделяет в переданной строке синтаксические элементы (tokens) и определяет, что представляет собой данный элемент (имя тэга, имя атрибута, значение атрибута). Решение о том, чем является следующий элемент, принимается заранее, на основании данных о предыдущем элементе и простых правил: за именем тэга следует имя атрибута; за именем атрибута следует либо имя атрибута, либо символ '='; за символом '=' следует значение атрибута.
Процедуры, основанные на конечных автоматах, широко применяются для проверки синтаксиса. В качестве примера рассмотрим функцию CheckMath, выполняющую синтаксический анализ математического выражения:
function CheckMath(const S : String) : Integer; type TState = (Start, InDigit, AfterDigit, InOp, InLPrnt, InRPrnt); const resLPrntMissing = -1; resRPrntMissing = -2; var State : TState; i, ParCount : Integer; begin Result := 0; ParCount := 0; // счетчикскобок State := Start; for i := 1 to Length(S) do case State of Start: // входноесостояние case S[i] of ' ': ; // состояние не меняется К-во Просмотров: 445
Бесплатно скачать Реферат: Синтаксический разбор строк и конечные автоматы
|