Riceball's profileRiceball LEE personal we...PhotosBlogLists Tools Help

Blog


    September 16

    通用 Tokenizer 类

    功能:  将字符串序列Token化的通用 Tokenizer 类。

    分析
       Token 类型分为两类,

    • SimpleToken,
    • ComplexToken。

    SimpleToken: 是由固定的字符串序列组成, eg, ';' 。

    ComplexToken: 由起始 Token,结束Token 以及夹在其间的字符串组成,如,注释和字符串。

    ComplexToken 的处理方式有: tfEscapeDuplicateToken, tfOneLine, tfEscapeChar。

    • tfOneLine: 表示只处理1行
    • tfEscapeDuplicateToken: 是否处理转义TokenEnd符号,当双写TokenEnd符号时候表示,一个TokenEnd符号,如: '''',表示一个单引号。
    • tfEscapeChar: 是否启用 EscapeChar 转义字符串序列的下一个字符. 转义字符在属性 EscapeChar 中设置. DeQuotedString只处理转义自身和转义TokenEnd符号,如果有其它字符转义你需要重载 DoEscapedChar或联系OnEscapedChar事件。

    加入新的TokenId

    简单类型的TokenId:

    ttArgSpliter := 32;

    SimpleTokens.AddStandardToken(ttSpliter, ';');
    SimpleTokens.Add(ttArgSpliter, ',');

    复杂类型的 TokenId:
    Tokens.AddStandardToken(ttComment, '//', '', [tfOneLine]);
    Tokens.Add(aTokenId, aTokenBegin, aTokenEnd, aTokenFlags);

    通过LoadFromXX加载待处理的字符流,调用 ReadToken 方法对字符流进行 Token化。

     

    属性和事件:

    • IgnoreCase: 是否忽略大小写
    • BlankChars: 哪些字符是需要忽略的空白字符
    • EscapeChar: 在 ComplexToken 中的转义字符定义,如果为空,则无转义
    • property Errors: PMeTokenErrors read GetErrors;  收集在Tokenize过程中发生的错误,如果无错误,Errors.Count =0.
    • property CurrentToken: TMeToken read FCurrentToken;
    • property SimpleTokens: PMeSimpleTokenTypes read FSimpleTokens;
    • property Tokens: PMeComplexTokenTypes read FTokens;
    • property OnEscapedChar: TMeEscapedCharEvent read FOnEscapedChar write FOnEscapedChar;
    • property OnComment: TMeOnCommentEvent read FOnComment write FOnComment;

     

    方法:

    • function HasTokens: Boolean;
    • function ReadToken: PMeToken;  从字符流中读入一个Token,如果返回nil表示再无Token可读。
    • function NextToken: PMeToken;  返回当前字符流中的下一个Token。
    • procedure LoadFromStream(const Stream: PMeStream); 加载待处理的字符流。
    • procedure LoadFromFile(const FileName: string); 从文件加载待处理的字符流。
    • procedure LoadFromString(const aValue: string);
    • procedure Clear;
    • function DeQuotedString(const aToken: PMeToken): string;  如果aToken是ComplexToken那么将该Token 作 DeQuotedString 处理.