CodeColor相关(二) 基类TCodeColor

类别:Delphi 点击:0 评论:0 推荐:

        第二部分:基类 TCodeColor

        一、本章说明
        暂时先公开基类代码,和子类的部分代码,子类中字符分析函数 Analyzer 的实现暂时不公开,主要出于这样的考虑:
        1、基类已实现大部分共用功能,但是还不完善,代码也不规范。特别是各个版本的 Analyzer 中都会用到这些功能,所以待听取路高手的意见,将基类改进完善后,将重写 Analyzer 并在第三部分中公开;
        2、如果您急于使用本程序,有两种方法:一是您可以留下邮箱地址,我会寄给您一份程序;二是利用并不完善基类 TCodeColor 继承出一个子类,自己实现 Analyzer ,字符分析的方法可以参考 李马  的 行云流水网站  提供的 C 语言版 《Pascal 词法分析器》源代码;
        3、欢迎大家提出宝贵意见、想法,同时尽可能的留下相应的解决方案。

        二、用户端
        很简单,不做过多说明:

//┏━━━━━━━━━━━━━━┓
//┃代码着色:CodeColor v1.0  ┃
//┃来自:悄然无声的 Blog     ┃      
//┗━━━━━━━━━━━━━━┛

procedure TfrmMain.Button1Click(Sender: TObject);
var
  cc:TCodeColor;
begin
  cc:=TCC_Delphi.Create('gainsboro',720)
  cc.Source:=Memo1.Text;
  cc.Processor;
  Memo1.Text:=cc.OutPut;
  Memo1.Lines.SaveToFile('result.htm');
end;


        二、基类 TCodeColor
        也很简单,在注释中已有详细说明。IsAlphaIsNumberic 都用的土方法,或许还有更好的实现方法。IsMBCSChar 是经过滚龙的三次指点才变成现在这个样子的,原先叫 IsHZ ,所以欢迎大家指点一二。 

//┏━━━━━━━━━━━━━━┓
//┃代码着色:CodeColor v1.0  ┃
//┃来自:悄然无声的 Blog     ┃      
//┗━━━━━━━━━━━━━━┛

unit CodeColor;

interface

uses
  Classes,SysUtils;

type
  TCodeColor = class(TObject)
  protected
    FOutPut: string; //处理后的 Html 文本
    FSource: string; //处理前的源文本
    FPosition: Integer; //当前被处理字符的位置
    FBGColor:string; //Html 中表格的背景颜色
    FWidth:string;//Html 中表格的宽度
    ReserveWords: TStrings;//关键字
    
    //抽象的字符分析函数,便于在子类中有不同的实现
    procedure Analyzer; virtual; abstract;

    //下面四个函数在子类中的 Analyzer 中使用
    function GetNextChar: Char;//返回下一个字符
    function IsAlpha(const ch: Char): Boolean; //判断是否是字母
    function IsMBCSChar(const ch: Char): Boolean;//判断字符是否为多字节字符
    function IsNumberic(const ch: Char): Boolean; //判断是否是数字
  public
    constructor Create(const bgColor:string;width:Integer);
    property Source: string write FSource;//属性:设置源文本
    procedure Processor;//处理机
    property OutPut: string read FOutPut; //属性:返回处理后的 Html 文本
  end;
  
implementation

{
********************************** TCodeColor **********************************
}

constructor TCodeColor.Create(const bgColor: string; width: Integer);
begin
   FBGColor:=BGColor;
   FWidth:=InttoStr(width);
end;

//处理机
procedure TCodeColor.Processor;
begin
  FPosition:=0;
  FOutput:='';

  while(FPosition<Length(FSource)) do
  begin
    Analyzer;
  end;

  FOutput:='<TABLE BGCOLOR="' + FBGColor + '" '
              + 'BORDER="1" CELLSPACING="1" CELLPADDING="1" '
              + 'width="' + FWidth + '">'
              + '<TR><TD>'
              + '<font face="Courier New" size="2">'
              + FOutput
              + '</font>'
              + '</TD></TR></TABLE>';
end;

//返回下一个字符
function TCodeColor.GetNextChar: Char;
begin
  inc(FPosition);
  result:=FSource[FPosition];
end;

//判断是否是字母
function TCodeColor.IsAlpha(const ch: Char): Boolean;
var
  i: Integer;
begin
  i:=ord(ch);
  if( ((i>=65)and(i<=90)) or
      ((i>=97)and(i<=122)) ) then result:=true else result:=false;
end;

//判断字符是否为多字节字符
function TCodeColor.IsMBCSChar(const ch: Char): Boolean;
begin
  Result := (ByteType(ch, 1) <> mbSingleByte);
end;

//判断是否是数字
function TCodeColor.IsNumberic(const ch: Char): Boolean;
var
  i: Integer;
begin
  i:=ord(ch);
  if(i>57) or (i<48) then result:=false else result:=true;
end;

end.

        三、子类 TCC_Delphi
        这里仅给出一个结构,Analyzer 在这暂不实现,后面会专门发一篇帖子介绍。

//┏━━━━━━━━━━━━━━┓
//┃代码着色:CodeColor v1.0  ┃
//┃来自:悄然无声的 Blog     ┃      
//┗━━━━━━━━━━━━━━┛

unit CC_Delphi;

interface

uses
  CodeColor,StrUtils,Classes;

type
  TCC_Delphi = class(TCodeColor)
  protected
    procedure Analyzer; override;
  public
    constructor Create(const bgColor:string;width:Integer);
  end;
  

implementation

{
********************************** TCC_Delphi **********************************
}

constructor TCC_Delphi.Create(const bgColor:string;width:Integer);
begin
  inherited Create(bgColor,width);
  ReserveWords:=TStringList.Create();
  ReserveWords.LoadFromFile('Delphi_ReserveWords.txt');
end;

//字符分析函数
procedure TCC_Delphi.Analyzer;
var
  strToken:string;
  ch:Char;
begin
  //此处暂不实现,给出部分样例仅供参考

  //.........................

  //判断标识符和关键字的情况
  if(IsAlpha(ch)  or IsMBCSChar(ch)) then
  begin
    while (IsAlpha(ch) or IsNumberic(ch) or (ch = '_') or IsMBCSChar(ch)) do
    begin
      strToken:=strToken+ch;
      ch := GetNextChar;
    end;
    dec(FPosition);
    if(ReserveWords.IndexOf(strToken)>0) then
      FOutput:=FOutput + '<strong><font color="blue">'
                   + strToken + '</font></strong>'
    else  FOutput:=FOutput + strToken;
    exit;
  end;  

  //.........................
end;
end.

本文地址:http://com.8s8s.com/it/it4349.htm