next up previous contents
Next: Analyse Up: Implantation de l'analyseur syntaxique Previous: Réduction

Application d'une règle

Pour appliquer une règle, il suffit de remplacer la partie de la liste qui constitue la partie droite de la règle par la partie gauche de la règle. Il faut ensuite exécuter les actions sémantiques de la partie droite. Pour appliquer une règle sur la globalité de la liste des symbôles, on utilise le prédicat apply_rule_globally.

apply_rule_globally(RULE, SYMBOLS, NEW_SYMBOLS):-
    apply_rule(RULE, SYMBOLS, NEW_SYMBOLS).
apply_rule_globally(RULE, [SYMBOL|SYMBOLS], [SYMBOL|NEW_SYMBOLS]):-
    apply_rule_globally(RULE, SYMBOLS, NEW_SYMBOLS).

apply_rule((HEAD := BODY), SYMBOLS, NEW_SYMBOLS):-
    remove_symbols(BODY, SYMBOLS, REST),
    append_symbols(HEAD, REST, NEW_SYMBOLS),
    apply_semantics(HEAD := BODY).

Pour supprimer les symbôles de la fin de la liste, on parcours cette liste en supprimant d'abord le dernier symbôle de la partie droite et en ignorant les actions sémantiques.

remove_symbols((SYMBOL,SYMBOLS), LIST, REST):-
    !,
    remove_symbols(SYMBOLS, LIST, [SYMBOL|REST]).

remove_symbols({_},LIST,LIST):-!.   % actions sémantiques

remove_symbols(SYMBOL, [SYMBOL|SYMBOLS], SYMBOLS).  % pour le dernier

Sur le même principe, on reconstruit la liste en rajoutant les symbôles de la partie gauche à la liste des symbôles restants.

append_symbols([],LIST,LIST):-
    !.

append_symbols((SYMBOL,SYMBOLS), LIST, REST):-
    !,
    append_symbols(SYMBOLS,[SYMBOL|LIST],REST).
append_symbols(SYMBOL, LIST, [SYMBOL|LIST]).

Il ne reste plus qu'à appliquer les actions sémantiques. Pour cela on parcours le corps de la règle et on exécute toutes les actions rencontrées de gauche à droite.

apply_semantics(HEAD := (ITEM, BODY)):-
    !,
    apply_semantics(HEAD := ITEM),
    apply_semantics(HEAD := BODY).

apply_semantics(HEAD := {SEMANTIC,SEMANTICS}):-
    !,
    SEMANTIC,
    apply_semantics(HEAD := {SEMANTICS}).
apply_semantics(_ := {SEMANTIC}):-
    !,
    SEMANTIC.

apply_semantics(_ := _).



Christophe Delord
1998-09-02