четверг, 28 марта 2013 г.

Кто-то ещё использует "парсинг" из RX?

http://traditio-ru.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BC%D0%B0%D0%BB%D1%8F%D1%80%D0%B0_%D0%A8%D0%BB%D0%B5%D0%BC%D0%B8%D1%8D%D0%BB%D1%8F

http://russian.joelonsoftware.com/Articles/BacktoBasics.html

в RX есть функции работы со строками - GetWordCount и GetWord.

for i := 0 to GetWordCount(aStr) do
 doString(GetWord(aStr, i));

Понятно где тут "алгоритм маляра"?

Надеюсь - Америку ни для кого не открыл.

P.S. А тут кстати - самое дело - использовать лямбды. В Delphi XE3 они кстати есть? Я пока - не нашёл... :-(

P.P.S callback и Event - ТОЖЕ можно, но это все знают и БЕЗ меня.

P.P.P.S. Рассказать как это у меня устроено на l3Stub? Или неинтересно?

1 комментарий:

  1. Я даже не знаю, куда тут лямбды прислонить, но у меня есть такой вот алгоритм, для Lazarus, технически, наверное, в Delphi тоже должен заработать (возможно, с минимальными правками):

    unit ...;

    interface

    type
    TCharSet=set of char;

    Const
    DefaultWhiteList:TCharSet=['A'..'Z','a'..'z','0'..'9',
    // АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЫЭЮЯабвгдеёжзийклмнопрстуфхцчшщъьыэюя
    // this is parts of UTF-8 pairs in russian characters presentation
    #$80..#$BF,#$D0,#$D1];

    type

    { TWordEnumerator }

    TWordEnumerator=class
    private
    fPredIndex,fCurIndex,fLen:integer;
    fData:string;
    fWhiteList:set of char;
    function GetWord:string;{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}
    public
    property Current:string read GetWord;
    function MoveNext:boolean;
    function GetEnumerator:TWordEnumerator;{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}
    Constructor Create(const Input:string;const WhiteList:TCharSet=[]);
    end;

    // allow to traverse UTF-8 words in string
    // example:
    // var C:string;
    // For C in WordList('Привет мой безумный мир! Hello my mindless world!') do...
    // works only for latin and russian characters by default, for other alphabets,
    // WhiteList parameter should be filled with appropriate characters (NOT UTF-8 pairs!)
    function WordList(const Input:string;const WhiteList:TCharSet=[]):TWordEnumerator;

    implementation

    { TWordEnumerator }

    function TWordEnumerator.GetWord: string;
    begin
    Result:=Copy(fData,fPredIndex,fCurIndex-fPredIndex);
    end;

    function TWordEnumerator.MoveNext: boolean;
    begin
    fPredIndex:=fCurIndex;
    // skip first non-word characters
    while (fPredIndex<=fLen) and (not (fData[fPredIndex] in fWhiteList)) do
    Inc(fPredIndex);
    // check, that something remains in string
    Result:=fPredIndex<=fLen;
    if not Result then exit;
    // find end of word
    fCurIndex:=fPredIndex;
    while (fCurIndex<=fLen) and (fData[fCurIndex] in fWhiteList) do
    Inc(fCurIndex);
    end;

    function TWordEnumerator.GetEnumerator: TWordEnumerator;
    begin
    Result:=Self;
    end;

    constructor TWordEnumerator.Create(const Input:string;const WhiteList:TCharSet);
    begin
    inherited Create;
    fPredIndex:=1;
    fCurIndex:=1;
    fData:=Input;
    fLen:=Length(Input);
    if WhiteList=[] then
    fWhiteList:=DefaultWhiteList
    else
    fWhiteList:=WhiteList;
    end;

    function WordList(const Input:string;const WhiteList:TCharSet=[]):TWordEnumerator;
    begin
    Result:=TWordEnumerator.Create(Input,WhiteList);
    end;

    end.

    На большинстве случаев работает, этот код разрабатывался для студента, которому надо было узнать максимальную длину слова в строке... точно знаю, что чувак не сдал, ибо итераторы они ещё не проходили, но я алгоритм сохранил.

    ОтветитьУдалить