On 28 Sep 98 at 16:01, ifj Lajko Janos wrote:
> Keresem a fent emlitett forraskodot. Lehet, hogy neked van
> egy hasznalhato verziod. (Johet: C, Pascal ... legvegso esetben egy
asm-hez mit szolnal? :))
Szoval csak most irok, mert a subject-ben irt 'kifejezes
egyszerusito' visszariasztott... Kifejezes kiertekelot irtam mar,
egyszerusitot meg nem. Arra bohom nagy programok vannak sok-sok
penzert, Mathematika meg hasonlo neven.
Szoval a kiertekelest ugy szoktam csinalni, hogy egyresz van egy
GetToken nevu rutinom, ami az inputbol eloszedi a rakovetkezo
alapegyseget, ami lehet 1 vagy 2 jelbol allo irasjel (muveletjel),
vagy szamertek, vagy valtozonev. Van neki egy PutToken parja,
amivel egyetlen tokent (amit eppen most adott ki a GetToken)
vissza lehet pakolni, hogy a kov. GetToken megint ezt adja vissza.
Van ezen kivul tobb rutin, amik egy-egy precedenciaszintnek felelnek
meg. A legfelso dolgozza fel a legkisebb precedenciaju muveleteket,
stb. Valahogy igy:
(rogtonzok egy C forrast asm helyett... :)
int expr()
{
int eredm = exprAOX(); /* AND OR XOR precedenciajuak */
token tok = GetToken();
if (tok == TOK_ENDOFSTRING)
return eredm;
else {
/* valami rossz volt a kifejezesben, nem ert veget */
printf("...");
... stb.
}
}
int exprAOX()
{
/* AND OR XOR azonos precedenciaju (nalam), balrol-jobbra */
int reszeredmeny = exprNOT();
int vege = 0;
do {
token nexttok = GetToken();
switch (nexttok.type) {
case TOK_AND:
reszeredmeny &= exprNOT();
break;
case TOK_OR:
reszeredmeny |= exprNOT();
break;
case TOK_XOR:
reszeredmeny ^= exprNOT();
break;
default:
PutToken(tok); // visszarakjuk, a kov. GetToken szamara
vege = 1;
}
} while (vege == 0);
}
int exprNOT()
{
/* not */
token tok = GetToken();
if (tok == TOK_NOT)
return ~ exprLG();
else {
PutToken(tok);
return exprLG();
}
}
int exprLG()
{
/* hasonlitasok */
int reszeredmeny = exprAS();
int vege = 0;
do {
token nexttok = GetToken();
switch (nexttok.type) {
case TOK_LESS:
reszeredmeny = reszeredmeny < exprAS();
break;
case TOK_GREATER:
reszeredmeny = reszeredmeny > exprAS();
break;
case TOK_EQUAL:
reszeredmeny = reszeredmeny == exprAS();
break;
/* ide lehetne meg rakni tovabbiakat is (>=, <= != stb) */
default:
PutToken(tok); // visszarakjuk, a kov. GetToken szamara
vege = 1;
}
} while (vege == 0);
}
int exprAS()
{
/* osszeadas, kivonas */
int reszeredmeny = exprMD();
int vege = 0;
do {
token nexttok = GetToken();
switch (nexttok.type) {
case TOK_ADD:
reszeredmeny += exprMD();
break;
case TOK_SUB:
reszeredmeny -= exprMD();
break;
default:
PutToken(tok); // visszarakjuk, a kov. GetToken szamara
vege = 1;
}
} while (vege == 0);
}
... es igy lehetne folytatni a szorzas-osztas rutinjat, aztan a
zarojeles kifejezest, legalul pedig a konstans szamerteket meg a
valtozo erteket, stb. (A zarojeles kifejezes pl megnezi, hogy a
token a zarojel, es akkor meghivja az exprAOX()-et, es ellenorzi,
hogy a kovetkezo token a csuko zarojel legyen.)
Lehetne okosabbat meg gyorsabbat is csinalni, de ez legalabb konnyen
ertheto szerintem.
István
-- Istvan Marosi -- http://www.sch.bme.hu/~marosi --
-- Recosoft Ltd. -- mailto: --
|
> azert vannak ujak: valami egyszeru, karakteres jateknak
> illetve egy egyszeru lemezujsagnak kene a forraskodja.
> Lehetoleg Pascal, de a C is elmegy csak egy kicsit
> macerasabb, mert most momentan nincs forditom hozza
> probalgatni...
Egyszeru karakteres jatekok forraskodjait megtalalod az ncurses
forrasdisztribucioban.
ImRe
--
> --------------------------------------------------------------------------
... Our continuing mission: to seek out knowledge of C, to explore strange
unix commands, and to boldly code where no one has man page 4.
(lpg)
|
Hali Coderek!
X11R6 alatt widgeteket, vagy gadgeteket erdemesebb hasznalni? Azaz melyik
general kevesebb halozati terhelest?
Mielott RTFM valaszt irnal: eddig csak X11R5-oz valo konyvet talaltam.
Tehat specifikald az FM-et, amit R-elnem kellene.
ImRe
--
> --------------------------------------------------------------------------
... Our continuing mission: to seek out knowledge of C, to explore strange
unix commands, and to boldly code where no one has man page 4.
(lpg)
|