Ameliorations.
darcs-hash:20071218042604-af139-5eb497a883be45bcff74c2fecfcd0f7b4ea4818b.gz
This commit is contained in:
parent
34377b4e70
commit
1ce640fa74
1 changed files with 47 additions and 30 deletions
|
@ -35,46 +35,38 @@ def done():
|
||||||
class Environment(dict):
|
class Environment(dict):
|
||||||
'''Environment dans lequel sont éxécuté les scripts'''
|
'''Environment dans lequel sont éxécuté les scripts'''
|
||||||
|
|
||||||
# Dernière variable exportée à avoir été définie
|
|
||||||
last_definition = None
|
|
||||||
|
|
||||||
# Le flux de sortie
|
# Le flux de sortie
|
||||||
stream = None
|
stream = None
|
||||||
|
|
||||||
# Les variables qui sont partagées entre le script éxécuté
|
|
||||||
# et le programme appelant
|
|
||||||
shared = ["out", "exports", "export_definition",
|
|
||||||
"last_definition", "conv", "tostring"]
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# Les variables à "exporter" dans le fichier produit
|
|
||||||
self.exports = {}
|
|
||||||
# Fonctions de convertions initiales
|
|
||||||
self.conv = {bool: {True: "yes", False: "no"},
|
|
||||||
list: lambda l: ", ".join([str(x) for x in l]),
|
|
||||||
tuple: lambda l: ", ".join([str(x) for x in l])}
|
|
||||||
# Création de l'environment initial
|
# Création de l'environment initial
|
||||||
dict.__init__(self, {
|
dict.__init__(self, {
|
||||||
# Permet d'accéder aux variables exportées
|
# Les variables à "exporter" dans le fichier produit
|
||||||
"exports": self.exports,
|
"exports": set([]),
|
||||||
|
# Export d'une variable
|
||||||
"export": self.export,
|
"export": self.export,
|
||||||
# On met a disposition le nécessaire pour surcharger
|
# Dernière variable exportée à avoir été définie
|
||||||
# la gestion des variables exportée
|
"last_definition": None,
|
||||||
"last_definition": self.last_definition,
|
# Écrit: variable keysep tostring(value)
|
||||||
"export_definition": self.export_definition,
|
"export_definition": self.export_definition,
|
||||||
# La convertion
|
# La convertion en chaîne de charactère
|
||||||
"conv": self.conv,
|
|
||||||
"tostring": self.tostring,
|
"tostring": self.tostring,
|
||||||
|
# Définition des convertions
|
||||||
|
"conv": {bool: {True: "yes", False: "no"},
|
||||||
|
list: lambda l: ", ".join([str(x) for x in l]),
|
||||||
|
tuple: lambda l: ", ".join([str(x) for x in l])},
|
||||||
# Fonction de base pour imprimer quelque chose
|
# Fonction de base pour imprimer quelque chose
|
||||||
"out": self.out,
|
"out": self.out,
|
||||||
# Arrêt du script
|
# Arrêt du script
|
||||||
"done": done})
|
"done": done,
|
||||||
|
# Le séparateur pour la forme: variable keysep valeur
|
||||||
|
"keysep": "=",
|
||||||
|
# Le charactère de commentaire
|
||||||
|
"comment_start": "#"})
|
||||||
|
|
||||||
def __setitem__(self, variable, value):
|
def __setitem__(self, variable, value):
|
||||||
'''Lorsqu'on définie une variable, on "l'exporte" dans
|
'''Lorsqu'on définie une variable, on "l'exporte" dans
|
||||||
le fichier produit'''
|
le fichier produit'''
|
||||||
# if variable in self.shared:
|
|
||||||
# self.__setattr__(variable, value)
|
|
||||||
if variable in self["exports"]:
|
if variable in self["exports"]:
|
||||||
self["export_definition"](variable, value)
|
self["export_definition"](variable, value)
|
||||||
dict.__setitem__(self, "last_definition", variable)
|
dict.__setitem__(self, "last_definition", variable)
|
||||||
|
@ -83,7 +75,7 @@ class Environment(dict):
|
||||||
def export_definition(self, variable, value):
|
def export_definition(self, variable, value):
|
||||||
'''Fonction par défaut pour gérée la définition des variables exportée.
|
'''Fonction par défaut pour gérée la définition des variables exportée.
|
||||||
écrit 'variable = tostring(value)' dans le fichier produit'''
|
écrit 'variable = tostring(value)' dans le fichier produit'''
|
||||||
self["out"]("%s = %s\n" % (variable, self["tostring"](value)))
|
self["out"]("%s%s%s\n" % (variable, self["keysep"], self["tostring"](value)))
|
||||||
|
|
||||||
def out(self, string):
|
def out(self, string):
|
||||||
'''Fonction de base pour écrire une chaine dans le fichier produit'''
|
'''Fonction de base pour écrire une chaine dans le fichier produit'''
|
||||||
|
@ -104,9 +96,9 @@ class Environment(dict):
|
||||||
# mais elle est pratique donc on la met pour tout le monde
|
# mais elle est pratique donc on la met pour tout le monde
|
||||||
def export(variable):
|
def export(variable):
|
||||||
'''Exporte une variable'''
|
'''Exporte une variable'''
|
||||||
self["exports"][variable] = True
|
self["exports"].add(variable)
|
||||||
|
|
||||||
__re_special_line = re.compile(r"^([ \t]*)@(.*)$", re.MULTILINE)
|
__re_special_line = re.compile(r"^([ \t]*)(@|%)(.*)$", re.MULTILINE)
|
||||||
|
|
||||||
def compileSource(source, filename=""):
|
def compileSource(source, filename=""):
|
||||||
'''Compile un script'''
|
'''Compile un script'''
|
||||||
|
@ -117,9 +109,34 @@ def compileSource(source, filename=""):
|
||||||
for m in __re_special_line.finditer(source):
|
for m in __re_special_line.finditer(source):
|
||||||
newsource.write(source[start:m.start()])
|
newsource.write(source[start:m.start()])
|
||||||
newsource.write(m.group(1))
|
newsource.write(m.group(1))
|
||||||
|
linetype = m.group(2)
|
||||||
|
if linetype == "@":
|
||||||
|
line = m.group(3).replace("\\", "\\\\").replace('"', '\\"')
|
||||||
|
if line and line[0] == "#":
|
||||||
|
newsource.write('out(comment_start + "')
|
||||||
|
line = line[1:]
|
||||||
|
else:
|
||||||
newsource.write('out("')
|
newsource.write('out("')
|
||||||
newsource.write(m.group(2).replace("\\", "\\\\").replace('"', '\\"'))
|
newsource.write(line)
|
||||||
newsource.write('\\n")')
|
newsource.write('\\n")')
|
||||||
|
elif linetype == "%":
|
||||||
|
line = m.group(3)
|
||||||
|
sp = line.split("=", 1)
|
||||||
|
if len(sp) == 1:
|
||||||
|
sp = line.split(" ", 1)
|
||||||
|
newsource.write("export_definition('")
|
||||||
|
newsource.write(sp[0])
|
||||||
|
newsource.write("', tostring(")
|
||||||
|
newsource.write(sp[1])
|
||||||
|
newsource.write("))\n")
|
||||||
|
varname = sp[0].strip()
|
||||||
|
else:
|
||||||
|
newsource.write(line)
|
||||||
|
newsource.write("; export_definition('")
|
||||||
|
newsource.write(sp[0])
|
||||||
|
newsource.write("', tostring(")
|
||||||
|
newsource.write(sp[0])
|
||||||
|
newsource.write("))\n")
|
||||||
start = m.end()
|
start = m.end()
|
||||||
newsource.write(source[start:])
|
newsource.write(source[start:])
|
||||||
return compile(newsource.getvalue(), filename, "exec")
|
return compile(newsource.getvalue(), filename, "exec")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue