#!/usr/bin/env python # coding:latin-1 # $Id$ # ---------------------------------------------------------------------- # Utilisation de ply pour la lecture et la manipulation d'arbres # décrits dans un langage non structuré. # Version d'avril 2012 # ---------------------------------------------------------------------- # Il faut aller chercher ply là où on l'a téléchargé import sys sys.path.insert(0,"./ply-3.4") # ----------------------------------------------------------------------------- # lex # ----------------------------------------------------------------------------- tokens = ( 'ROOT','N', 'NOM' ) literals = [':',',',';','{','}','='] # Tokens t_ROOT = r'racine' t_N = r'[A-Z]+' t_ignore = " \t\n" def t_error(t): print "Erreur: caractère non reconnu: '%s'" % t.value[0] t.lexer.skip(1) # Build the lexer import ply.lex as lex lex.lex() def p_tree(p): ''' tree : racine lst_desc ''' print "Arbre reconnu, degré sortant max = %d" % (p[2]) def p_racine(p): ''' racine : ROOT ":" N ";" ''' def p_lst_desc(p): ''' lst_desc : desc ";" lst_desc | ''' if len(p) >= 3: p[0] = max(p[1], p[3]) else: p[0] = 0 def p_desc(p): ''' desc : N ":" lst_noeuds ''' p[0] = p[3] def p_lst_noeuds_A(p): ''' lst_noeuds : ''' p[0] = 0 def p_lst_noeuds_B(p): ''' lst_noeuds : N ''' p[0] = 1 def p_lst_noeuds_C(p): ''' lst_noeuds : N "," lst_noeuds_pls ''' p[0] = 1 + p[3] def p_lst_noeuds_pls_A(p): ''' lst_noeuds_pls : N ''' p[0] = 1 def p_lst_noeuds_pls_B(p): ''' lst_noeuds_pls : N "," lst_noeuds_pls''' p[0] = 1 + p[3] def p_error(p): if p: print "Erreur de syntaxe, sur le token '%s'" % p.value else: print "Erreur de syntaxe (fin de saisie)" import ply.yacc as yacc yacc.yacc() # ----------------------------------------------------------------------------- # Test # ----------------------------------------------------------------------------- m1 = "racine:F; F:A,B,E; A:; B:D; D:; E:C,G; C:; G:;" m2 = "racine:A; F:A,B,E; A:A,B,E,G; B:D; D:; E:C,G; C:; G:;" m3 = "racine:A; F:A,B,E; A:A,B,E,G; B:D; D:; E:C,G,G,C,C,G; C:; G:;" m4 = ''' racine: A ; A : A,B,C,D ; B : ; C : A B ;''' set = [m1, m2, m3, m4] for u in set: yacc.parse(u)