# Yacc example import yacc # Obtient la carte des symboles grâce à l'analyseur syntaxique que nous avons défini # précédemment. C'est obligatoire. from notreanalyseur import tokens __var_noms = {} def p_instruct_assignation(t) : 'instruct_assignation : instruction VAR EGAL' __noms_var[t[1]] = t[3] def p_instruct_plus(t) : 'instruction : instruction terme OPADD' t[0] = t[1] + t[3] def p_instruct_moins(t) : 'instruction : instruction terme OPSOUS' t[0] = t[1] - t[3] def p_instruct_terme(t) : 'instruction : terme' t[0] = t[1] def p_terme_mul(t) : 'terme : terme OPMUL facteur' t[0] = t[1] * t[3] def p_terme_div(t) : 'terme : terme OPDIV facteur' t[0] = t[1] / t[3] def p_terme_facteur(t) : 'terme : facteur' t[0] = t[1] def p_facteur_num(t) : 'facteur : NUM' t[0] = t[1] def p_facteur_var(t) : 'facteur : VAR' if __var_noms.has_key(t[1]) : t[0] = __var_noms[t[1]] else : print "Variable Indéfinie ", t[1], "à la ligne no.", t.lineno(1) def p_facteur_expr(t): 'facteur : PARENG instruction PAREND' t[0] = t[2] # Règle d'erreur pour les erreurs de syntaxe def p_erreur(t): print "Erreur de syntaxe en entrée!" # Construit l'analyseur yacc.yacc() while 1: try: s = raw_input('entrer > ') except EOFError: break if not s: continue yacc.parse(s) Ici; chaque fonction accepte un seul argument, t qui est un multiplet. Les valeurs de t[i] sont associées aux symboles grammaticaux tel que présenté ici : def p_instruct_plus(t): 'instruction : instruction OPADD terme' # ^ ^ ^ ^ # t[0] t[1] t[2] t[3] t[0] = t[1] + t[3]