2009-11-20 8 views
0

Disons que je dois exécuter du code d'initialisation chaque fois que je fais correspondre une règle, comment puis-je réduire la redondance?Est-il possible d'empiler le code de la règle de grammaire Yacc?

rule : TOKEN1 { init(); token1Code(); } 
    | TOKEN2 { init(); token2Code(); } 
    ; 

Aussi est-il possible de faire quelque chose comme

rule : TOKEN1 
    | TOKEN2 
    { codeForToken1OrToken2(); } 
    ; 

Répondre

3

Vous pouvez utiliser quelque chose comme:

rule : { init(); } real_rule { codeForToken1or2(); } ; 

real_rule : TOKEN1 { token1Code(); } 
      | TOKEN2 { token2Code(); } 
      ; 

Mais cela peut introduire des conflits, selon la « règle » est utilisée.

+0

cette grammaire n'est pas la même que DevDevDev posté – eKek0

+0

Il accepte la même langue, donc son équivalent –

+0

La grammaire originale que vous avez postée n'était pas la même langue. Maintenant, vous avez corrigé l'erreur – eKek0

0

Depuis cela fonctionne vraiment:

rule : TOKEN1 { getToken(); init(); token1Code(); } 
    | TOKEN2 { getToken(); init(); token2Code(); } 
    ; 

getToken(); est le nom de la fonction qui correspond au jeton suivant dans l'entrée (je ne me souviens pas du nom de la fonction), vous pouvez appeler init(); à l'intérieur.

+0

Vous ne semblez pas répondre à la question. –