Infix-to-prefix

Bonjour à tous,

dsl de faire un double post à la fois sur le groupe rails et sur ruby,
mais il semble plus avoir grand monde chez ruby.fr

j’essaye de faire une méthode pour convertir une expression infix et
prefix
ca passe pas
Ou est mon problème ?
merci
def parse_simple(expr, opers=%w(+ - * /))
return expr if opers.empty?
return parse_simple(expr, opers[1…-1]) unless expr.include?
(opers.first)
“(#{opers.first} " +
expr.split(opers.first).map {|e|
p e
parse_simple(e, opers[1…-1]).strip
}.join(” ") +
“)”
end

def parse(expr, exprs = [])
while expr.gsub!(/(([^()]+))/) {“expr:#{(exprs <<
parse_simple($1)).size - 1}”}; end
expr = parse_simple(expr)
while expr.gsub!(/expr:(\d+)/) {exprs[$1.to_i]}; end
expr
end

Test
p "2 * 5 + 1

ca me retourne (+ (* 2 5) 1)

alors que ca devrait être (+ 1 (* 2 5))
5))"

Le 1 octobre 2008 12:36, Bolo a écrit :

dsl de faire un double post à la fois sur le groupe rails et sur ruby,
mais il semble plus avoir grand monde chez ruby.fr

Il faut dire aussi que c’est un site d’hôtellerie.

J’aurais tendance à construire un arbre dans un premier temps (au
parsage), à le parcourir dans un deuxième.

– Jean-François.


http://twitter.com/underflow_

mais il semble plus avoir grand monde chez ruby.fr
Il faut dire aussi que c’est un site d’hôtellerie.

… ce qui est dommage pour un site d’hôtellerie, faut le reconnaître…

gUI


Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/

En fait c’est un problème juste théorique.
je dois simplement créer un fonction qui permet de convertir une
expression infix en prefix

dans un exemple je dois avoir ca

2 * 5 + 1 =======> (+ 1 (* 2 5))

d’apres ce que j’ai compris c’est juste deux formes notation

On 1 oct, 07:42, Jean-Baptiste BARTH [email protected]

Je ne vois pas de différence fondamentale entre (+ (* 2 5) 1) et (+ 1 (*
2 5)), le “+” est commutatif aux dernières nouvelles (ce qui n’est
certes pas le cas du “-” ou du “/”).

Intuitivement : tu as un bloc “25" à traiter d’abord, puis ce bloc est
inclus dans un bloc “résultat + 1”. Pourquoi dans un cas ça te
retournerait "
2 5” et dans l’autre “+ 1 résultat”. Je veux dire,
pourquoi les opérandes trouveraient leur ordre inversé dans un des
traitements et pas dans l’autre ? Et quel intérêt cela aurait ? Peux-tu
préciser un peu le problème ?

Cdt,

Jean-Baptiste

Bolo a écrit :

Pourquoi le “1” devrait-il se retrouver au début de l’expression ? La
notation prefix n’est pas censée changer l’ordre des opérandes si ?

Par exemple, si tu voulais paser ça :
5 * 2 / 4
Si au final tu obtiens :
/ 4 (* 5 2)
Il me semble que le résultat ne sera pas le même au final… Il faudrait
plutôt avoir :
/ (* 5 2) 4
Sauf si je suis complètement à côté bien entendu…


Michel B.

donc si j’ai bien suivi

normalement

2 * 5 + 1 doit faire (+ (* 2 5) 1)
2 * ( 5 + 1 ) doit faire (* (+ 5 1) 2 )

On 1 oct, 10:10, Jean-Baptiste BARTH [email protected]

2 * ( 5 + 1 ) doit faire (* 2 (+ 5 1) )

Ne pas changer l’ordre des opérandes.


Michel B.

Au passage cette conversation me fait penser à un compilateur (ça sert
pas Ã
ça entre autre ?). Une suite d’articles (en cours) explique comment
faire un
compilateur en Ruby : Writing a compiler in Ruby, bottom up

gUI


Pour la santé de votre ordinateur, préférez les logiciels libres.
Lire son mail : http://www.mozilla-europe.org/fr/products/thunderbird/
Browser le web : http://www.mozilla-europe.org/fr/products/firefox/
Suite bureautique : http://fr.openoffice.org/

Merci a tous.

il y avait bien erreur dans l’énoncé

On 1 oct, 12:18, “Guillaume B.” [email protected]

@Michel: C’est les notions que j’avais également, et c’était le sens de
mon premier mail :wink:
@Bolo: Si cet exemple t’a été fourni rapproche toi du demandeur pour
voir s’il n’y a pas une légère erreur, je pense que c’est le cas, le
changement de notation devrait conserver l’ordre des opérandes.


Jean-Baptiste

Michel B. a écrit :

Comme l’a indiqué Jean-François,

Je parlais bien du new group fr.comp.lang.ruby

Merci a tous pour le coup de main
Bolo