4 votes

Comment passer le paramètre CommonTree à une règle Antlr

Je suis en train d'essayer de faire ce que je pense être un simple passage de paramètre à une règle dans Antlr 3.3 :

grammaire rule_params;

options
{
    output = AST;
}

rule_params
    :   extérieur;

extérieur :  extérieur_id '[' inner[$outer_id.tree] ']';

inner[CommonTree parent]    :   inner_id '['  ']';

extérieur_id : '#'! ID;

inner_id : '$'! ID ;

ID   :  ('a'..'z' | 'A'..'Z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' )* ;

Donc le inner[CommonTree parent] génère le suivant :

inner4=inner((outer_id2!=null?((Object)outer_id2.tree):null));

ce qui entraîne cette erreur :

La méthode inner(CommonTree) dans le type rule_paramsParser n'est pas applicable pour les arguments (Object)

Autant que je puisse le dire, c'est exactement la même chose que l'exemple dans le livre Antrl :

classDefinition[CommonTree mod]

(Emplacement Kindle 3993) - désolé je ne connais pas le numéro de page mais c'est au milieu du livre dans le chapitre 9, section intitulée "Creating Nodes with Arbitrary Actions".

Merci pour toute l'aide.

M

3voto

Bart Kiers Points 79069

Si vous ne spécifiez pas explicitement l'arbre à utiliser dans votre grammaire, .tree (qui est l'abréviation de getTree()) renverra un java.lang.Object et un CommonTree sera utilisé comme implémentation par défaut de l'arbre. Pour éviter le cast, définissez le type d'arbre dans votre section options { ... } :

options
{
    output=AST;
    ASTLabelType=CommonTree;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X