Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comparar Array con datos en Memo (https://www.clubdelphi.com/foros/showthread.php?t=85617)

Mantixd 07-04-2014 20:52:47

Comparar Array con datos en Memo
 
Buenas, lo que pasa es que quiero hacer un tipo Analizador Lexico digamos que en ensamblador, tengo un Arreglo donde tengo los registros y quiero que al escribir codigo fuente en un Memo y presionar un boton buscar me compare los datos del arreglo con los escritos en el Memo y si encuentra algunos me los ponga en un Memo2 o en un RichEdit, soy estudiante y aun estoy aprendiendo y pues disculpen mis horrores espero y me puedan ayudar saludos.

Código Delphi [-]
 meses: array[1..31] of string = ('AX','BX','CX','DX','AH','AL',
                                   'BH','BL','BP','CH','CL','CS',
                                    'CX','DH','DL','DI','DS',
                                    'EAX','EBP','EBX','ECX',
                                      'EDI','EDX','EIP','ES',
                                      'ESIFE','GS','IP','SI','SP','SS');

procedure TForm1.Button1Click(Sender: TObject);
var
  N,x:integer;
  a, sEtiqueta: String;

  Z : Integer;
Texto : string;

  I,J,Long,P,Posic:Integer;
  Reservada,Aux,Linea,Palabra:String;

   begin
       for x := Low(meses) to High(meses) do
   if Memo1.Text=meses[x] then  begin
   RichEdit1.Text:= Memo1.Text;

   end;
         end;

ecfisa 07-04-2014 23:12:56

Hola Mantixd.

Si no te comprendí mal, sería:
Código Delphi [-]
const
  REGS: array[1..31] of string = (
    ' AX',' BX',' CX',' DX',' AH',' AL',' BH',' BL',' BP',' CH',' CL',' CS',
    ' CX',' DH',' DL',' DI',' DS',' EAX',' EBP',' EBX',' ECX',' EDI',' EDX',
    ' EIP',' ES',' ESIFE',' GS',' IP',' SI',' SP',' SS');

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: Integer;
begin
  Memo2.Lines.Clear;
  for i:= 0 to Memo1.Lines.Count-1 do
    for j:= Low(REGS) to High(REGS) do
      if AnsiPos(REGS[j], UpperCase(Memo1.Lines[i])) <> 0 then
        Memo2.Lines.Add(REGS[j]+' -> '+Memo1.Lines[i]);
end;
Agregué un espacio detras de cada nombre de registro y segmento declarado en el arreglo constante, por que sólamente serán nombres de registros si estan precedidos de un espacio. Es decir, podrían estar seguidos de una coma (instrucción), punto y coma (comentario), de dos puntos (dirección relativa), ..., pero nunca por otra cosa que un espacio o sería otra cosa que los mnemónicos buscados.

Saludos .)

nlsgarcia 07-04-2014 23:37:25

Mantixd,

Cita:

Empezado por Mantixd
...quiero hacer un tipo Analizador Léxico digamos que en ensamblador, tengo un Arreglo donde tengo los registros y quiero que al escribir código fuente en un Memo y presionar un botón buscar me compare los datos del arreglo con los escritos en el Memo...

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ListBox1: TListBox;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  RegAsm : Array[1..30] of string = ('AX','BX','CX','DX','AH','AL',
                                     'BH','BL','BP','CH','CL','CS',
                                     'DH','DL','DI','DS', 'GS', 'IP',
                                     'SI','SP','SS', 'ES',
                                     'EAX','EBP','EBX','ECX',
                                     'EDI','EDX','EIP','ESIFE');

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Selecciona los Registros de Assembler de un TMemo con base en un Arreglo
procedure TForm1.Button1Click(Sender: TObject);
var
   SL: TStringList;
   i, j, k : Integer;
   Token : String;
   AuxStr : String;

begin

   SL := TStringList.Create;

   ListBox1.Clear;

   for i := 0 to Memo1.Lines.Count - 1 do
   begin

      AuxStr := Memo1.Lines[i];

      for j := 1 to Length(AuxStr) do
      begin
         if (AuxStr[j] <> ' ') and (AuxStr[j] <> ',') then
            Token := Token + AuxStr[j]
         else
         begin
            SL.Add(Token);
            Token := EmptyStr;
         end
      end;

      SL.Add(Token);
      Token := EmptyStr;

      for j := 0 to SL.Count - 1 do
         for k := Low(RegAsm) to High(RegAsm) do
            if UpperCase(SL[j]) = UpperCase(RegAsm[k]) then
               ListBox1.Items.Add(UpperCase(RegAsm[k]));

      SL.Clear;

   end;

   SL.Free;

end;

end.
El código anterior, analiza el código fuente de un programa en Assembler como input en un TMemo en base a un arreglo de registros en Assembler y si hay ocurrencias coloca dichos registros en un TListBox, como se muestra en la siguiente imagen:



Espero sea útil :)

Nelson.

Mantixd 08-04-2014 00:20:58

Gracias!
 
Muchas gracias por sus respuestas creo que al expresarme no me di a entender muy bien pero fueron de gran ayuda muchisimas gracias :D nlsgarcia tu codigo era exactamente lo que buscaba muchisimas gracias y ecfisa creo que no me di a entender muy bien por eso una disculpa pero igual muchisimas gracias por responder tan rapido :)


La franja horaria es GMT +2. Ahora son las 12:10:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi