Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Guardar datos de renglón (https://www.clubdelphi.com/foros/showthread.php?t=85772)

nlsgarcia 03-05-2014 16:46:32

Pedron,

Cita:

Empezado por Pedron
...no le he cambiado ningún dato a tu código que me mandaste y pues al momento de poner AX me da ese error (List Index Out of Bounds)...

Es correcto ^\||/ , es un error de frontera.

Revisa esta código:
Código Delphi [-]
 procedure TForm1.Button3Click(Sender: TObject);
 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
  SL: TStringList;
    i, j, k : Integer;
    Token : String;
    AuxStr : String;
 
 begin
 
   SL := TStringList.Create;
 
   Memo2.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 := SL.Count - 1 downto 0 do
          for k := High(RegAsm) downto Low(RegAsm) do
             if SL[j] = RegAsm[k] then
             begin
                SL.Delete(j);
                Break;
             end;   
 
       for j := 0 to SL.Count - 1 do
          Token := Token + SL[j] + ' ';
 
       Memo2.Lines.Add(Token);
       Token := EmptyStr;
 
       SL.Clear;
 
    end;
 
    SL.Free;
 
 end;
El código anterior en Delphi 7 bajo Windows 7 Professional x32, es la versión 2 del código propuesto en el Msg #16 que resuelve errores de frontera, funcionando correctamente según lo esperado con datos de prueba como se puede ver en la siguiente imagen:



Espero sea útil :)

Nelson.

Pedron 03-05-2014 23:13:59

Clarooo que me fue util ahora si ya salio muchas gracias nlsgarcia :D

Ahora una ultima cosa ya para dejar esto por la paz habra una forma en la que pueda comparar varios arreglos a la vez con ese mismo codigo comparar 2 o mas arreglos y los datos que sean diferentes a esos arreglos pues mandarlos al memo2 no se si me de a entender jeje

si por ejemplo tengo 2 arreglos

Código Delphi [-]
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');


 OpAsm : Array[1..36] of string = ('AND','BYTE','COMMENT','CON','DUP',
                                   'EQ','FAR','GE','GT','HIGH','LE',
                                   'LENGTH','LINE','LOW','LT','MASK',
                                   'MOD','NE','NEAR','NOT','NOTHING',
                                   'OFFSET','OR','PTR','SEG','SHL','SHORT',
                                   'SHR','SIZE','STACK','THIS','TYPE',
                                   'WHILE','WIDTH','WORD','XOR');

y pues que al poner este texto en el memo1

Código:

AX AND HOLA
solo me mande

Código:

HOLA
al memo2


saludos y muchas gracias!

nlsgarcia 04-05-2014 00:26:18

Pedron,

Cita:

Empezado por Pedron
...habrá una forma en la que pueda comparar varios arreglos a la vez con ese mismo código comparar 2 o mas arreglos y los datos que sean diferentes a esos arreglos pues mandarlos al Memo2...

Si es posible :rolleyes:

Pregunto: ¿Cual es la finalidad de este trabajo? :confused:

Nelson.

Pedron 04-05-2014 00:38:03

1 Archivos Adjunto(s)
Es un analizador lexico y tengo que comprobar los errores lexicos de un lenguaje y en este caso lo estoy haciendo en lenguaje ensamblador.

el objetivo de tanta comparacion es hacer que me compare todos los arreglos osea todos los componentes del lenguaje ensamblador que esten en un memo1 y pues los valla separando por diferentes secciones mira te muestro una imagen para mejor entendimiento



y pues la separacion de datos ya la tengo lo que no puedo hacer es lo de los errores lexicos que te digo por ejemplo que si en vez de AX
escribo 'XA' en ninguna arreglo que yo tengo viene esa palabra 'XA' por lo tanto quiero que me la mande a la seccion de errores lexicos
pero tengo otro problema si yo creo una VARIABLE esas tampoco vienen en ningun arreglo porque esas tu les pones el nombre que gustes por lo tanto esas tambien las marcaria como error.

y pues lo que intento hacer al comparar todos los arreglos a la vez es eso mismo hacer que busque en el memoo1 y encuentre las palabras que no vienen en los arreglos y las mande al memo2 que serian los errores lexicos.

no se si me de a entender jeje

nlsgarcia 04-05-2014 01:00:53

Pedron,

Cita:

Empezado por Pedron
...Es un analizador léxico...en lenguaje ensamblador...

Eso lo entiendo :rolleyes: , la pregunta se refiere a si es un trabajo de universidad (Que universidad, Que cátedra, Que país) o de otro tipo.

Nota: La imagen es demasiado pequeña, ¿Puedes mejorarla? :confused:

Nelson.

Pedron 04-05-2014 01:24:14

1 Archivos Adjunto(s)
Es un trabajo universitario soy de mexico estuido ing. en sistemas computacionales en el Instituto Tecnologico de Tepic para la materia de Programacion de Sistemas y claro aqui esta la imagen un poco mas grande


nlsgarcia 04-05-2014 02:05:36

Pedron,

Cita:

Empezado por Pedron
...habrá una forma en la que pueda comparar varios arreglos a la vez con ese mismo código comparar 2 o mas arreglos y los datos que sean diferentes a esos arreglos pues mandarlos al Memo2...

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;
    Memo2: TMemo;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const

  A1: Array[1..74] of String =  ('db','ALIGN','.ALPHA','ASSUME','.CODE','COMM','COMMENT',
                                 '.CONST','.CREF','.DATA','DB','DD','DF','DOSSEG','DQ',
                                 'DT','DW','ELSE','END','ENDIF','ENDM','ENDP','ENDS','EQU',
                                 '.ERRnn','EVEN','EXITM','EXTRN','.FARDATA','.FARDATA?',
                                 'GROUP','IF','IF1','IF2','IFB','IFDEF','IFDIF','IFE','IFIDN',
                                 'IFNB','IFNDEF','INCLUDE','INCLUDELIB','IRP','IRPC','LABEL',
                                 '.LALL','.LFCOND','.LIST','LOCAL','MACRO','.MODEL','NAME',
                                 'ORG','OUT','PAGE','PROC','PUBLIC','PURGE','.RADIX','RECORD',
                                 'REPT','.SALL','SEGMENT','.SEQ','.SFCOND','.STACK','STRUC',
                                 'SUBTTL','.TFCOND','TITLE','.XALL','.XCREF','.XLIST');

  A2 : 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');

  A3 : Array[1..36] of String = ('AND','BYTE','COMMENT','CON','DUP',
                                 'EQ','FAR','GE','GT','HIGH','LE',
                                 'LENGTH','LINE','LOW','LT','MASK',
                                 'MOD','NE','NEAR','NOT','NOTHING',
                                 'OFFSET','OR','PTR','SEG','SHL','SHORT',
                                 'SHR','SIZE','STACK','THIS','TYPE',
                                 'WHILE','WIDTH','WORD','XOR');

var
  Form1: TForm1;

implementation

{$R *.dfm}

function SelectElement(A1, A2, A3 : Array of String; InputList, OutPutList : TStrings) : Boolean;
var
   TokenList : TStringList;
   SelectList : TStringList;
   i, j, k : Integer;
   Token : String;
   AuxStr : String;

begin

   try

      TokenList := TStringList.Create;
      SelectList := TStringList.Create;

      for i := Low(A1) to High(A1) do
         SelectList.Add(A1[i]);

      for i := Low(A2) to High(A2) do
         SelectList.Add(A2[i]);

      for i := Low(A3) to High(A3) do
         SelectList.Add(A3[i]);

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

         AuxStr := InputList.Strings[i];

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

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

         for j := TokenList.Count - 1 downto 0 do
            for k := SelectList.Count - 1 downto 0 do
               if TokenList[j] = SelectList.Strings[k] then
               begin
                  TokenList.Delete(j);
                  Break;
               end;

         for j := 0 to TokenList.Count - 1 do
            Token := Token + TokenList[j] + ' ';

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

         TokenList.Clear;

      end;

      TokenList.Free;
      SelectList.Free;

   except

      Result := False;
      Exit;

   end;
   
   Result := True;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
   Msg : String;
   
begin

   Memo2.Clear;

   if SelectElement(A1,A2,A3,Memo1.Lines, Memo2.Lines) then
   begin
      Msg := 'Análisis Sintáctico Concluido Satisfactoriamente';
      MessageDlg(Msg, mtInformation, [mbOK], 0)
   end
   else
   begin
      Msg := 'Error en Análisis Sintáctico';
      MessageDlg(Msg, mtError, [mbOK], 0)
   end

end;

end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, analiza por medio de una función de selección cada línea de TMemo1, las compara tipo Case Sensitive con un conjunto de arreglos y copia dicha línea a TMemo2 eliminando cualquier ocurrencia encontrada, como se muestra en la siguiente imagen:



Nota: En el ejemplo se utilizaron tres arreglos de comparación para análisis sintáctico, el código se puede expandir para n arreglos de comparación.

Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 22:33:32.

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