2008-11-25 5 views
3

Espérons que c'est un très rapide;) J'ai écrit une spécification lexer/parser dans ANTLR3, et je cible la cible CSharp2. Le code généré fonctionne correctement, mais je ne peux pas obtenir ANTLR pour mettre la sortie C# dans un espace de noms.ANTLR v3 espaces de noms #

La section pertinente du fichier grammaire est la suivante:

grammar MyGrammar; 

options 
{ 
    language = CSharp2; 
    output = AST; 
    ASTLabelType = CommonTree; 
} 

Pour générer l'espace de noms correct, je l'ai essayé:

@namespace { MyNamespace } 

et

@lexer::namespace { MyNamespace } 
@parser::namespace { MyNamespace } 

mais les deux ceux-ci génèrent des erreurs, affirmant que le fichier n'a pas de règles.

Toute aide est appréciée.

Répondre

5

J'utilise cela pour un lexer combiné et analyseur (et il génère l'espace de noms correctement):

grammar Test; 

options 
{ 
    language=CSharp2; 
} 

@lexer::namespace { 
    My.Name.Space 
} 

@parser::namespace { 
    My.Name.Space 
} 


DIGIT : '0'..'9'; 

simple : DIGIT EOF; 

Alors je me demande pourquoi votre version ne fonctionne pas - peut-être vous voulez essayer cet exemple simple et voir si cela fonctionne pour vous.

4

Il semble que la directive @namespace doive être placée APRES le bloc tokens {}. Tout bien maintenant ...

+0

Ouais, je pensais que la manière dure. Presque sorti tous mes cheveux. – Charles

+0

ANTLR aspire vraiment à donner des messages d'erreur appropriés .. –

2

Avec language = 'CSharp3'; (et CSharp2 aussi bien), vous pouvez le faire:

@lexer::namespace { 
    My.Name.Space 
} 

@parser::namespace { 
    My.Name.Space 
} 

qui génère:

} // namespace 
My.Name.Space <-- compile error here 

à la fin de lexer et le code de l'analyseur. Si je vous écris:

@lexer::namespace {My.Name.Space} 

@parser::namespace {My.Name.Space} 

il fonctionne très bien et génère:

} // namespace My.Name.Space <-- within the line comment, no error of course 
+0

Merci pour le montage - même si tard ^^ – Rainer