2011-08-02 2 views
1

Je sais maintenant comment faire associé ELSE avec le IF le plus proche:Comment faire ELSE s'associer avec IF le plus éloigné dans yacc?

%nonassoc IFX 
%nonassoc ELSE 

| IF stmt %prec IFX 
| IF stmt ELSE stmt 

Mais comment puis-je faire ELSE associé avec le plus éloigné IF?

J'ai essayé de changer l'ordre des deux %nonassoc ci-dessus, mais après cela, si semble ne pas reconnaître toute déclaration valide au format IF stmt ELSE stmt.

Pourquoi?

Comment le faire correctement?

Répondre

1

(non testé) Vous devez forcer bison à générer un analyseur syntaxique qui réduit if instructions s'il existe une ambiguïté entre plusieurs if s. Selon http://www.delorie.com/gnu/docs/bison/bison_85.html cela peut être réalisé si la règle IF stmt a une priorité plus élevée que le jeton ELSE. Donc

%nonassoc ELSE 
%nonassoc IFX 

| IF stmt %prec IFX 
| IF stmt ELSE stmt 

devrait faire l'affaire.