[YACC-BISON] Relancer en supprimant une règle

a marqué ce sujet comme résolu.

Salut à tous,

je me demande s’il existe une manière de faire ceci en Yacc-Bison :

j’ai une grammaire qui essaie de catcher quelque chose. Mais s’il le catche et qu’une certaine condition existe, refuser cette "interprétation" et relancer le syntaxeur sur ce morceau en omettant cette règle.

Une autre manière de dire cela serait de penser que j’ai un conflit "reduce/reduce", et que je veux le résoudre en fonction des attributs (et pas de la syntaxe).

Je ne sais pas si c’est très clair…

Par exemple on aurait :

X:    INT_VAL '*' INT_VAL        {if($1 == $3){printf("%i^2",$1);} else {relanceSansCetteRègle();}}

Y:    INT_VAL '*' INT_VAL        {printf("%i*%i",$1,$3);}

Bon en l’occurrence c’est stupide, mais dans mon cas ce serait utile.

Merci d’avance ;)

+0 -0

Bon je vais donner un exemple plus précis.

Supposons que dans ma syntaxe, je vais trouver des trucs comme : "IDENTIFICATEUR_PLUSPLUS".

J’aurais donc quelque chose comme:

PLUSPLUS:    IDENTIFICATEUR '+' '+'

Maintenant supposons que je veux aussi trouver les cas où je fais, par exemple, i = i+1.

Je ne veux pas que ce soit un cas à part, car ce serait trop long. Ma question serait donc, puis-je faire quelque chose comme :

PLUSPLUS:    IDENTIFICATEUR '+' '+'
           | IDENTIFICATEUR '=' IDENTIFICATEUR '+' '1' {if($1 == $3){ok();} else {relaunchWithoutThisRule(); }

Bon je vois pas comment faire tel quel (mes cours d’analyse lexicale et de compilation sont loin (aussi bien temporellement que spatialement^^))…
Mais du coup, dans ce nouvel exemple, l’objectif final, ce serait quoi? Qu’est-qui différencie un i=i+1 d’un i=j+1 au niveau de ce que tu veux en faire?

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte