Hollosi Information eXchange /HIX/
HIX CODER 240
Copyright (C) HIX
1998-10-04
Új cikk beküldése (a cikk tartalma az író felelőssége)
Megrendelés Lemondás
1 kif. kiertekelo (mind)  94 sor     (cikkei)
2 Re: Matematikai kifejezes feldolgozo es egyszerusito (mind)  28 sor     (cikkei)

+ - kif. kiertekelo (mind) VÁLASZ  Feladó: (cikkei)

Hali!

jo reg nem irtam, ennek egyik oka hogy a #207-es az utolso HIX CODER
amit megkaptam, azota nem jottek, kiveve ezt a #239-est ami ma jott :)
nem igazan muxik ez a hix, vagy csak engem nem szeret??? na mind1

> Felado :  [Hungary]
> Temakor: Re: Matematikai kifejezes feldolgozo es egyszerusito ( 131 sor )
> 
> 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? :))
En nagyon orulnek neki! :)  de tenyleg.

En is a napokban fejlesztek kif. kiertekelot, a BAssPasC 3.0-hoz,
a kulonbseg annyi hogy nekem nem a kif. erteket kell kiszamolnom
hanem asm forrast kell generalni ami majd futaskor ksizamolja!
(ha csak kiszamolni kene, az megy, az nem olyan nehez)

A modszer amit en alkalmazok most:
a kiertekelom 2 tagu kifejezesekre general kodot (az FPU mukodosesebol
kifolyolag...), igy mindig keres egy pontot a kifejezesben ahol
ketevaghatja, es ha mar tovabb nem darabolhato akkor az vagy valtozo
vagy konstans. (vagy hiba :))

adott egy kifejezes, pl:  (x*y)-3+(z*z)
ennek a kierekelese:
kiertekelo(kifejezes){
  Kette lehet vagni?
   - nem ->
     - (valami) -> valami  es kezdi elolrol
     - valtozo vagy konstans -> visszateres
     - egyeb -> hibauzenet
   - igen ->
     1. p1=kiertekelo('(z*z)')
     2. p2=kiertekelo('(x*y)-3')
     3. p1 es p2 tipusa, erteke alapjan general assembly forrast
        majd visszater az eredmennyel
    (ez persze rekurziv, 1. es 2. pontnal rekurzivan hivja magat mindaddig
     amig kette tudja vagni)
}
A "kettevagasnal" eloszor + jelet keres, aztan -,*,/ stb. a prioritasnak
megfeleloen.

A visszateresnel pedig a kovetekzo tipusok lehetnek:
  - kiszamolta (p1 es p2 is konstans volt), visszaadja az eredmenyt
  - generalt kodot ami kiszamolta, az eredmeny ST-ben (FPU regiszterben)
  - egy memoriavaltozo volt, visszaadja a nevet
Utana p1 es p2 tipusanak megfeleloen generalja az asm forrast:
  1. ha p1 es p2 is konstans akkor kiszamolja es visszater az eredmennyel
  2. ha p1 vagy p2 konstans akkor beteszi egy memoriacimre es
     atirja a tipusat memoriavaltozora
  3. ha p1 es p2 is memoriavaltozo akkor az egyiket betolti az FPU-ba
     (FLD p1)
  4. a maradek esetekre pedig mar vannak FPU utasitasok:
     mem,ST    FADD mem,FSUBR mem,FMUL mem,FDIVR mem
     ST,mem    FADD mem,FSUB mem,FMUL mem,FDIV mem
     ST,ST     FADDP ST(1),ST / FSUBP ST(1),ST ...

Ez nagyon szepen mukodik ha csak valtozok vannak, es az esetleges
konstansok kozti muveletek be vannak zarojelezve, pl: 'x+(3+5)'
kulonben viszont eleg szar kodot csinal, pl:
  kifejezes='3+x+5'
  leforditva:
    FLD Const_3
    FADD x
    FADD Const_5
pedig igy is ugyanazt az eredmenyt adna es egyszerubb (gyorsabb):
    FLD Const_8
    FADD x

Ezt lehet tovabb bonyolitani is, pl: '(x+y+z)-(x-y+z)'
mert ez ugye 2*y-al egyenlo...

Na erre kene valami jol bevalt, relative egyszeru modszer, amivel
ilyen egyszerusiteseket lehet elvegezni. Van ilyen???

A'rpi/ESP-team

ps: Egyebkent ez a modszer mindig jol mukodik csak konstansokat
    tartalmazo kifejezesekre, ha csak kiszamolni kell...
    (ilyenkor a visszateresi ertek tipusa mindig konstans)

ps2: > X11R6 alatt widgeteket, vagy gadgeteket erdemesebb hasznalni?
     Mi az a gadget? errol most hallok eloszor...

> -----------------------------------------------------------------
 mailto:        http://banki1.banki.hu/~arpi
 mailto:    http://espteam.abacus.mad.hu
--------------------- Phone: +36-1-338-1405 ---------------------
WinErr: 00F Unexplained error - Please tell us how this happened.
+ - Re: Matematikai kifejezes feldolgozo es egyszerusito (mind) VÁLASZ  Feladó: (cikkei)

Hello,

Amit ajanlanek a kodolas helyett az egy yacc tipusu program
hasznalata. Ezek eseteben a nyelvtani torvenyeket kell
specifikalni es ebbol a program C forraskodot general.
(Ilyen progi van minden platform ala)

A kozhiedlemmel ellentetben, hasznalatuk aranylag egyszeru.
(Egy kifejezes kiszamolot meg majdnem trivialis irni veluk,
jobbara peldakent mutatnak be egy-egy effele nyelvtan 
specifikaciot.

lasd: http://www.cl.cam.ac.uk/texinfodoc/bison_toc.html)
 
Az igazi elonyuk igazabol az, hogy nagyon konnyu uj muveleteket
bevezetni kb egy ket sorral megoldhato, mig ha kodolod, sokkal tobb 
lehoseged van arra hogy melletrafalj. 

cheers,

Veszpe'nyi Zebulon.

ps. egy kisse tulbonyolitott yacc nyelvtanfile-t meg magat a yacc-ot is
DOS ala letolheted innen is:

http://www.nd.edu/~ialbert/files.htm 

(ez ciklusokat is tud meg felteteles elagazast is)

AGYKONTROLL ALLAT AUTO AZSIA BUDAPEST CODER DOSZ FELVIDEK FILM FILOZOFIA FORUM GURU HANG HIPHOP HIRDETES HIRMONDO HIXDVD HUDOM HUNGARY JATEK KEP KONYHA KONYV KORNYESZ KUKKER KULTURA LINUX MAGELLAN MAHAL MOBIL MOKA MOZAIK NARANCS NARANCS1 NY NYELV OTTHON OTTHONKA PARA RANDI REJTVENY SCM SPORT SZABAD SZALON TANC TIPP TUDOMANY UK UTAZAS UTLEVEL VITA WEBMESTER WINDOWS