%{ // ------------------------------------------------------------ // Fichier : logique0.0.y // Type : fichier yacc (bison) // Contenu : Essai d'analyseur logique des propositions // Version minimale : // pas de lexeur, // valeur de vérité des propositions en dur // Parseur généré en tapant les instructions : // $ bison logique0.0.y // (--> logique0.0.tab.c) // $ gcc -o v0 logique0.0.tab.c // (executable : v0) // N.B. Avec yacc, le nom du fichier C est y.tab.c // ------------------------------------------------------------ #include // Fonctions nécessaires pour yacc. On peut les définir dans cette // partie ou dans la 3e (après les règles). int main (void) { return yyparse (); } void yyerror (const char *s) { printf ("Logique0.0 : erreur (%s)\n", s); } // Analyseur lexical ultra simple : tous les caractères sont // transmis un par un. int yylex (void) { int c; /* saut des caractères d'espace */ while ((c = getchar ()) == ' ' || c == '\t' || c == '\n') ; if (c == EOF) return 0; return c; } %} %% /* Règle pour permettre de reconnaître plusieurs formules */ S: F ';' { printf("Valeur de vérité : %s\n", $1==1?"VRAI":"FAUX") ;} S {} | /* epsilon */ {} ; /* Grammaire classique de la logique des prédicats */ /* F = formule ; V = Variable propositionnelle */ F: V /* Action par défaut : $$ = $1 */ | '(' F '&' F ')' {$$ = (($2==1 && $4==1) ? 1 : 0) ; } | '(' F 'v' F ')' {$$ = (($2==0 && $4==0) ? 0 : 1) ; } | '(' F '>' F ')' {$$ = (($2==1 && $4==0) ? 0 : 1) ; } | '¬' F {$$ = ($2==1 ? 0 : 1) ; } ; /* Valeurs de variables propositionnelles attribuées arbitrairement « en dur » */ V: 'P' {$$ = 1 ;} | 'Q' {$$ = 0 ;} | 'R' {$$ = 0 ;} | 'S' {$$ = 1 ;} | 'T' {$$ = 0 ;} ; %%