%{ // ------------------------------------------------------------ // Fichier : logique2.0.y // Type : fichier yacc (bison) // Contenu : Analyseur de petites phrases en langue nat, // interprétées comme des formule de logique des propositions // point de départ : logique 1.1.y // ------------------------------------------------------------ // négation : discordanciel (ne) + forclusif (pas) (cf. Damourette et // Pichon), et aussi négation pré-phrastique (il est faux que) #include int main (void) { return yyparse (); } void yyerror (const char *s) { printf ("Logique2.0 : erreur (%s)\n", s); } // Tableau global ("modèle") pour les valeurs de propositions int modele[5][5] ; %} %token NP VP %token ET OU SI ALORS NEG %token DISC FORC %% /* A = affectation, I = interrogation */ S: A S | I S | /* epsilon */ ; A: NP VP '.' { modele[$1][$2] = 1 ; } | NP DISC VP FORC '.' { modele[$1][$2] = 0 ; } ; I: F '?' { printf("Valeur de vérité : %s\n", $1==1?"VRAI":"FAUX") ; } ; /* Formules atomiques : prenom + verbe intrans. ; ou forme négative */ FA: NP VP { $$ = modele[$1][$2] ; } | NP DISC VP FORC { $$ = !(modele[$1][$2]) ; } ; /* Grammaire classique de la logique des prédicats */ F: FA /* Action par défaut : $$ = $1 */ | '(' F ET F ')' {$$ = (($2==1 && $4==1) ? 1 : 0) ; } | '(' F OU F ')' {$$ = (($2==0 && $4==0) ? 0 : 1) ; } | SI F ALORS F {$$ = (($2==1 && $4==0) ? 0 : 1) ; } /*| NEG F {$$ = ($2==1 ? 0 : 1) ; } */ ; %%