2010-09-23 4 views
2

Je suis en train d'utiliser des prédicats sémantiques dans ANTLR pour la règle de grammaire suivanteANTLR sémantique prédicats

test[n] 
     :({n==0}? => ~('a')) 
     |({n==1}? => ~('b')) 
     |({n==2}? => ~('c')) 
     ; 

Cependant, ANTLR ne me laisse pas définir la grammaire de telle sorte, exigeant qu'au moins l'une des alternatives être par défaut. L'erreur exacte affichée est une erreur de référence pour le paramètre n.

Mon but est que j'en veuille une, et qu'une seule de l'alternative soit visible à un instant donné. Des idées sur la façon de s'y prendre?

Merci!

Répondre

1

Cela ne peut pas être vrai: vous avez oublié de spécifier le type n, donc la compilation d'un analyseur généré ne fonctionnera pas. Il devrait être:

test[int n] 
    : ({n==0}? => ~('a')) 
    | ({n==1}? => ~('b')) 
    | ({n==2}? => ~('c')) 
    ; 

Lorsque je crée une petite grammaire à la règle ci-dessus, je ne reçois aucune erreur cependant.

Pouvez-vous publier une chaîne complète de grammaire et de test qui génère cette erreur? Pouvez-vous également copier et coller le message d'erreur exact?

+0

Salut, Merci pour la réponse. – Gunner4Life

+0

En plus de la solution ci-dessus, il y avait aussi un problème d'ensembles de suivi contextuels, car le paramètre était traité comme une variable locale. Je n'utilise pas une portée pour atteindre la même chose, et cela semble fonctionner correctement. Merci! – Gunner4Life

+0

@ Gunner4Life, je vous en prie. –