import lex # Liste des noms des symboles. C'est obligatoire. symboles = ( 'NUM', 'VAR', 'EGAL', 'OPADD', 'OPSOUS' 'OPMUL', 'OPDIV', 'PARENG', 'PAREND' ) # Règles de déclaration régulières pour les symboles. t_VAR = r'[a-zA-Z_][\w_]*' t_EGAL = r'=' t_OPADD = r'\+' t_OPSOUS = r'-' t_OPMUL = r'\*' t_OPDIV = r'/' t_PARENG = r'\(' t_PAREND = r'\)' # Une règle de déclaration régulière avec du code d'action. def t_NUM(t) : r'\d+' try: t.valeur = int(t.valeur) except ErreurValeur: print "Ligne %d: Numéro %s est trop grand!" % (t.numLigne, t.valeur) t.valeur = 0 return t # Définit une règle de sorte que l'on puisse suivre les numéros de lignes. def t_nouvelleligne(t): r'\n+' t.numLigne += len(t.valeur) # Une chaîne contenant les caractères ignorés (espaces and tabulations). t_ignore = ' \t' # Règle de gestion des erreurs def t_erreur(t): print "caractère invalide '%s'" % t.valeur[0] t.ignore(1) # Construit l'analyseur syntaxique lex.lex() # Récupère l'entrée donnees = entree_brute() lex.entree(donnees) # Segmente while 1 : tok = lex.token() if not tok : break print tok Si vous souhaitez inclure des mots réservés, il est en général plus facile de faire correspondre un nom de variable (identifiant) et d'effectuer une résolution de nom particulière dans une fonction telle que : reserve = { 'si' : 'SI', 'alors' : 'ALORS', 'sinon' : 'SINON', 'tant que' : 'TANT QUE', ... } def t_VAR(t): r'[a-zA-Z_][\w_]*' t.type = reserve.get(t.value,'ID') # Vérification des mots réservés return t