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.
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' –