2015-03-30 4 views
0

Je suis très nouveau à Xtext/Xtend, donc excuses à l'avance si la réponse est évidente. Je voudrais permettre aux utilisateurs finaux de mon DSL de définir un «filtre», que lorsqu'il est appliqué et «renvoie» vrai, cela signifie qu'ils veulent «filtrer» l'entité donnée des données de considération.xtext inferrer: plusieurs entités

Je veux leur permettre 2 façons de définir le filtre

A) par introspectant les attributs d'un objet de données donné et appliquer des règles de base comme

if (obj.field1<CURRENT_DATE && obj.field2=="EXPIRED) 
{ return true;} else {return false;} 

B) en exécutant un extrait contrôlé à l'aide « eval » de ma langue hôte

en d'autres termes, l'utilisateur s'attendre à taper dans un bloc chaîne/code un code valide

s nippet de la langue d'hébergement

j'avais décidé que la meilleure façon pour moi Ossature A) serait de tirer parti des règles de XBase (y compris les expressions/etc)

Par conséquent, je définis les filtres (copie la plupart du temps les idées de Lorenzo livre)

Filter: 
(FilterDSL | FilterCode); 


FilterDSL: 

'filterDSL' (type=JvmTypeReference)? name=ID 
'(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' 
body=XBlockExpression ; 


FilterCode: 
    'filterCode' (type=JvmTypeReference)? name=ID 
    '(' (params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')' 
'{'  
    body=STRING 
'}'; 

maintenant, en essayant de mettre en œuvre la cartographie Java pour mon ADSL, via le talon de inferrer dans Xtend - Je suis en cours d'exécution dans de multiples problèmes.

Tous indiquent probablement que je manque une compréhension fondamentale

Problème 1) fl.body n'est pas défini. fl est de type Filter, pas FilterDSL ou FilterCode

Et je ne comprends pas comment vérifier le type d'une instance donnée, de sorte que je peux accéder au contenu d'une fonction 'body'.

Problème 2) Je ne comprends pas où l'attribut 'body' dans la méthode inferrer est défini et pourquoi. Est-ce que cette partie d'ECore? (Je ne pouvais pas le trouver)

Problème 3) Quelle est la bonne façon de permettre à un utilisateur de spécifier un bloc de code? Chaîne semble ne pas être la bonne chose car il ne convertit permet multiligne

Problème 4) pas Comment correctement un bloc de code dans quelque chose qui est accepté par le tel « corps » qu'il finit dans le code généré .

Problème 5) Comment configurer plusieurs inferrers (comme je l'ai plus d'une chose pour laquelle j'ai besoin du code généré (la plupart du temps) par le générateur de code xBase)

Appréciez à l'avance des suggestions, ou pointeur coder des exemples résolvant des problèmes similaires. En guise d'observation secondaire, Inferrer et son interaction avec XBase a été la chose la plus difficile à comprendre.

Répondre

1

en général: un regard sur les Xtend docs à xtend-lang.org

  1. Vous pouvez faire un if (x type instanceof) ou une instruction switch avec des gardes de type (voir l'exemple de modèle de domaine)

  2. Je ne comprends pas cette question. vos ECLasses FilterDSL et FilterCode doivent toutes deux avoir un corps + getter/setter nommé body, FilterCode de type String, FilterDSL de type XBlockExpression. Le JvmTypesBuilder ajoute des méthodes d'extension à JvmOperation appelées setBody (String) et setBody (XExpression), la syntaxe sugar vous permet d'appeler body = .... au lieu de setBody (...) (btw vous pouvez faire crtl + click pour savoir où une chose est définie)

  3. cordes sont en fait multiligne

  4. a été repris sur (2)

  5. vous ne avez pas besoin de plusieurs inferrers, vous pouvez déduire plusieurs choses, par exemple en appelant toClass ou toField plusieurs fois pour la même entrée

+0

merci. Je vois que l'inferrer est appelé pour toutes les instances d'objet dans ma grammaire, pas seulement le filtre (j'ai supposé incorrectement qu'il serait invoqué juste pour ce que j'avais spécifié dans la déclaration de méthode, mais ce n'est pas le fonctionnement dynamique). Cela a également expliqué pourquoi dans le débogueur j'avais depuis des entrées sans l'attribut 'body' –