8
votes

Antlr: "Accès d'attributs manquants sur la portée de la règle" Problème

J'essaie de construire une grammaire d'anti-anti-anti-anti-anti-anti-étiquette, telle que: xxx

et avoir la grammaire: xxx le Le générateur de grammaire génère l'accès " attribut manquant sur la lunette de la règle: nounphrase " dans la dernière ligne.

[Je suis toujours nouveau à Antlr et bien que certains grammates fonctionnent, il est toujours d'essai et d'erreur . J'obtiens aussi souvent une erreur "OutofMemory" lors de l'exécution de Grammars aussi petite que celle-ci - Toute aide Bienvenue.]

J'utilise des antlrworks 1.3 pour générer le code et que je cours sous Java 1.6. < / p>


0 commentaires

4 Réponses :


0
votes

Répondre à la question après avoir trouvé une meilleure solution ...

WS  :    (' '|'\t')+;
TOKEN   :   (('A'..'Z') | ('a'..'z'))+;
dttok   :   'DT' WS TOKEN;
nntok   :   'NN' WS TOKEN; 
nounPhrase :    (dttok WS nntok);
chunker :  nounPhrase ;


0 commentaires

4
votes

Dans le grammer d'origine, pourquoi ne pas inclure l'attribut qu'il demande, probablement: xxx

chacune de vos règles ( chende être celui que je peux tache rapidement) ont des attributs (informations supplémentaires) associées à eux. Vous pouvez trouver une liste rapide des différents attributs pour les différents types de règles à http://www.antlr.org/wiki/display/antlr3/attribute+anddynynamic+Copes , serait bien que des descriptions ont été placées sur la page Web pour chacun de ces attributs (comme pour L'attribut Start and Stop pour les règles d'analyseur se réfèrent aux jetons de votre Lexer - qui vous permettrait de revenir à votre numéro de ligne et à votre position).

Je pense que votre règle de chende devrait simplement être légèrement modifiée, à la place. de $ nounphrase Vous devez utiliser $ nounphrase.text . texte est un attribut pour votre nounphrase règle.

Vous voudrez peut-être faire un petit autre formatier également, généralement les règles d'analyseur (commencez par minuscule lettre) apparaissent avant les règles Lexer (commencez par la lettre majuscule)

ps. Lorsque je tapez dans la case, la règle du chende commence sur une nouvelle ligne mais dans ma réponse originale, il n'a pas démarré sur une nouvelle ligne.


1 commentaires

Pourriez-vous élucider plus loin, s'il vous plaît? Je ne suis pas sûr de ce qu'est un attribut



11
votes

"accès d'attributs manquant" signifie que vous avez référencé une portée ( $ nounphrase ) plutôt que d'un attribut la portée (telle que $ nounphrase. texte ).

En général, un bon moyen de résoudre les problèmes liés aux attributs consiste à examiner la méthode d'analyseur générée pour la règle en question.

Par exemple, ma tentative initiale à la création Une nouvelle règle quand j'étais un peu rouillée: xxx

a abouti à " Attribut inconnu pour la règle Nom complet ". J'ai donc essayé xxx

qui entraîne " Attribut manquant d'accès ". En regardant la méthode d'analyseur générée, il est clair que je devais tout ce que je devais faire. Bien qu'il y ait des morceaux cryptiques, les pièces pertinentes pour les scopes (variables) sont facilement comprises: xxx

après avoir examiné le code généré, il est facile de voir que le Nom complet la règle renvoie des instances de la classe nom , donc ce dont j'avais besoin dans ce cas était simplement: xxx

la version dont vous avez besoin. Dans votre situation peut être différent, mais vous serez généralement capable de le comprendre assez facilement en examinant le code généré.


0 commentaires

1
votes

Si vous faites accidentellement quelque chose de stupide comme $. $ Attribut où vous voulez dire $ chose.Attribute , vous verrez également le Attribut manquant de la règle Portée message d'erreur. (Je sais que cette question a été répondue il y a longtemps, mais ce bit de trivia pourrait aider quelqu'un d'autre qui voit le message d'erreur!)


0 commentaires