Ver Mensaje Individual
  #1  
Antiguo 14-11-2005
bustio bustio is offline
Miembro
 
Registrado: oct 2003
Posts: 231
Reputación: 21
bustio Va por buen camino
Contar Lineas de Codigo Logicas y Fisicas

Hola a la comunidad:

Estoy tratantdo de hacer un programa que cuente las Lineas de Codigo(Lines Of Code) de mis aplicaciones. Para ello disenne un Estandar para Contar Lineas de Codigo; y basandome en el es qeu hago el conteo de mis fuentes. Pero mis errores vienen a raiz de que no veo claro el algoritmo que tengo que seguir para hacer el conteo.
Lo primero que hice fue eliminar la indentacion de la Unit que le entro al programa. Una vez hecho esto, voy linea por linea(almacene la Unit en un componente SynEdit, que es iden al memo, lo unico que hace el realce de la sintaxis.. por lo demas es lo mismo que el memo) analizando que los dos primeros caracteres sean '//', y si lo son pues los marco con el simbolo '*' y continuo. Una vez llegado al final de la Unit en el SynEdit los comentarios simples eliminados.
Luego, y mediante el mismo proceso elimino los espacios en blanco; marcandolos tambien con '*'. Despues recorreo el codigo para eliminar los comentarios '{......}'; que es un poco mas complejo. Aqui presento el segmento para que me lo critiquen:

Código Delphi [-]
procedure TLOCounter.DelMultipleComments;
var
  i, k:  Integer;
  Token: String;
  Line:  String;
  Trash: TTrashLine;//Clase para almacenar el numero de las lineas donde hay comentarios y el tipo de comentario que es.
begin
  TrimL;//Metodos de la clase TLOCounter que elimina los espacios en blanco a la derecha y a la izquierda de las lineas del codigo que se analiza.
  TrimR;

  for i := 0 to LinesOfCode.Count - 1 do
  begin
    Line := LinesOfCode.Strings[i];
    Token := Copy(Line,1,1);//token es el primer caracter de la linea a procesar.
    If Token = '{' then
    begin
      Trash := TTrashLine.Create;
      Trash.LineNumber := i;
      Trash.TrashType := 'MC';//MC = MultiComentario
      FTrashList.Add(Trash);

      if Line[length(Line)] <> '}' then
      begin
        k := i;
        repeat
          inc(k);
          Line := LinesOfCode.Strings[k];
          Token := Copy(Line,length(Line),1);
          if Token <> '}' then
          begin
            Trash := TTrashLine.Create;
            Trash.LineNumber := k;
            Trash.TrashType := 'MC';
            FTrashList.Add(Trash);//Lista con las lineas que no me interesa analizar.
          end;
        until (Token = '}') or (k = LinesOfCode.Count - 1);
        Trash := TTrashLine.Create;
        Trash.LineNumber := k;
        Trash.TrashType := 'MC';
        FTrashList.Add(Trash);
      end;
    end;
  end;
end;
.

Ahhh!!! y una duda.. por que cuando pongo FTrash.Destroy al terminar de trabajar con el me da error? Lo qeu sucede es que almacena en la lista cualquier valor y no es el que yo almaceno.

COn todo esto hecho, solo me quedara en el SynEdit las lineas que me interesa contar; las demas estaran marcadas con '*'. Y es ahora que viene la parte mas dura... hay Lineas De Codigo Logicas y Lineas de Codigo Fisicas. A que llamo Lineas De Codigo Logicas y Fisicas? Fisicas son todas las lineas... pero logicas son las que encierran una accion completa.

Por Ejemplo:

1 TClase(MiObjeto.MiFuncion[6].Propiedad1).Elemento[3].Text :=
2 'VALOR STRING';

En este caso, 1 y 2 son Lineas De Codigo Fisicas(pues existen), pero solo hay 1 Linea De Codigo Logica, que sera 1 + 2(la 1 o la 2 por separados no son Lineas de Codigo Logicas) ya que ambas encierran una orden completa. Este es solo un ejemplo hipotetico pues en la realidad hay muchas variantes de Lineas de Codigo Logicas.
Ahora la pregunta es... como hago un algoritmo para determinar si dado un String constituye una Linea de Codigo Logica o no? Y en caso de que no lo sea.. como puedo obtener la linea de codigo logica completa?

He pensado en esa solucion desde hace tiempo y no logro armar el algoritmo. Todo lo que se me ocurre da algun error por alguna parte y es mas tarbajo ponerle el parche que escribir un codigo eficiente de verdad.

Agradezco desde ya cualquier ayuda o sugerencia.
__________________
Muchas Gracias...
Responder Con Cita