• Aucun résultat trouvé

III. Planification SAT : le système TSP

4. Automatisation de la traduction : le traducteur TSP

4.3. Fonctionnement interne du traducteur TSP

Le module de traduction de TSP utilise l'analyseur syntaxique LALR(1) YACC pour produire un arbre de syntaxe abstraite qui représente les règles de codage et un environnement contenant les noms d'ensembles et les listes d'éléments correspondantes. La grammaire utilisée pour l'analyse syntaxique est donnée ci-après :

<tspl_spec> → <sets> <rules> <sets> → sets <defsets> endsets <defsets> → λ

<defsets> → <defsets> s <suitevar> ## <defsets> → <defsets> s

<suitevar> #ident# <defoneset> <defoneset> → λ

<defoneset> → <defoneset> ident#

<rules> → rules <atom> <suiterules> endrules <rules> → rules <aconj> <suiterules> endrules <rules> → rules <adisj> <suiterules> endrules <rules> → rules <conj> <suiterules> endrules <suiterules> → λ

<suiterules> → <atom> <suiterules> <suiterules> → <aconj> <suiterules> <suiterules> → <adisj> <suiterules>

<suiterules> → <conj> <suiterules> <conj> → and <atom> <conj>

<conj> → and <conj> <atom> <conj> → and <aconj> <adisj> <conj> → and <adisj> <aconj> <conj> → and <conj> <adisj> <conj> → and <adisj> <conj> <conj> → and <atom> <adisj> <conj> → and <adisj> <atom> <conj> → and <adisj> <adisj> <conj> → or <atom> <aconj> <conj> → or <aconj> <atom> <conj> → or <adisj> <aconj> <conj> → or <aconj> <adisj> <conj> → or <atom> <conj> <conj> → or <conj> <atom> <conj> → or <adisj> <conj> <conj> → or <conj> <adisj> <conj> → imp <aconj> <aconj>

<conj> → imp <atom> <aconj> <conj> → imp <aconj> <conj> <conj> → imp <atom> <conj> <conj> → imp <adisj> <atom> <conj> → imp <adisj> <adisj>

<conj> → andset $ident <set> <adisj> <conj> → andset $ident <set> <conj> <conj> → if <boolexp> <atom> <conj> <conj> → if <boolexp> <conj> <atom> <conj> → if <boolexp> <aconj> <conj> <conj> → if <boolexp> <conj> <aconj> <conj> → if <boolexp> <adisj> <conj> <conj> → if <boolexp> <conj> <adisj> <conj> → if <boolexp> <conj> <conj> <adisj> → or <atom> <atom>

<adisj> → or <atom> <adisj> <adisj> → or <adisj> <atom> <adisj> → or <adisj> <adisj> <adisj> → imp <atom> <atom> <adisj> → imp <atom> <adisj> <adisj> → imp <aconj> <atom> <adisj> → imp <aconj> <adisj> <adisj> → orset $ident <set> <atom> <adisj> → orset $ident <set> <adisj> <adisj> → if <boolexp> <atom> <adisj> <adisj> → if <boolexp> <adisj> <atom> <adisj> → if <boolexp> <adisj> <adisj> <aconj> → and <atom> <atom>

<aconj> → and <atom> <aconj> <aconj> → and <aconj> <atom> <aconj> → and <aconj> <aconj>

<aconj> → andset $ident <set> <atom> <aconj> → andset $ident <set> <aconj>

<aconj> → if <boolexp> <atom> <aconj> <aconj> → if <boolexp> <aconj> <atom> <aconj> → if <boolexp> <aconj> <aconj> <atom> → p <suitevar>

<atom> → ~p <suitevar> <atom> → true

<atom> → false

<atom> → if <boolexp> <atom> <atom> <suitevar> → $ident

<suitevar> → <suitevar> $ident <set> → s

<set> → s <suitevar> <set> → union <set> <set> <set> → inter <set> <set> <set> → minus <set> <set>

<set> → such $ident <set> <boolexp>

<set> → counter <begin_counter> to <suitevar> <set> → upperset $ident <set>

<set> → if <boolexp> <set> <set> <begin_counter> → <suitevar> <boolexp> → true

<boolexp> → false

<boolexp> → member $ident <set> <boolexp> → subset <set> <set> <boolexp> → equal $ident1 $ident2 <boolexp> → empty <set>

<boolexp> → and <boolexp> <boolexp> <boolexp> → or <boolexp> <boolexp> <boolexp> → imp <boolexp> <boolexp> <boolexp> → not <boolexp>

Une fois l'analyse syntaxique terminée, l'arbre de syntaxe abstraite est parcouru en profondeur d'abord en constituant comme attribut hérité une liste de substitutions pour les identificateurs liés et comme attribut synthétisé une base de clauses. La grammaire précédente, augmentée de ces deux attributs, est attribuée à gauche ce qui permet d'obtenir le résultat recherché en un seul parcours de l'arbre.

Documents relatifs