PDA

Ver la Versión Completa : Detectar errores lexicos en un memo


Mantixd
30-04-2014, 00:17:54
Buenas tardes, hace tiempo me ayudaron mucho en un problema que tuve al comparar arreglos con un memo, lo que pasa es que estoy haciendo un analizador lexico y pues estoy poniendo los identificadores las palabras reservadas etc. en arreglos y los estoy comparando con lo que esta escrito en el memo y pues si encuentra alguna palabra pues la pone en un listbox. pero en fin mi duda ahora es que si por ejemplo ( estoy haciendo el analizador para ensamblador ) si tengo "XA" en vez de "AX" me pinte esa palabra de rojo o me diga error pero aca va lo que se me complica.

En ensamblador estan las MACRO y pues a esas macro le tienes que poner un nombre el que tu quieras y pues por ejemplo si quiero poner una macro para crearla seria asi

Ejemplo MACRO

Donde "Ejemplo" es el nombre que le puse al macro, y pues mi idea para detectar errores seria comparar mis arreglos con el memo y si alguna palabra del memo no esta en alguno de los arreglos me la marque como error.
pero con este ejemplo que puse la palabra "Ejemplo" me la marcaria como error.

Supongo que lo que tengo que hacer es comparar renglon por renglon cada letra de cada palabra para ver donde esta el error o que si encuentra la palabra macro despues de una palabra desconocida que la tome como correcta, no se si me este dando a entender y pues espero y me puedan ayudar y pues si no me di a entender u ocupan que les muestre mi codigo para darse una idea mejor pues lo hago con mucho gusto de ante mano gracias :D

Mantixd
30-04-2014, 08:04:54
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');


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;

En este codigo se muestra el arreglo que les mencione y el memo y el listbox, sencillamente lo que hace este programa es que si yo pongo los registros de ensamblador como se muestra en la imagen y le doy al boton analizar comparara el memo con el arreglo y lo mostrara en el listbox llamado registros

imageshack.com/a/img845/5014/l2r0.png

A lo que me referia es cuando escribo mal algun registro o algo me me lo mande a otro listbox que se llame errores o algo asi pero... ¿Como saber cual es error y cual no?, mi idea es por ejemplo.

if UpperCase(SL[j]) <> UpperCase(SimAsm[k]) then

algo asi que si son diferentes los datos del memo que los del arreglo los marque como error pero no todos los datos diferentes al arreglo son errores por ejemplo si yo quiero hacer una variable me la detectaria como error, y pues esa es mi duda en si como validar ese tipo de errores, me he quebrado la cabeza pensando la vdd aun soy algo nuevo en esto, espero y me puedan ayudar y perdon por el spam.