2009-10-09 8 views
1

Nous utilisons Antlr StringTemplates pour contrôler la façon dont le nom d'une entité est généré.Conditionnels dans les gabarits de chaîne Antlr

Le StringTemplate de base est

$ FirstName $ $ initial lastname $ de $ $, $ Suffixe $, $ Degree

$

Je veux ajouter quelques smarts à ce modèle afin que la les virgules ne sont sorties que lorsque cela est nécessaire, c'est-à-dire que la première virgule n'est sortie que lorsqu'il y a un Suffixe ou un Degré et que la deuxième virgule n'est sortie que s'il y a un suffixe.

J'ai essayé le bit de chaîne de modèle suivant cela ne fonctionne pas. Je suppose que je l'ai mal compris

$ FirstName $ $ initial LastName $ $ $ < si (Suffixe | Degree) >, <endif>, Suffixe $ < $ si (Suffixe) >, <endif> $ Degré

$

Si elle aide nous traitons les modèles utilisant cette C#

StringTemplate stringtemplate = new Antlr.StringTemplate.StringTemplate(template.Data); 

foreach (Pair<string, string> pair in dictionary) 
{ 
    if (pair.First != null && pair.Second != null) 
    { 
     stringtemplate.SetAttribute(pair.First, pair.Second); 
    } 
} 

return stringtemplate.ToString(); 

Répondre

1

Utiliser $ FirstName $ $ initial $ LastName $ $ si (Suffixe) $, Suffixe $ $ $ endif $ $ si (Degree) $, $ Degree $ $ endif $

N

+0

Damnit Je savais que j'étais proche! –

1

Il suffit d'utiliser le séparateur en vous Modèle de chaîne comme: $ FirstName, séparateur = " "$ $ initial, séparateur =","

$ Cela pourrait ne pas Soyez la réponse exacte, mais vous pouvez essayer d'utiliser séparateur pour séparer le prénom avec initiale et la virgule sera insérée seulement si vous avez une deuxième valeur. Dites si vous itérez sur un ensemble de prénoms et d'initiales, la virgule ne viendra que si vous avez des initiales.

Questions connexes