From: Andreas H. <ah...@us...> - 2004-04-30 16:43:54
|
Update of /cvsroot/jvcl/dev/JVCL3/devtools/dxgettextResstr In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19830/devtools/dxgettextResstr Modified Files: dpp_PascalParser.pas Log Message: New pascal parser Index: dpp_PascalParser.pas =================================================================== RCS file: /cvsroot/jvcl/dev/JVCL3/devtools/dxgettextResstr/dpp_PascalParser.pas,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dpp_PascalParser.pas 14 Apr 2004 15:37:55 -0000 1.3 --- dpp_PascalParser.pas 30 Apr 2004 16:43:45 -0000 1.4 *************** *** 20,30 **** { } {**************************************************************************************************} unit dpp_PascalParser; interface ! uses SysUtils, Classes; const WhiteChars = [#1..#32]; ! OneSymbolChars = ['(', ')', '[', ']', ';', '@', '+', '-', '"', '/', '^', '.', ',', '*', '/']; NumberChars = ['0'..'9']; IdentFirstChars = ['a'..'z', 'A'..'Z', '_']; IdentChars = IdentFirstChars + NumberChars; --- 20,37 ---- { } {**************************************************************************************************} + // $Id$ + unit dpp_PascalParser; + interface ! ! uses ! SysUtils, Classes; ! const WhiteChars = [#1..#32]; ! OneSymbolChars = ['(', ')', '[', ']', ';', '@', '+', '-', '"', '/', '^', '.', ',', '*']; NumberChars = ['0'..'9']; + HexNumberChars = NumberChars + ['A'..'F', 'a'..'f']; IdentFirstChars = ['a'..'z', 'A'..'Z', '_']; IdentChars = IdentFirstChars + NumberChars; *************** *** 37,43 **** --- 44,53 ---- TTokenKind = (tkNone, tkIdent, tkSymbol, tkComment, tkString, tkNumber); + TTokenExKind = (tekNone, tekHex, tekInt, tekFloat, tekComment, tekOption); + PTokenInfo = ^TTokenInfo; TTokenInfo = record Kind: TTokenKind; + ExKind: TTokenExKind; pFilename: PString; StartLine, EndLine: Integer; *************** *** 64,69 **** function GetPreToken: PTokenInfo; public ! constructor Create(const AFileName, AText: string; ! StartLineNum: Integer = 1); destructor Destroy; override; --- 74,78 ---- function GetPreToken: PTokenInfo; public ! constructor Create(const AFileName, AText: string; StartLineNum: Integer = 1); destructor Destroy; override; *************** *** 101,107 **** PText, F, P: PChar; IndexAdd: Integer; begin Result := nil; ! if FIndex > FTextLen then Exit; PText := Pointer(FText); --- 110,120 ---- PText, F, P: PChar; IndexAdd: Integer; + IsDecimal: Boolean; + IsExp: Boolean; + IsExpSign: Boolean; begin Result := nil; ! if FIndex > FTextLen then ! Exit; PText := Pointer(FText); *************** *** 110,127 **** while P[0] in WhiteChars do begin ! if P[0] = #10 then Inc(FLineNum); Inc(P); end; ! if P[0] = #0 then Exit; Inc(FTokenIndex); ! if FTokenIndex >= MaxCachedTokens then FTokenIndex := 0; // ring buffer Result := FTokens[FTokenIndex]; - // Result.Kind := tkNone; Result.StartLine := FLineNum; Result.StartIndex := P - PText + 1; ! // Result.Value := ''; F := P; --- 123,142 ---- while P[0] in WhiteChars do begin ! if P[0] = #10 then ! Inc(FLineNum); Inc(P); end; ! if P[0] = #0 then ! Exit; Inc(FTokenIndex); ! if FTokenIndex >= MaxCachedTokens then ! FTokenIndex := 0; // ring buffer Result := FTokens[FTokenIndex]; Result.StartLine := FLineNum; Result.StartIndex := P - PText + 1; ! Result.ExKind := tekNone; F := P; *************** *** 134,148 **** begin case P[0] of ! #0: Break; '''': ! if (P[1] = '''') then ! Inc(P) ! else ! Break; ! #10: Inc(FLineNum); end; Inc(P); end; ! if P[0] <> #0 then Inc(P); // include P[0] which is now P[-1] Result.Kind := tkString; end --- 149,171 ---- begin case P[0] of ! #0: ! Break; '''': ! begin ! if (P[1] = '''') then ! Inc(P) ! else ! Break; ! end; ! #10, #13: ! begin ! Dec(P); ! Break; // line end is string end in pascal ! end; end; Inc(P); end; ! if P[0] <> #0 then ! Inc(P); // include P[0] which is now P[-1] Result.Kind := tkString; end *************** *** 151,169 **** // comment { ... } -> find comment end Inc(P); ! (* while (not (P[0] in [#0, '}'])) do begin ! if P[0] = #10 then Inc(FLineNum); Inc(P); ! end;*) while True do begin case P[0] of ! #0, '}': Break; ! #10: Inc(FLineNum); end; Inc(P); end; Result.Kind := tkComment; ! if P[0] <> #0 then Inc(P); // include P[0] which is now P[-1] end else if (P[0] = '(') and (P[1] = '*') then --- 174,198 ---- // comment { ... } -> find comment end Inc(P); ! if P[0] = '$' then begin ! Result.ExKind := tekOption; Inc(P); ! end ! else ! Result.ExKind := tekComment; ! while True do begin case P[0] of ! #0, '}': ! Break; ! #10: ! Inc(FLineNum); end; Inc(P); end; Result.Kind := tkComment; ! if P[0] <> #0 then ! Inc(P); // include P[0] which is now P[-1] end else if (P[0] = '(') and (P[1] = '*') then *************** *** 171,181 **** // comment (* ... *) -> find comment end Inc(P, 2); while (P[0] <> #0) and not ((P[0] = '*') and (P[1] = ')')) do begin ! if P[0] = #10 then Inc(FLineNum); Inc(P); end; Result.Kind := tkComment; ! if P[0] <> #0 then Inc(P, 2); // include P[0],P[1] which is now P[-2],P[-1] end else if (P[0] = '/') and (P[1] = '/') then --- 200,220 ---- // comment (* ... *) -> find comment end Inc(P, 2); + if P[0] = '$' then + begin + Result.ExKind := tekOption; + Inc(P); + end + else + Result.ExKind := tekComment; + while (P[0] <> #0) and not ((P[0] = '*') and (P[1] = ')')) do begin ! if P[0] = #10 then ! Inc(FLineNum); Inc(P); end; Result.Kind := tkComment; ! if P[0] <> #0 then ! Inc(P, 2); // include P[0],P[1] which is now P[-2],P[-1] end else if (P[0] = '/') and (P[1] = '/') then *************** *** 183,210 **** // comment "// ..." -> find comment end Inc(P, 2); ! while not (P[0] in [#0, #10, #13]) do Inc(P); Result.Kind := tkComment; if P[0] <> #0 then begin ! if P[0] = #13 then IndexAdd := 1; {do not parse the #13 again} Inc(FLineNum); Inc(IndexAdd); {do not parse the #10 again} end; end ! else if (P[0] in IdentFirstChars) then begin // identifier Inc(P); ! while (P[0] in IdentChars) do Inc(P); Result.Kind := tkIdent; end ! else if (P[0] in NumberChars) then begin // number Inc(P); ! while (P[0] in NumberChars) do Inc(P); Result.Kind := tkNumber; end else if P[0] in OneSymbolChars then --- 222,308 ---- // comment "// ..." -> find comment end Inc(P, 2); ! while not (P[0] in [#0, #10, #13]) do ! Inc(P); Result.Kind := tkComment; if P[0] <> #0 then begin ! if P[0] = #13 then ! IndexAdd := 1; {do not parse the #13 again} Inc(FLineNum); Inc(IndexAdd); {do not parse the #10 again} end; end ! else if P[0] in IdentFirstChars then begin // identifier Inc(P); ! while P[0] in IdentChars do Inc(P); Result.Kind := tkIdent; end ! else if P[0] in NumberChars then begin // number Inc(P); ! IsDecimal := False; ! IsExp := False; ! IsExpSign := False; ! repeat ! case P[0] of ! '0'..'9': ; ! ! '.': ! if IsDecimal or IsExp then ! Break ! else ! IsDecimal := True; ! ! '+', '-': ! if not IsExp or IsExpSign then ! Break ! else ! IsExpSign := True; ! ! 'e', 'E': ! if IsDecimal or IsExp then ! Break ! else ! IsExp := True; ! ! else ! Break; ! end; Inc(P); + until False; Result.Kind := tkNumber; + if IsExp or IsDecimal then + Result.ExKind := tekFloat + else + Result.ExKind := tekInt; + end + else if (P[0] = '$') and (P[1] in HexNumberChars) then + begin + // hex number + Inc(P, 2); + while P[0] in HexNumberChars do + Inc(P); + Result.Kind := tkNumber; + Result.ExKind := tekHex; + end + else if (P[0] = '#') and ((P[1] = '$') or (P[1] in NumberChars)) then + begin + // char + Inc(P, 2); + if P[-1] = '$' then + begin + while P[0] in HexNumberChars do + Inc(P); + end + else + begin + while P[0] in NumberChars do + Inc(P); + end; + Result.Kind := tkString; end else if P[0] in OneSymbolChars then *************** *** 215,223 **** else begin ! while (P[0] in SymbolChars) do ! begin ! if P[0] = #10 then Inc(FLineNum); Inc(P); - end; Result.Kind := tkSymbol; end; --- 313,318 ---- else begin ! while P[0] in SymbolChars do Inc(P); Result.Kind := tkSymbol; end; *************** *** 233,237 **** constructor TPascalParser.Create(const AFilename, AText: string; StartLineNum: Integer); ! var i: Integer; begin inherited Create; --- 328,333 ---- constructor TPascalParser.Create(const AFilename, AText: string; StartLineNum: Integer); ! var ! i: Integer; begin inherited Create; *************** *** 253,259 **** destructor TPascalParser.Destroy; ! var i: Integer; begin ! for i := 0 to MaxCachedTokens - 1 do Dispose(FTokens[i]); inherited Destroy; end; --- 349,357 ---- destructor TPascalParser.Destroy; ! var ! i: Integer; begin ! for i := 0 to MaxCachedTokens - 1 do ! Dispose(FTokens[i]); inherited Destroy; end; *************** *** 297,303 **** procedure TPascalParser.ClearCache; ! var i: Integer; begin ! for i := 0 to MaxCachedTokens - 1 do FTokens[i].Kind := tkNone; FTokenIndex := -1; end; --- 395,403 ---- procedure TPascalParser.ClearCache; ! var ! i: Integer; begin ! for i := 0 to MaxCachedTokens - 1 do ! FTokens[i].Kind := tkNone; FTokenIndex := -1; end; *************** *** 350,367 **** begin Result := nil; ! if FTokenIndex = -1 then Exit; Result := FTokens[FTokenIndex]; ! if Result.Kind = tkNone then Result := nil; end; function TPascalParser.GetPreToken: PTokenInfo; ! var Index: Integer; begin Result := nil; ! if FTokenIndex = -1 then Exit; Index := FTokenIndex - 1; ! if Index < 0 then Index := MaxCachedTokens - 1; Result := FTokens[Index]; ! if Result.Kind = tkNone then Result := nil; end; --- 450,473 ---- begin Result := nil; ! if FTokenIndex = -1 then ! Exit; Result := FTokens[FTokenIndex]; ! if Result.Kind = tkNone then ! Result := nil; end; function TPascalParser.GetPreToken: PTokenInfo; ! var ! Index: Integer; begin Result := nil; ! if FTokenIndex = -1 then ! Exit; Index := FTokenIndex - 1; ! if Index < 0 then ! Index := MaxCachedTokens - 1; Result := FTokens[Index]; ! if Result.Kind = tkNone then ! Result := nil; end; |