亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? jparser.pas.svn-base

?? 支持自定義語法高亮顯示的編輯器控件
?? SVN-BASE
字號:
unit jparser;

interface
uses
  Classes, SysUtils, EasyParser;
type

  TElementScope = (sPrivate, sPublic, sGlobal, sExported, sEnum, sParam, sLocalVar, sField, sUnknown);

  TClassDefinitionType = (dtClass, dtEnum, dtFunction, dtSimpleType);

  TElementInfo = class
  private
    FLineNo   : integer;
    FName     : string;
    FInfoType : string;
    FScope    : TElementScope;
  private
    procedure Added;
    procedure Deleted;
  public
    destructor Destroy; override;
    function  GetParentList : TStrings; virtual;
    property LineNo : integer read FLineNo write FLineNo;
    property Name : string read FName write FName;
    property Scope : TElementScope read FScope write FScope;
    property InfoType : string read FInfoType write FInfoType;
  end;

  TConstantInfo = class(TElementInfo)
  private
    FValue : string;
  public
    function GetParentList : TStrings; override;
    property Value : string read FValue write FValue;
  end;

  TVariableInfo = class(TElementInfo)
  public
    function  GetParentList : TStrings; override;
  end;

  TFunctionInfo = class(TElementInfo)
  private
    FReturnType   : string;
    FParams       : TStrings;
    FLocalVars    : TStrings;
    FStartPos     : integer;
    FEndPos       : integer;
    procedure SetParams(Value : TStrings);
    procedure SetLocalVars(Value : TStrings);
  public
    constructor Create;
    destructor Destroy; override;
    function  ParamText : string;
    function GetParentList : TStrings; override;
    property StartPos : integer read FStartPos write FStartPos;
    property EndPos : integer read FEndPos write FEndPos;
    property ReturnType : string read FReturnType write FReturnType;
    property Params : TStrings read FParams write SetParams;
    property LocalVars : TStrings read FLocalVars write SetLocalVars;
  end;

  TUnitInfo = class
  private
    FVariables    : TStrings;
    FFunctions    : TStrings;
    FConstants    : TStrings;
    FParser       : TEasyEditorParser;
    function  NextValidToken : integer;
    function  NextValidTokenStr : string;
    procedure ProcessFunction(const s : string; SkipToEnd : boolean);
    procedure ProcessVariable(const s : string);
    function  GetLinePos : integer;
  public
    constructor Create;
    destructor Destroy; override;
    procedure  ParseStrings(AStrings : TStrings);
    procedure ReparseStrings(Strings : TStrings);
    function  AddFunction(const AName : string) : TFunctionInfo;
    function  AddConst(const AName : string; AOwner : TElementInfo) : TConstantInfo;
    function  AddVariable(const AName : string; AOwner : TElementInfo) : TVariableInfo;
    function AddParam(const AName : string; AOwner : TFunctionInfo) : TVariableInfo;
    function IndexOf(const s : string) : TElementInfo;
    property Variables : TStrings read FVariables;
    property Functions : TStrings read FFunctions;
    property Constants : TStrings read FConstants;
    property Parser : TEasyEditorParser read FParser write FParser;
  end;

function UnitInfo : TUnitInfo;

implementation
uses
  EasyUtils;
type
  TMParser = class(TEasyEditorParser);

var
  FUnitInfo : TUnitInfo = nil;
const
  tnone = 0;
  tstring = 1;
  tcomment = 2;
  tident = 3;
  tinteger = 4;
  tfloat = 5;
  tresword = 6;
  twhitespace = 9;

  sFuncStr = 'function';
  sVarStr = 'var';
  sGroupBegin = '{';
  sGroupEnd = '}';
  sLeftBracket = '(';
  sRightBracket = ')';

procedure ClearStrings(Strings : TStrings);
var
  i : integer;
begin
  with Strings do
  begin
    for i := Count - 1 downto 0 do
      Objects[i].Free;
    Clear;
  end;
end;

procedure FreeStrings(var Strings : TStrings);
begin
  ClearStrings(Strings);
  Strings.Free;
  Strings := nil;
end;

function UnitInfo : TUnitInfo;
begin
  if FUnitInfo = nil then
    FUnitInfo := TUnitInfo.Create;
  result := FUnitInfo;
end;

procedure TElementInfo.Added;
var
  List : TStrings;
begin
  if FName = '' then
    exit;
  Deleted;
  List := GetParentList;
  if List <> nil then
    List.AddObject(Name, Self);
end;

procedure TElementInfo.Deleted;
var
  List : TStrings;
  i    : integer;
begin
  if FName = '' then
    exit;
  List := GetParentList;
  if List <> nil then
    with List do
    begin
      i := IndexOf(FName);
      if i >= 0 then
        Delete(i);
    end;
end;

destructor TElementInfo.Destroy;
begin
  Deleted;
  inherited Destroy;
end;

function  TElementInfo.GetParentList : TStrings;
begin
  result := nil;
end;

function  TConstantInfo.GetParentList : TStrings;
begin
  if Scope in [sGlobal, sPrivate, sPublic, sExported] then
    result :=  UnitInfo.Constants
  else
    result := nil;
end;

function  TVariableInfo.GetParentList : TStrings;
begin
  if Scope in [sGlobal, sPrivate, sPublic, sExported] then
    result :=  UnitInfo.Variables
  else
    result := nil;
end;

procedure TFunctionInfo.SetParams(Value : TStrings);
begin
  FParams.Assign(Value);
end;


procedure TFunctionInfo.SetLocalVars(Value : TStrings);
begin
  FLocalVars.Assign(Value);
end;

constructor TFunctionInfo.Create;
begin
  inherited Create;
  FParams := TStringList.Create;
  FLocalVars := TStringList.Create;
end;

destructor TFunctionInfo.Destroy;
begin
  FreeStrings(FParams);
  FreeStrings(FLocalVars);
  inherited Destroy;
end;

function  TFunctionInfo.ParamText : string;
var
  i : integer;
begin
  result := '';
  for i := 0 to Params.Count - 1  do
    with TVariableInfo(Params.Objects[i]) do
    begin
      if result <> '' then
        result := result + ',';
//      result := result + FInfoType + ' ' + FName;
      if FInfoType <> '' then
        result := result + FInfoType + ' ' + FName
      else
        result := result + FName;
    end;
   result := '(' + result + ')';
end;


function  TFunctionInfo.GetParentList : TStrings;
begin
  result := UnitInfo.Functions
end;

constructor TUnitInfo.Create;
begin
  inherited Create;
  FVariables := CreateSortedStrings;
  FFunctions := CreateSortedStrings;
  FConstants := CreateSortedStrings;
end;

destructor TUnitInfo.Destroy;
begin
  FreeStrings(FVariables);
  FreeStrings(FFunctions);
  FreeStrings(FConstants);
  inherited Destroy;
end;


function TUnitInfo.IndexOf(const s : string) : TElementInfo;
var
  AInfo : TElementInfo;

  function _Check(Strings : TStrings) : boolean;
  var
    Index : integer;
  begin
    Index := Strings.IndexOf(s);
    result := Index >= 0;
    if result then
      AInfo := TElementInfo(Strings.Objects[Index]);
  end;


begin
  if _Check(FVariables) or _Check(FFunctions) or _Check(Constants) then
    result := AInfo
  else
    result := nil;
end;

function  TUnitInfo.AddFunction(const AName : string) : TFunctionInfo;
begin
  if AName = '' then
  begin
    result := nil;
    Exit;
  end;
  result := TFunctionInfo.Create;
  with result do
  begin
    Name := AName;
    Scope := sPublic;
    Added;
  end;
end;

function TUnitInfo.AddParam(const AName: string; AOwner: TFunctionInfo): TVariableInfo;
begin
  if (AName = '') or (AOwner = nil) or not (AOwner is TFunctionInfo) then
  begin
    result := nil;
    exit;
  end;
  result := TVariableInfo.Create;
  with result do
  begin
    Name := AName;
    Scope := sParam;
    AOwner.Params.AddObject(Name, result);
  end;
end;

function  TUnitInfo.AddVariable(const AName : string; AOwner : TElementInfo) : TVariableInfo;
begin
  if (AName = '')  then
  begin
    result := nil;
    exit;
  end;
  result := TVariableInfo.Create;
  with result do
  begin
    Name := AName;
    Scope := sPublic;
    if AOwner = nil then
      Added
    else
    if AOwner is TFunctionInfo then
    begin
      TFunctionInfo(AOwner).LocalVars.AddObject(Name, result);
      result.Scope := sLocalVar;
    end;
  end;
end;

function  TUnitInfo.AddConst(const AName : string; AOwner : TELementInfo) : TConstantInfo;
begin
  if (AName = '') then
  begin
    result := nil;
    Exit;
  end;
  result := TConstantInfo.Create;
  with result do
  begin
    Name := AName;
    Scope := sPublic;
    if AOwner = nil then
      Added
    else
    if AOwner is TFunctionInfo then
    begin
      TFunctionInfo(AOwner).LocalVars.AddObject(Name, result);
      result.Scope := sLocalVar;
    end;
  end;
end;

procedure  TUnitInfo.ParseStrings(AStrings : TStrings);
var
  s : string;
begin
  if FParser = nil then
    Exit;
  with FParser do
  begin
    Strings := AStrings;
    Reset;
    while not EndOfSource do
    begin
      case NextValidToken of
        tresword :
        begin
          s := TokenString;
          if s = sFuncStr then
            ProcessFunction(NextValidTokenStr, true)
          else
          if (CompareText(s, sVarStr) = 0) then
            ProcessVariable(NextValidTokenStr);
        end;
      end;
    end;
    Strings := nil;
  end;
end;


procedure TUnitInfo.ReparseStrings(Strings : TStrings);
begin
  ClearStrings(FVariables);
  ClearStrings(FFunctions);
  ClearStrings(FConstants);
  if Strings <> nil then
    ParseStrings(Strings);
end;

function TUnitInfo.NextValidToken : integer;
begin
  repeat
    result := FParser.NextToken;
  until (result <> tComment) and (result <> tNone) and (result <> twhitespace);
end;

function  TUnitInfo.NextValidTokenStr : string;
begin
  NextValidToken;
  result := FParser.TokenString;
end;

procedure TUnitInfo.ProcessFunction(const s : string; SkipToEnd : boolean);
var
  i     : integer;
  Info  : TFunctionInfo;
  Count : integer;
  Temp  : string;

  procedure ParseParams(Info : TFunctionInfo);
  begin
    FParser.NextToken;
    Temp := FParser.TokenString;
    if Temp <> sLeftBracket then
      exit;
    with FParser do
      while not EndOfSource do
      begin
        i := NextToken;
        Temp := TokenString;
        if Temp = sRightBracket then
          exit;
        if (i <> tComment) and (i <> tNone) and (i <> twhitespace) then
          AddParam(Temp, Info);
      end;
  end;

  procedure ParseLocalVars(Info : TFunctionInfo);
  var
    VarAdded: boolean;
  begin
   VarAdded := false;
    with FParser do
      while not EndOfSource do
      begin
        i := NextToken;
        Temp := TokenString;
        if Temp = ',' then
          VarAdded := false;
        if Temp = ';' then
          exit;
        if (i <> tComment) and (i <> tNone) and (i <> twhitespace) then
          begin
            if VarAdded then
              exit;
            AddVariable(Temp, info);
            VarAdded := true;
          end;
      end;
  end;

begin
  Info := UnitInfo.AddFunction(s);
  if Info = nil then
    Exit;
  Info.LineNo := GetLinePos;
  ParseParams(Info);
  if SkipToEnd then
  begin
    Info.StartPos := GetLinePos;
//    ParseLocalVars(Info);
    Count := 0;
    with FParser do
      while not EndOfSource do
      begin
        NextToken;
        Temp := TokenString;
        if Temp = sVarStr then
          ParseLocalVars(Info);
        if Temp = sGroupBegin then
          Inc(Count)
        else
        if Temp = sGroupEnd then
        begin
          Dec(Count);
          if Count = 0 then
            Break;
        end;
      end;
    Info.EndPos := GetLinePos;
  end;  
end;

procedure TUnitInfo.ProcessVariable(const s : string);
var
  Info : TVariableInfo;
begin
  Info := UnitInfo.AddVariable(s, nil);
  if Info = nil then
    Exit;
  Info.LineNo := GetLinePos;
end;

function TUnitInfo.GetLinePos : integer;
begin
  result := TMParser(FParser).LineIndex;
end;

initialization

finalization
  FUnitInfo.Free;

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲夂夂婷婷色拍ww47| 日韩一二三四区| 亚洲国产成人在线| 国内精品不卡在线| 久久午夜电影网| 国产成a人亚洲| 成人免费一区二区三区在线观看| 99re热这里只有精品视频| 中文字幕在线不卡| 91成人国产精品| 午夜不卡av在线| 日韩欧美一级二级三级久久久| 麻豆一区二区在线| 国产亚洲欧美激情| 91免费小视频| 日本91福利区| 久久免费精品国产久精品久久久久| 国产成a人无v码亚洲福利| 国产精品国产三级国产三级人妇| 欧美亚洲另类激情小说| 日产精品久久久久久久性色| 精品欧美一区二区在线观看 | 日韩限制级电影在线观看| 九一九一国产精品| 最新热久久免费视频| 欧美喷潮久久久xxxxx| 国产伦精品一区二区三区免费| 中文字幕久久午夜不卡| 欧美三级乱人伦电影| 久久99国产精品久久99果冻传媒| 国产精品美女久久久久久| 精品视频全国免费看| 国产精品2024| 午夜精品福利一区二区三区蜜桃| 亚洲精品一区二区三区在线观看 | 精彩视频一区二区| 亚洲免费观看高清完整| 精品国产乱码久久久久久老虎 | 欧美sm美女调教| av亚洲精华国产精华精| 日本成人在线看| 1024精品合集| 欧美精品一区二区高清在线观看| 91丨国产丨九色丨pron| 精东粉嫩av免费一区二区三区| 亚洲激情图片一区| 2021中文字幕一区亚洲| 欧美日韩久久久| av男人天堂一区| 激情综合色综合久久| 亚洲图片一区二区| 国产精品久久久久婷婷| 精品粉嫩超白一线天av| 在线欧美日韩国产| 99久久99久久综合| 国产精品亚洲第一| 蜜臀av亚洲一区中文字幕| 亚洲一二三区在线观看| 国产精品久久久久久久久免费相片| 日韩无一区二区| 精品视频在线免费| 91国在线观看| 91麻豆文化传媒在线观看| 国产成+人+日韩+欧美+亚洲| 久久99国产精品久久99| 另类小说视频一区二区| 午夜视频一区在线观看| 一区二区三区影院| 亚洲激情av在线| 椎名由奈av一区二区三区| 国产精品国产三级国产普通话三级 | 精品欧美一区二区在线观看| 欧美亚洲动漫另类| 色婷婷av一区二区三区大白胸| 国产成人aaa| 91精品国产高清一区二区三区蜜臀| 99国产欧美另类久久久精品| 成人永久aaa| 粉嫩蜜臀av国产精品网站| 国产成人免费高清| 国产精品夜夜爽| 高清shemale亚洲人妖| 国产不卡视频在线播放| 国产成人精品aa毛片| 成人v精品蜜桃久久一区| 成人午夜看片网址| 91污在线观看| 在线欧美日韩国产| 91精品在线麻豆| 欧美一级欧美三级| 欧美精品一区二区三区在线 | 国产精品亚洲视频| 国产91露脸合集magnet| 成人精品亚洲人成在线| 91片在线免费观看| 欧美日韩一区二区三区高清| 制服丝袜av成人在线看| 26uuu久久天堂性欧美| 国产日韩欧美一区二区三区乱码| 国产精品久久久久aaaa| 亚洲精品ww久久久久久p站| 青青草原综合久久大伊人精品| 毛片基地黄久久久久久天堂| 亚洲精品在线免费观看视频| 久久久久国产精品厨房| 中文字幕日韩一区二区| 亚洲国产一区二区在线播放| 日韩国产欧美一区二区三区| 国产在线视频不卡二| 国产丶欧美丶日本不卡视频| 色综合久久中文综合久久97 | 日韩精品资源二区在线| 中文字幕高清不卡| 日韩精品色哟哟| 国产一区91精品张津瑜| 色欧美片视频在线观看| 日韩一级二级三级| 日韩美女视频19| 五月婷婷综合网| 高清国产一区二区| 欧美日韩国产区一| 久久久五月婷婷| 午夜欧美视频在线观看| 国产精品中文字幕日韩精品 | 欧美美女视频在线观看| 久久一区二区三区国产精品| 樱花草国产18久久久久| 国产一区二区看久久| 91福利在线看| 国产精品毛片无遮挡高清| 婷婷六月综合亚洲| 91丨porny丨最新| 久久久综合精品| 日韩专区一卡二卡| 91丨九色porny丨蝌蚪| 国产亚洲精品7777| 日韩中文字幕91| 色网站国产精品| 国产调教视频一区| 男人操女人的视频在线观看欧美| 91网站最新地址| 久久女同互慰一区二区三区| 日本一不卡视频| 欧美在线视频不卡| 亚洲啪啪综合av一区二区三区| 国精产品一区一区三区mba桃花 | 亚洲色图一区二区| 国产一区欧美一区| 欧美成人一区二区三区在线观看 | 国产色91在线| 久久国产剧场电影| 91麻豆精品久久久久蜜臀| 亚洲精品视频在线观看免费 | 精品一区二区三区不卡| 69堂成人精品免费视频| 五月激情综合网| 色8久久人人97超碰香蕉987| 中文字幕免费在线观看视频一区| 狠狠色丁香婷婷综合| 日韩精品一区二区三区蜜臀| 无码av免费一区二区三区试看 | 99精品国产热久久91蜜凸| 久久久亚洲高清| 国产精品一区二区三区乱码| 精品国产麻豆免费人成网站| 男女性色大片免费观看一区二区 | 国产黑丝在线一区二区三区| 欧美精品一区二区三区一线天视频| 日本不卡一区二区三区高清视频| 欧美日韩国产色站一区二区三区| 亚洲一区二区欧美激情| 欧美日韩一区二区三区在线 | 日韩欧美一区二区三区在线| 亚洲高清不卡在线观看| 91久久一区二区| 亚洲国产一区在线观看| 欧美放荡的少妇| 精品一区二区影视| 精品福利视频一区二区三区| 国产白丝精品91爽爽久久| 中文字幕精品三区| 日本道色综合久久| 亚州成人在线电影| 日韩精品一区二| 国产91精品露脸国语对白| 中文字幕亚洲电影| 欧美日韩亚洲不卡| 久久精品国产澳门| 亚洲国产成人在线| 欧美性受xxxx| 久色婷婷小香蕉久久| 国产人妖乱国产精品人妖| 99国产精品99久久久久久| 亚洲一区二区三区四区在线| 在线播放亚洲一区| 国产一区二区在线观看视频| 日本一区免费视频| 欧美在线高清视频| 韩国三级电影一区二区| 1024国产精品|