je mis en oeuvre un scanner basé générateur dans le python que tokenizes une chaîne en tuples de la forme (type de jeton, la valeur de jeton):Utilisation de préanalyse avec des générateurs
for token in scan("a(b)"):
print token
imprimera
("literal", "a")
("l_paren", "(")
...
La tâche suivante implique l'analyse du flux de jetons et pour cela, je dois pouvoir regarder un élément en avant de celui en cours sans déplacer le pointeur. Le fait que les itérateurs et les générateurs ne fournissent pas la séquence complète des éléments en même temps mais chaque élément rend les affichages un peu plus compliqués par rapport aux listes, puisque l'élément suivant n'est pas connu à moins que __next__()
soit appelé. À quoi pourrait ressembler une mise en œuvre directe d'un lookahead à base de générateur? Actuellement, je suis en utilisant une solution de contournement qui implique de faire une liste du générateur:
token_list = [token for token in scan(string)]
Le préanalyse est facilement mis en œuvre alors par quelque chose comme ça:
try:
next_token = token_list[index + 1]
except: IndexError:
next_token = None
Bien sûr, cela fonctionne très bien. Mais en y repensant, ma deuxième question se pose: y a-t-il vraiment un point de départ pour faire un générateur de scan()
?
er ... celui-ci ne concerne pas uniquement les cordes, n'est-ce pas? penser à des choses comme '(_ pour _ dans (None, 'evil', 4, 0))', c'est aussi un générateur .. – n611x007