Bon parenthésage

sept. 10, 2018

Objectifs

  • utiliser les piles
  • parcourir en lecture des fichiers textes

Introduction

Lorsque dans un texte on ouvre une parenthèse, on se doit de la fermer ensuite. Le but de ce TP est de procéder à la vérification du bon parenthésage de fichiers textes, et en particulier de textes de programmes écrits en Python.

Les parenthèses que vous considérerez dans ce TP sont celles que l’on rencontre le plus souvent en Python :

  • les parenthèses classiques ( et ) ;
  • les accolades { et } ;
  • et les crochets [ et ].

Un programme est bien parenthésé si pour chaque sorte de parenthèses,

  • il y en a autant d’ouvrantes que de fermantes ;
  • tout préfixe du texte contient au moins autant d’ouvrantes que de fermantes ;
  • aucune parenthèse fermante d’une sorte ne suit une parenthèse ouvrante d’une autre sorte.

La vérification du bon parenthésage d’un programme peut aisément se faire en utilisant une pile.

À faire

  1. Récupérez cette archive et décompressez la dans un dossier que vous nommerez Parentheses. Dans le dossier src, vous trouverez :
    • un fichier stack.py, module sur les piles que vous utiliserez
    • et quatre autres fichiers (bad_stack1.py, …) qui illustreront de mauvais parenthésages.

Parcours de fichiers textes en Python

Brièvement rappelées les fonctions à connaître pour la lecture des fichiers texte.

  • open fonction d’ouverture d’un canal de lecture depuis un fichier. Exemple :

    >>> in_channel = open('stack.py', 'r')
    
  • readline méthode lisant une ligne dans un fichier via un canal préalablement ouvert en lecture. Exemple :

    >>> in_channel.readline()
    '#!/usr/bin/python3\n'
    >>> in_channel.readline()
    '# -*- coding: utf-8 -*-\n'
    

    Lorsque la dernière ligne du fichier a été lue, cette méthode renvoie une chaîne vide :

    >>> in_channel.readline()
    ''
    
  • close méthode qui ferme le canal de lecture, rendant impossible toute lecture ultérieure :

    >>> in_channel.close()
    >>> in_channel.readline()
    ValueError: I/O operation on closed file.
    

Première version

Réalisez une première version de votre vérificateur de parenthésage que vous nommerez parentheses_checker1.py, qui doit pouvoir être exécuté depuis un interpréteur de commandes en prenant en argument le nom du fichier à vérifier et qui imprime un message de bon ou de mauvais parenthésage selon les cas.

$ python3 parentheses_checker1.py stack.py
Well parenthesed
$ python3 parentheses_checker1.py bad_stack1.py
Bad parenthesed
$ python3 parentheses_checker1.py bad_stack2.py
Bad parenthesed
$ python3 parentheses_checker1.py bad_stack3.py
Bad parenthesed
$ python3 parentheses_checker1.py bad_stack4.py
Bad parenthesed

Deuxième version

S’il est intéressant d’apprendre qu’un texte est mal parenthésé, il l’est davantage d’en connaître les raisons.

Vous allez donc réaliser une deuxième version de votre vérificateur de parenthésage, que vous nommerez parentheses_checker2.py qui

  • n’imprime rien sur la sortie standard si le fichier est bien parenthésé ;
  • et imprime la raison du mauvais parenthésage sinon.
$ python3 parentheses_checker2.py stack.py
$ python3 parentheses_checker2.py bad_stack1.py
Closed parenthese ] at line 68 char 20 don't match the open parenthese ( at line 68 char 12
$ python3 parentheses_checker2.py bad_stack2.py
Parenthese ( at line 100 char 16 has no matching closed parenthese.
$ python3 parentheses_checker2.py bad_stack3.py
Parenthese [ at line 13 char 34 has no matching closed parenthese.
$ python3 parentheses_checker2.py bad_stack4.py
No open parenthese matching parenthese ] at line 96 char 33

Troisième version (facultatif)

Dans les exemples qui précèdent, trois des fichiers mal parenthésés ne passent pas à l’interpréteur Python qui signale une erreur de syntaxe. En revanche, l’un d’eux est correctement écrit en Python.

Question

Lequel ?

Question

Pourquoi alors cette erreur déclarée de mauvais parenthésage alors que la syntaxe est correcte ?

Question

Voyez-vous d’autres situations analogues ?

À faire

Réalisez une troisième version de votre vérificateur qui prend en compte ces situations particulières.