Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.11.28;
Скачать: [xml.tar.bz2];

Вниз

найти все строки в проекте, эксперт для IDE?   Найти похожие ветки 

 
antonn ©   (2010-08-19 13:19) [0]

Имеется довольно большой (по кол-ву юнитов) проект, с локализацией. Но т.к. в процессе отладки часто подставлялись строки прямо в коде (не из массива локали), то есть вероятность что где-то в юнитах остались строки "в чистом виде" и их нужно заменить. Так вот вопрос - как в проекте найти текстовые строки во всех юнитах (я про "text")? Но желательно не включая родные дельфовые :)
Есть ли какой нибудь эксперт для ИДЕ? D7 юзаю


 
Игорь Шевченко ©   (2010-08-19 13:27) [1]

в GExperts не ?

Я программу из сотни строк писал на такой предмет.


 
antonn ©   (2010-08-19 13:35) [2]


> Я программу из сотни строк писал на такой предмет.

а можно посмотреть? :)

GExperts скачал, посмотрю


 
Игорь Шевченко ©   (2010-08-19 14:01) [3]


> а можно посмотреть? :)


а что смотреть, простой лексический анализатор, тыщи их, когда-то писал на вполне определенный предмет, теперь пользую в подобных ситуациях.


 
DVM ©   (2010-08-19 14:01) [4]

Мне кажется, в GExperts нету этого, сам как то искал, не нашел, может плохо искал


 
antonn ©   (2010-08-19 17:03) [5]

да, не нашел, сделал поиск по ", сразу вспомнил про загрузчики конфигураций из ini-файлов, про логи... получилось много :)


 
DVM ©   (2010-08-19 17:47) [6]


> antonn ©   (19.08.10 17:03) [5]

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


 
Игорь Шевченко ©   (2010-08-19 18:13) [7]

antonn ©   (19.08.10 17:03) [5]

вот как-то так, два юнита:

unit SourceReader;

interface
uses
 HSFileMapper;

type
 TSourceReader = class
 private
   FMapper : THSFileMapper;
   FCursor : PChar;
   FLineNumber: Integer;
   function GetEof: Boolean;
   function GetNextChar: Char;
   function GetFileName: String;
   function IsEndOfLine : Boolean;
   procedure ProcessEndOfLine;
   function GetNextSourceChar: Char;
   function CheckLineComment (C: Char): Boolean;
   function CheckBracketComment (C: Char): Boolean;
   function CheckOldStyleComment (C: Char): Boolean;
   function IsString (const S: string): Boolean;
 public
   constructor Create (const AFileName: string);
   destructor Destroy; override;
   function PreviewChar: Char;
   property LineNumber: Integer read FLineNumber;
   property Eof: Boolean read GetEof;
   property NextChar: Char read GetNextChar;
   //С пропуском комментариев
   property NextSourceChar: Char read GetNextSourceChar;
   property FileName: string read GetFileName;
   function NextSourceCharEx (var SpecComment: Boolean): Char;
 end;

implementation
uses
 SysUtils;

const
 SSpecComment: string = "//{";

{ TSourceReader }

function TSourceReader.CheckBracketComment(C: Char): Boolean;
begin
 Result := C = "{";
end;

function TSourceReader.CheckLineComment (C: Char): Boolean;
begin
 Result := (C = "/") and not Eof and (FCursor^ = "/");
end;

function TSourceReader.CheckOldStyleComment(C: Char): Boolean;
begin
 Result := (C = "(") and not Eof and (FCursor^ = "*");
end;

constructor TSourceReader.Create(const AFileName: String);
begin
 FMapper := THSFileMapper.Create(AFileName);
 FCursor := FMapper.Map;
 FLineNumber := 1;
end;

destructor TSourceReader.Destroy;
begin
 FMapper.Free;
 inherited;
end;

function TSourceReader.GetEof: Boolean;
begin
 Result := (FCursor >= FMapper.EndMap) or (FCursor^ = #26);
end;

function TSourceReader.GetFileName: String;
begin
 Result := FMapper.FileName;
end;

function TSourceReader.GetNextChar: Char;
begin
 Result := #0;
 if not Eof then
   if IsEndOfLine then begin
     ProcessEndOfLine;
     Exit;
   end;
 if Eof then
   Exit;
 Result := FCursor^;
 Inc(FCursor);
end;

function TSourceReader.GetNextSourceChar: Char;
begin
 Result := NextChar;
 if (Result = #0) and not Eof then begin
   Result := " ";  //Заменить конец строки на пробел
   Exit;
 end;
 if CheckLineComment(Result) or CheckBracketComment (Result)
    or CheckOldStyleComment (Result) then
 begin
   if CheckLineComment(Result) then
   begin
     //Пропустить комментарий до конца строки
     repeat
       Result := NextChar;
     until (Result = #0) or Eof;
     if not Eof then
       Result := " "; //Заменить комментарий на пробел
     Exit;
   end;
   if CheckBracketComment (Result) then
   begin
     repeat
       Result := NextChar;
     until (Result = "}") or Eof;
     Result := " "; //Заменить комментарий на пробел
     Exit;
   end;
   if CheckOldStyleComment(Result) then
   begin
     Inc(FCursor); //Пропустить звездочку
     while not Eof do
     begin
       Result := NextChar;
       if (Result = "*") and not Eof and (FCursor^ = ")") then begin
         Inc(FCursor); //Пропустить скобку
         Result := " "; //Заменить комментарий на пробел
         Exit;
       end;
     end;
   end;
 end;
end;

function TSourceReader.IsEndOfLine: Boolean;
begin
 Result := (FCursor^ = #13) or (FCursor^ = #10);
end;

function TSourceReader.IsString(const S: string): Boolean;
begin
 Result := (FCursor + Length(S) < FMapper.EndMap)
   and (StrLComp(PChar(S), FCursor, Length(S)) = 0);
end;

function TSourceReader.NextSourceCharEx(var SpecComment: Boolean): Char;
begin
 SpecComment := IsString (SSpecComment);
 Result := NextSourceChar;
end;

function TSourceReader.PreviewChar: Char;
begin
 if Eof then
   Result := #0
 else
   if IsEndOfLine then
     Result := " "
   else
     Result := FCursor^;
end;

procedure TSourceReader.ProcessEndOfLine;
begin
//TODO: Добавить поведение для файла, где строки разделены только возвратами
//      каретки.
 if FCursor^ = #13 then
   Inc(FCursor);
 if Eof then
   Exit;
 if FCursor^ = #10 then begin
   Inc(FLineNumber);
   Inc(FCursor);
 end;
end;

end.


 
Игорь Шевченко ©   (2010-08-19 18:14) [8]

unit Scanner;

interface
uses
 SysUtils, SourceReader;

type
 TLexemeKind = (lxkUnknown, lxkEof, lxkSeparator, lxkKeyword, lxkIdentifier,
   lxkNumber, lxkString, lxkPunctuation, lxkSpecComment);

 TScanner = class
 private
   function IsKeyword (const S: string): Boolean;
   function IsPunctuationChar (C: Char): Boolean;
   function IsValidIdentifierChar (C: Char): Boolean;
   function IsWhite (C: Char): Boolean;
 public
   function GetLexeme (const Reader: TSourceReader;
     var LexemeKind: TLexemeKind; IncludeSeparators: Boolean = true): string;
   function LexemeKindToString (const LexemeKind: TLexemeKind): string;
 end;

implementation

{ TScanner }

function TScanner.GetLexeme(const Reader: TSourceReader;
 var LexemeKind: TLexemeKind; IncludeSeparators: Boolean): String;
var
 C: Char;
 SpecComment: Boolean;
label
 Rescan;
begin
 LexemeKind := lxkUnknown;
 Result := "";
 if Reader.Eof then begin
   LexemeKind := lxkEof;
   Exit;
 end;
Rescan:
 C := Reader.NextSourceCharEx (SpecComment);
 if C = #0 then //Заменa концa строки на пробел
   C := " ";
 if IsWhite(C) then
 begin
   if SpecComment then
   begin
     LexemeKind := lxkSpecComment;
     Exit;
   end;
   LexemeKind := lxkSeparator;
   if IncludeSeparators or Reader.Eof then
     Exit
   else
     goto Rescan;
 end;
 if C = """" then
 begin
   Result := C;
   repeat
     C := Reader.NextSourceChar;
     Result := Result + C;
   until (C = """") or Reader.Eof;
   LexemeKind := lxkString;
   Exit;
 end;
 if IsPunctuationChar(C) then
 begin
   Result := C;
   LexemeKind := lxkPunctuation;
   Exit;
 end;
 Result := C;
 //Сначала числа
 if C in ["0".."9"] then
 begin
   while Reader.PreviewChar in ["0".."9"] do
     Result := Result + Reader.NextSourceChar;
   LexemeKind := lxkNumber;
   Exit;
 end;

 while IsValidIdentifierChar(Reader.PreviewChar) do
   Result := Result + Reader.NextSourceChar;
 LexemeKind := lxkIdentifier;
 if IsKeyword(Result) then
   LexemeKind := lxkKeyword;
end;

function TScanner.IsKeyword(const S: String): Boolean;
const
 Keywords : array[0..95] of String = (
 "abstract", "and", "array", "as", "asm", "assembler", "begin",
 "boolean", "break", "byte", "case", "cdecl", "char", "class",
 "const", "constructor", "dec", "default", "destructor", "div",
 "do", "double", "downto", "dynamic", "else", "end",
 "end.", "except", "exit", "extended",
 "false", "finalization", "finally", "function", "for",
 "high", "if", "implementation", "in",
 "inc", "inherited", "initialization", "int64", "integer", "interface", "is",
 "longint",
 "low", "message", "mod", "nil", "not", "object",
 "of", "or", "overload", "override", "packed", "pchar", "pointer", "private",
 "procedure", "property", "protected", "public",
 "published", "pwidechar", "raise", "record", "reintroduce", "repeat", "result",
 "self", "set",
 "shl", "shortstring", "shr", "sizeof", "smallint", "stdcall", "string",
 "then", "threadvar",
 "to", "true", "try", "type",
 "unit", "until", "uses", "var", "variant",
 "virtual", "widestring", "with", "while" );
var
 I : Integer;
begin
 Result := false;
 for I:=Low(Keywords) to High(Keywords) do
   if SameText(Keywords[I], S) then begin
     Result := true;
     Break;
   end;
end;

function TScanner.IsPunctuationChar(C: Char): Boolean;
begin
 Result := C in ["(", ")", "{", "}", ";", ",", "[", "]", "=", ":", ".", "+",
                 "-", "*", "/", "<", ">", "#", "$", "^", "@", """"];
end;

function TScanner.IsValidIdentifierChar(C: Char): Boolean;
begin
 Result := not ((C = " ") or IsPunctuationChar(C) or (C = #0));
end;

function TScanner.IsWhite(C: Char): Boolean;
begin
 Result := C in [ #9," "];
end;

function TScanner.LexemeKindToString(
 const LexemeKind: TLexemeKind): String;
const
 LexemeKindNames: array[TLexemeKind] of String = (
   "Unkn", "Eof", "Sep", "Kwd", "Ident", "Numb", "Str", "Punct", "Spec"
 );
begin
 Result := LexemeKindNames[LexemeKind];
end;

end.


 
Игорь Шевченко ©   (2010-08-19 18:14) [9]

{
  Модуль: HSFileMapper

  Описание: Класс, обеспечиващий создание файла, проецируемого в память

  Автор: Игорь Шевченко

  Дата создания: 07.02.2003

  История изменений:
}
unit HsFileMapper;

interface
uses
 Windows;

type
 THSFileMapper = class
 private
   FReadOnly: Boolean;
   FFileHandle: THandle;
   FFileSize: DWORD;
   FMap: PChar;
   FFileName: string;
   function GetEndMap: PChar;
 public
   constructor Create (const AFileName: string; ReadOnly: Boolean = true);
   destructor  Destroy; override;
   procedure Unmap;
   property Map: PChar read FMap;
   property EndMap: PChar read GetEndMap;
   property FileSize: DWORD read FFileSize;
   property FileName: string read FFileName;
 end;

implementation
uses
 SysUtils;

{ THSFileMapper }

constructor THSFileMapper.Create(const AFileName: string; ReadOnly: Boolean);
var
 SizeHighPart: DWORD;
 FileMapping: THandle;
const
 FileAccessMode: array [Boolean] of DWORD = (GENERIC_READ or GENERIC_WRITE,
   GENERIC_READ);
 MappingAccessMode: array[Boolean] of DWORD = (PAGE_READWRITE,
   PAGE_READONLY);
 MapAccessMode: array[Boolean] of DWORD = (FILE_MAP_WRITE,
   FILE_MAP_READ);
begin
 FReadOnly := ReadOnly;
 FFileName := AFileName;
 FFileHandle := CreateFile (PChar(AFileName), FileAccessMode[ReadOnly],
   FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
   nil, OPEN_EXISTING, 0, 0);
 if FFileHandle = INVALID_HANDLE_VALUE then
   RaiseLastWin32Error;
 FFileSize := GetFileSize(FFileHandle, @SizeHighPart);
 FileMapping := CreateFileMapping (FFileHandle, nil,
   MappingAccessMode[ReadOnly], 0, 0, nil );
 if FileMapping = 0 then
   RaiseLastWin32Error;
 FMap := MapViewOfFile (FileMapping, MapAccessMode[Readonly], 0, 0, 0 );
 CloseHandle (FileMapping);
 if not Assigned(FMap) then
   RaiseLastWin32Error;
end;

destructor THSFileMapper.Destroy;
begin
 if Assigned(FMap) then
 begin
   if not FReadOnly then
     FlushViewOfFile(FMap, 0);
   UnmapViewOfFile (FMap);
 end;
 if FFileHandle <> INVALID_HANDLE_VALUE then
   CloseHandle (FFileHandle);
 inherited;
end;

function THSFileMapper.GetEndMap: PChar;
begin
 Result := FMap + FFileSize;
end;

procedure THSFileMapper.Unmap;
begin
 if Assigned(FMap) then
 begin
   if not FReadOnly then
     FlushViewOfFile(FMap, 0);
   UnmapViewOfFile (FMap);
 end;
 FMap := nil;
end;

end.


 
Sapersky   (2010-08-19 18:47) [10]

В стандартном Find in Files есть галочка Regular Expressions... хотя я так и не понял, как их использовать для поиска строк, чтобы искало два апострофа с чем-то между ними.


 
DVM ©   (2010-08-19 19:28) [11]


> Игорь Шевченко ©   (19.08.10 18:14) [8]

в  Keywords : array[0..95] of String

по моему не все зарезервированные слова


 
Игорь Шевченко ©   (2010-08-19 20:24) [12]


> по моему не все зарезервированные слова


совсем не все. так это и писалось давно.


 
DVM ©   (2010-08-19 20:52) [13]


> Игорь Шевченко ©   (19.08.10 20:24) [12]


> так это и писалось давно.

Из очень давно зарезерверованных слов там нету "label" и "out".


 
Игорь Шевченко ©   (2010-08-19 22:13) [14]

DVM ©   (19.08.10 20:52) [13]

Вот label даже не вспомнилось, представь! И goto нету среди зарезервированных :)

Писалось под свои нужды, ограничений нет, хочется, можно поправить как угодно.


 
DVM ©   (2010-08-19 22:30) [15]


> Игорь Шевченко ©   (19.08.10 22:13) [14]


> Вот label даже не вспомнилось, представь! И goto нету среди
> зарезервированных :)

Зато в коде выше и то и другое имеется :)


 
Игорь Шевченко ©   (2010-08-19 23:13) [16]

DVM ©   (19.08.10 22:30) [15]

Уел :)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2010.11.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
2-1284117218
Avil
2010-09-10 15:13
2010.11.28
Изменение позиции формы одной командой


15-1282339535
старый ламер
2010-08-21 01:25
2010.11.28
Как быстрее влиться в проект.


15-1280817234
Медвежонок Пятачок
2010-08-03 10:33
2010.11.28
Сомалийское пирацтво. Все очень просто.


2-1283856983
Matveih1
2010-09-07 14:56
2010.11.28
Локальная сортировка в DBGridEh


2-1283518156
NoSilence
2010-09-03 16:49
2010.11.28
Всегда поверх остальных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский