Discussion: faire une boucle
Afficher un message
Vieux 09/08/2007, 19h53   #36
jean-michel bain-cornu
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: faire une boucle

> On pourrait d'ailleurs aller plus loin et faire évoluer ça vers un
> émulateur de 'l3g à goto'. Je n'y avait pas pensé lors de ma migration,
> mais ça permettrait une solution propre pour la pérennisation des
> vieilles applis écrites avec ce genre de langage.
> Ceux qui trainent des vieux basics ou assimilés tournant sur des
> machines à bout de souffle dresseront peut-être l'oreille...
>


Comme je suis en congé, et que je m'ennuie avec ce temps incroyablement
froid et humide pour la saison, j'ai fait l'essai avec un bout de basic
trouvé dans wikipédia, que je me suis amusé à faire tourner en python.
C'est très rudimentaire, mais ça marche !
A+
jm

PS: j'avoue que j'ai un peu triché en retirant un LEFT$ qui me gênait.

# -*- coding: iso-8859-1 -*-
"""
10 INPUT "Quel est votre nom"; NOM$
20 PRINT "Bonjour "; NOM$
30 INPUT "Combien d'étoiles voulez-vous"; NOMBRE
40 FOR I = 1 TO NOMBRE
50 ETOILE$ = ETOILE$ + "*"
55 NEXT I
60 PRINT ETOILE$
70 INPUT "Voulez-vous plus d'étoiles"; ETOILE$
80 IF LEN(ETOILE$) = 0 GOTO 70
100 IF (ETOILE$ = "O") OR (ETOILE$ = "o") THEN GOTO 30
110 PRINT "Au revoir ";
120 FOR I = 1 TO 200
130 PRINT NOM$; " ";
140 NEXT I
150 PRINT
"""
import traceback

z = dict((int(x[0]), " ".join(x[1:])) for x in (y.split() for y in (__doc__
or _).strip().splitlines())); lineNumList = [0] + sorted(z.keys());
linesDic = dict((b,a) for
a,b in enumerate(lineNumList)); l = lineNumList[1]

def main():
global l
forStack= []
while l and l <= lineNumList[-1]:
line= z[l].split()
# entrée console
if line[0] == 'INPUT':
varTxt= line[-1]
var= varTxt.replace('$','_dollar')
txt= ' '.join(line[1:len(line)-1]).replace('";',' "')
s= '%s = raw_input(%s)'%(var,txt)
if varTxt.find('$') == -1:
s= '%s = int(raw_input(%s))'%(var,txt)
# affichage console
elif line[0] == 'PRINT':
s=
z[l].replace('PRINT','print').replace('$','_dollar').r eplace(';',',')
s= s.replace(' ",','",')
# branchement
elif line[0] == 'GOTO':
n= int(line[1])
l = lineNumList[linesDic[n]-1]
# début boucle for
elif line[0] == 'FOR':
indVar= line[1]
indValue= int(line[3])
endVar= line[-1]
forStack.append([l,indVar,indValue,endVar])
s= '%s = %s'%(indVar,indValue)
# fin boucle for
elif line[0] == 'NEXT':
s= ''
var= line[1]
for i,(lno,indVar,indValue,endVar) in enumerate(forStack):
if indVar == var:
indValue+= 1
forStack[i][2]= indValue
s= '%s = %s'%(indVar,indValue)
exec 'w=%s>%s'%(indValue,endVar)
if not w:
l = lno
else:
forStack.pop()
break
# test
elif line[0] == 'IF':
w= line[1:len(line)-2]
cond= []
for inst in w:
a= inst
if a in ('OR','AND'):
a= a.lower()
cond.append(a)
if cond[-1] == 'THEN':
cond.pop()
s= ''.join(cond).replace('=','==').replace('$','_doll ar')
s= s.replace('LEN(','len(')
rc= False
exec 'if %s: rc= True'%s
if rc:
w2= int(line[-1])
l= lineNumList[linesDic[w2]-1]
s= ''
# affectation
elif line[1] == '=':
txt= z[l].replace('$','_dollar')
s= '\n'.join((
'try:',
' %s'%txt,
'except NameError:',
' var= traceback.format_exc().split("\'")[1]',
' exec "%s=\'\'"%var',
' try:',
' %s'%txt,
' except TypeError:',
' exec "%s=0"%var',
' %s'%txt,))
else:
s= "print 'non supporté : %s'"%z[l]
#
exec s
l = l != lineNumList[-1] and lineNumList[linesDic[l]+1]

main()
  Réponse avec citation
 
Page generated in 0,06738 seconds with 9 queries