Ver la Versión Completa : Comparar Array con datos en Memo
Mantixd
07-04-2014, 20:52:47
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.
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:
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,
...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:
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;
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, [I]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:
http://i42.photobucket.com/albums/e305/nlsgarcia/Assembler_zpsd5f28082.jpg
Espero sea útil :)
Nelson.
Mantixd
08-04-2014, 00:20:58
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 :)
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.