Szövegkezelés probléma

Sziasztok! Annyi lenne a problémám hogy
else
begin
if betu >='a' and betu <='z' then valtozo:=valtozo+betu;
if betu = '>' or betu = '<' or betu='=' then relacio:= relacio+betu;

if betu=':' then kettopont:=betu;
if betu='+' or betu='-' or betu='*' or betu='/' then muveletjel:=betu; end;

Operator not applicable to this operand type hiba üzenetet ir ki minden egyes sorban és nem tudom mi lehet a probléma.
Szerintetek mi lehet a probléma?

Köszönöm

Köszönöm szépen a segítséget!

Szervusz! if (betu >='a')

Szervusz!

if (betu >='a') and (betu <='z') then valtozo:=valtozo+betu;

A zárójel fontos mert az if igazságértéket vizsgál, és ilyenkor a zárojel közötti értékekre vonatkozik az and, hasonlóan a matematikai műveleti sorrendhez. Ha nincs zárójel akkor nem lehet igazságértéket rendelni a kifejezéshez.

Üdv.: Totó

Köszönöm

Köszönöm szépen a választ közben rájöttem én is. Lenne még egy kérdésem hogy delphiben hogy lehet azt megcsinálni hogy a szöveget szóközönként fel darabojuk?

valami hasonló módon is

Valami hasonló módon is lehet:

var stomb:array of string;

function darabolo(szoveg:string):integer;
var s:string; szam:integer;
begin
szam:=0; //a számláló nullára állítva
while pos(' ',szoveg)>0 do //addig hajtódik végre amíg van szóköz
// '' között szóköz van
begin
s:=copy(szoveg,0,pos(' ',szoveg));//az s-be a szóközig
// '' között szóköz van
delete(szoveg,0,pos(' ',szoveg));//törlés a szóközig
// '' között szóköz van
szam:=szam+1;//számláló növelése
setlength(stomb,szam+1);//a dinamikus tömb növelése
stomb[szam]:=s;//a szó tárolása a tömbben
end;
szam:=szam+1;//számláló növelése
setlength(stomb,szam+1);//a dinamikus tömb növelése
stomb[szam]:=szoveg;//a maradék szó tárolása a tömbben
result:=szam;//a szavak száma a szövegben
end;
A szavak visszakereshetőek a tömből, pl.:
showmessage(stomb[1]);
vagy
for i:=1 to darabolo(szoveg)
do
showmessage(stomb[i]);
Üdv.: Totó

köszönöm

köszönöm a segítséget de egy új problémába akadtam, ami az lenne hogy kell csinálnom egy elemzőt
pl.: if xysx>=5 then xys:=sddfg+f
és a progi kirja hogy if-re hogy kulcsszo xysx-re hogy változo >= relácio és igy szép sorban na már most ott kezdödik a gond hogy nem tudom megirni mert ugy akartam hogy szokozönként felbontom és részeket elemzem de nem megy nekem.
Az lenne a kérdésem hogy ti tudtok valami módszert esetleg algoritmust amivel meg lehetne csinálni?

Szervusz! Bocsi, de nem

Szervusz!
Bocsi, de nem értem!
Ha lehet írd le mi az pontosan amit meg kell csinálni!
És egy részlet abból amit eddig írtál sem ártana.

Üdv.: Totó

Sya

Nos amit kell csinálni a programnak lényegében egy lexikális elemző ami azt csinálja hogy egy program sort végig elemez. Felismeri a kulcsszavakat(for,if then,to,do), változókat, értékadó utasításokat(:=), relációkat(<>,<,>,<=,>=,=), kommenteket(// /**/), számokat és végül a műveleti jeleket(*,-,/,+,%)
Itt lesz a program részlet amit csináltam:(lanc az maga a program sor)
if (lanc[1]='i') and (lanc[2]='f') then
begin
// label1.Caption:='';
for i:=3 to8 do
begin
case lanc[i] of
{itt az abc beüti vannak felsorolva}: label1.Caption:= Label1.Caption+'';
'<','>': label1.Caption:= label1.Caption+'';
':': label1.Caption:= label1.Caption+'<Értékadó>';
'=': label1.Caption:= label1.Caption+' ';
'1','2','3','4','5','6','7','8','9','0': label1.Caption:= label1.Caption+'';
'+','-','*','/' : label1.Caption:=label1.Caption+'';
else if ((lanc[8]='t') or (lanc[9]='t')) and ((lanc[10]='h') or (lanc[10]='e')) then label1.Caption:= label1.caption+'';
end;

end;
if (lanc[12]='n')or(lanc[13]='n') then j:=13
else j:=12;

for i:=j to 20 do
begin
case lanc[i] of
'a','s','x','y','c','v','b','n','m','f','g','h','j','k','l','w','e','r','t','z','u','i','o','p': label1.Caption:= Label1.Caption+'';
'<','>': label1.Caption:= label1.Caption+'';
':': label1.Caption:= label1.Caption+'<Értékadó>';
'=': label1.Caption:= label1.Caption+' ';
'1','2','3','4','5','6','7','8','9','0': label1.Caption:= label1.Caption+'';
'+','-','*','/' : label1.Caption:=label1.Caption+'';
end;
end;

end;
A működése az hogy megnézi az első két betűt és ha az if akkor elindul a program és végig megy ilyen fapados módon, a fapados úgy értem hogy kiszámoltam minek hol kell szerepelni a sorban, a gond csak az hogy ha a változó neve pl.:alma akkor búról minden mivel több karakteres a név.
Lényegében azt kellene megcsinálnom hogy megy sorba és szépen olvasgatja hogy ez kulcsszó, változo, felismeri éppen hogy amit olvas az mi. Csak ahogy csűröm csavarom sose akar működni nekem a dolog.

Szervusz! Sokkal

Szervusz!
Sokkal egyszerűbbet ajánlok:
A kulcsszavak szóközökkel vannak elválasztva
Tehát addig jó, hogy szétbontod szavakra és ezek végén marad a szóköz.
Ezek után csak meg kell vizsgálni hogy a szó egyezik-e valamelyik kulcsszóval+szóközzel.
for b:=szavakszama do
For i:=kulcsszavakszama do if szotomb[b]=kulcsszotomb[i] then szotipus[b]:=kulcsszo else
szotipus[b]:=kifejezes;
Ezek után már csak a kifejezéseket kell megvizsgálni
for i:=szavakszama
if szotipus[i]=kifejezes then
//és itt meg kell keresni a kifejezésben lévő operátorokat és szét kell //bontani
//például alma:=korte; akifejezésben van két operátor szétbontva //szotomb[x]:= 'alma'; szotomb[x+1]:=':='; szotomb[x+2]:='korte'; //szotomb[x+3]:=';'
A gyakorlatban a pos() függvénnyel végig kell zongorázni, hogy az összes lehetséges operátor közül van-e benne és ott szétválasztani a kifejezést.
Egyúttal meg is lehet jelölni operátorként, hasonlóan a parancsokhoz.
A maradék pedig változó szám és string Ha a szám különválik a bontás után akkor az szám, ha nem akkor vagy a változó neve, vagy a string része. A stringet pedig a ' jel figyelésével lehet elkülöníteni. De most jut eszembe ezt kell legelőször mert a stringben lehet szóköz is. Illetve még előbb figyelni kell a // jelre is.

példa:
Legyen kétféle lehetséges kulcsszó háromféle operátor
if then
= := ;

Ekkor az elemezni kívánt sor:
szoveg:='if valami=akarmi then valami:=masvalami;';

while pos(' ',szoveg)>0 do
begin
szoszam:=szaszam+1;
setlength(szotomb,szoszam+1);
szotomb[szoszam]:=copy(szoveg,0,pos('',szoveg));
delete(szoveg,0,pos('',szoveg));
end;
szoszam:=szaszam+1;
setlength(szotomb,szoszam+1);
szotomb[szoszam]:=szoveg;
for b:=1 to szoszam do
for i:=1 to 2 do
if szotomb[b]=(kulcsszotomb[i]) and (szotipus[b]<>kulcsszo) then szotipus[b]:= kulcsszo else szotipus[b]:=kifejezes;
for b:=1 to szavakszama do
if szotipus[b]=kifejezes then
while pos(' ',szotomb[b])>0 do
begin
szoszam:=szaszam+1;
setlength(kiftomb,szoszam+1);
kiftomb[szoszam]:=copy(szotomb[b],0,pos('',szoveg));
delete(szotomb[b],0,pos('',szotomb[b]));
end;
szoszam:=szaszam+1;
setlength(kiftomb,szoszam+1);
kiftomb[szoszam]:=szotomb[b];
for b:=1 to szoszam do
for i:=1 to 2 do
if (kiftomb[b]=operator[i]) and (szotipus[b]<>operator) then szotipus[b]:= operator else szotipus[b]:=valtozo;

Persze több kulcsszóval operátorral értelemszerűen lehet bővíteni.
Azonkívül lehet benne hiba mert mos éppen újratelepítettem a gépem és még nincs fenn a Delphi lepróbálni.

Üdv.: Totó

Sya

Sya be másoltam kijavítgattam a hibákat de valamiért nem működik a dolog. Meg ha jól látom akkor a szótípus nevű tömben tárolod hogy mit talált éppen? Tegnap én is valami ilyesmire gondoltam de nem tudtam megvalósítani.

Szervusz! próbáld ki

Szervusz!
Sajnos nem tudom leellenőrizni, még nincs újratelepítve a Delphi.
Addig ezt próbáld ki hátha jó valamire!

s:=richedit1.lines[1];//s-be az 1-es sor
i:=0;//feldolgozott rész hossza
while pos(' if ',s)>0 do
begin
i:=i+pos(' if ',s)+Length(' if ');
delete(s,0,i);//a feldolgozott rész törlése
RichEdit1.SelStart:=i-Length(' if '); //A kijelölés kezdete
RichEdit1.SelLength:=Length(' if '); //A kijelölés hossza

RichEdit1.SelAttributes.Color:=clRed;//Szöveg formázása
end;
Ezzel az if szót vörösre változtatod az 1-es sorban (a richedit 0-ával kezdi a sorok számozását)
Az összes kulcsszóra elvégezve a kulcsszavakat vörösre változtatja.
Azért kell szóköz az if elé és mögé, hogy a változó nevekkel ne keveredjenek.
pl: ificsapat nevű változó is lehetséges.
A < > = : ; + - * jelekre nem kell szóköz és lehet más szín.
A számokat is gond nélkül lehet hasonló módon
Legutoljára a stringet pedig így
s:=richedit1.lines[1];//s-be az 1-es sor
i:=0;//feldolgozott rész hossza
while pos('''',s)>0 do
begin
k:=pos('''',s)
i:=i+pos('''',s);
delete(s,0,pos('''',s));
i:=i+pos('''',s);
delete(s,0,pos('''',s));//a feldolgozott rész törlése
RichEdit1.SelStart:=k; //A kijelölés kezdete
RichEdit1.SelLength:=i; //A kijelölés hossza

RichEdit1.SelAttributes.Color:=clgreen; //Szöveg formázása
end;

Üdv.: Totó

Könyvajánló

Programozzunk Turbo Delphi Rendszerben