Newsgroup: it.scienza.informatica
Titolo: calcolo di espressioni, come si fa?

ciao a tutto il ng,
qualcuno saprebbe dirmi gentilmente
dove posso reperire esempi o spiegazioni
(internet, dispense, libri, esempi in c o c++)
sul modo di implementare
un algoritmo
per calcolare un'espressione del tipo (ad es,):
c=a*(b+a)+a*2
inserendo in input i valori di a e b
ed ottenendo in uscita il valore di c
non mi interessa tutta la teoria
dei compilatori perchč devo
solo calcolare espressioni algebriche del
tipo sopra indicate
grazie
        frank
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 writes:
Frank> ciao a tutto il ng, qualcuno saprebbe dirmi gentilmente dove
Frank> posso reperire esempi o spiegazioni (internet, dispense, libri,
Frank> esempi in c o c++) sul modo di implementare un algoritmo per
Frank> calcolare un'espressione del tipo (ad es,):
Frank> c=a*(b+a)+a*2
Frank> inserendo in input i valori di a e b ed ottenendo in uscita il
Frank> valore di c
Frank> non mi interessa tutta la teoria dei compilatori perchè devo
Frank> solo calcolare espressioni algebriche del tipo sopra indicate
Frank> grazie frank
A partire dalla stringa devi creare (operazione detta "parsing", v. google)
un albero la cui visita simmetrica e` l'espressione.
le foglie sono gli operandi ultimi (numeri o variabili), quindi
una volta creato l'albero (che potrai valutare facilmente) cercherai
tra le foglie dell'albero le variabili la cui valorizzazione vuoi chiedere
all'utente (input).
[Chissa` se qualche lettore che non conosce le strutture dati ad albero mi
 credera` scimmia... visti i precedenti in questo news group puo` capitare! ]
comunque,
Gli operatori hanno priorita` diverse:    =     + -     * /     ^
durante il parsing raccogli le sottoespressioni dalla meno prioritaria (=)
alla piu` prioritaria (^), considerando che appena incontri una parentesi
significa che inizia una sotto espressione (sub-stringa che riparserai
in seguito ricorsivamente) che si chiude dove il numero di parentesi
trovate chiuse in seguito equivaglia il numero di quelle trovate aperte.
Saluti,
MARco
-- 
xref: 
http://mar.i.am/~u16664.8096/it.scienza.informatica/parsingalgebra,it
x(t),y(t) = th(3t-34.5)*e^[-(3t-34.5)^2]/2-4.3+e^(-1.8/t^2)/(.8*atg(t-
3)+2)(t-1.8)-.3th(5t-42.5),(1.4e^[-(3t-34.5)^2]+1-sgn[|t-8.5|-.5]*1.5*
|sin(pi*t)|^[2e^(-(t-11.5)^2)+.5+e^(-(.6t-3.3)^2)])/(.5+t)+1  ; 0<t<14

 ed ottenendo in uscita il valore di c
Comincia a guardare qualcosa sulla notazione infissa e
postfissa (detta anche RPN, notazione polacca inversa).
Lino

> grazie, mi 
  hai chiarito di molto le idee
  anche se nel processo
  di creazione dell'albero
  non ho capito bene come tener
  conto delle precedenze dei simboli: = + - * / ^,
  non è che (se non chiedo troppo)
  avresti un piccolo esempio?
  saluti
         franco
 
  complimenti per la firma
  realizzata matematicamente
  con le due funzioni x(t), y(t)


 tipo sopra indicate
Cerca su interenet "Let's build a Compiler", i primi capitoli fanno per
te.
-- 
Andrea Bergia - studente              Linux Registered User #281550

 writes:
franz> >
franz>   grazie, mi
franz> hai chiarito di molto le idee anche se nel
franz> processo di creazione dell'albero non ho capito bene come tener
franz> conto delle precedenze dei simboli: = + - * / ^,
avevo fatto degli spazi lasciando vicini tra loro   - +    e   * /
perche` cosi` raggruppati hanno la stessa precedenza:
Cioe` devi prepararti dal punto di vista logico a partizionare
l'insieme dei simboli operatori, raggruppando quelli che hanno
la stessa precedenza.
Stando al tipo di espressione che hai scelto, bisogna partire da "="
(per il parser potrebbero essercene anche piu` d'uno), hai una stringa,
e devi trasformarla in albero con radice l'operatore e figli gli operandi,
cerchi il primo uguale (parentesi escluse) nella stringa a partire
da sinistra (se l'associativita` e` destra, come e` tipico che sia per l'uguale).
a=b=c deve costruire l'albero (se binario)
[leggere con font monospace come courier o simili, oppure da terminale]
      =
     / \
    =   c
   / \
  a   b
se l'albero invece non ti interessa che sia binario l'associativita` non
ha importanza in fase di parsing (ma solo in fase di valutazione),
genererai quindi l'albero:
      =
    / | \
   a  b  c
divertiti con questa scelta e ricordati che nell'esempio a, b o c
sono delle sottostringhe con eventuali operatori a precedenza maggiore
di quello fino ad ora considerato (=) (ad eccezione delle parentesi
il cui intero contenuto va riparsate da capo)
l'operatore a successiva priorita` dell'uguale (somma e sottrazione),
e` analogo, e il parsing riguarda solo le sottoespressioni che
l'operatore scompone nella stringa.
l'espressione che dicevi "c=a*(b+a)+a*2" corrisponde all'albero:
       =
   /        \
 c           +
          /     \
         *       +
       /   \    / \
      a     +   a 2
           / \
           b a
dopo l'uguale si parsano i simboli  + e - (anche se nell'algebra - e` un
po' un'eccezione, perche` e` un operatore sia su un solo elemento che
due, lo si riconosce che e` su uno quando la substringa di parsing
comincia con meno, non e` comunque questo caso, consideriamo ad esempio
per uniformita` "-a"="0-a").
nell'esempio che hai fatto quello che deve avvenire e` circa
c=a*(b+a)+a*2
cerca [=]      "c"   =     "a*(b+a)+a*2"
cerca [+-]             "a*(b+a)"   +   "a*2"
cerca [*/] .1        "a" * "(b+a)"
cerca [*/] .2                        "a" * "2"
cerca [^]                       nessuno
franz> non è che (se non chiedo troppo) avresti un piccolo esempio?
tutto cio` che ho scritto e` astratto e non contempla
ottimizzazioni con cache dei puntatori in fase di parsing,
possibili specialmente quando di incontrano parentesi e concetti simili.
Sono uno dei pochi che saprebbe scrivere un compilatore senza aver mai
letto come si fa :-)
franz>   saluti franco
franz>   complimenti per la firma realizzata matematicamente con le
franz> due funzioni x(t), y(t)
E` solo interpolazione ed elaborazione funzionale non lineare a piu` dimensioni...
Io ne sono particolarmente abile. Ad esempio se vedo volare una mosca
il suo percorso tridimensionale ha per me un significato ampiamente
preciso, dalla fluidodinamica all'esatta percorrenza eventualmente
scomponibile sottoforma di proiezione su un sistema di coordinate
polilogaritmiche arbitrario (coordinate lineari per un volo nello spazio).
Saluti,
MARco
-- 
xref: 
http://mar.i.am/~u16664.56610/it.scienza.informatica/parsing2,it


grazie
ciao
franco


grazie,
mi č venuto
in mente come fare
ciao
        franco
