2015-03-30 3 views
0

Я очень новичок в Xtext/Xtend, поэтому извиняюсь заранее, если ответ очевиден.xtext inferrer: несколько объектов

Я бы хотел, чтобы конечные пользователи моей DSL определяли «фильтр», который при применении и «возвращает» true означает, что они хотят «отфильтровать» данную сущность данных из соображений.

Я хочу, чтобы позволить им 2 способа определения фильтра

А) интроспекции атрибуты данного объекта данных и применять основные правила, как

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

B), выполнив контролируемый фрагмент кода, используя «Eval» моего языка принимающей

другими словами, пользователь будет ожидать ввести в строку/блока кода действительный

код ов nippet языка хостинга

я решил, что самый простой способ для меня поддержать случай А) будет использовать правила XBase (включая выражение/и т.д.)

Поэтому я определил фильтры (в основном копируют идеи от Лоренца книга)

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 
'}'; 

Теперь при попытке реализовать отображение Java для моего DSL, через inferrer окурок в Xtend - Я бегу на несколько проблем.

Все они, вероятно, свидетельствуют о том, что мне не хватает какой-то фундаментальное понимание

Проблема 1) fl.body не определен. fl Is типа Filter, а не FilterDSL или FilterCode

И я не понимаю, как проверить, какой тип имеет данный экземпляр, так что я могу получить доступ к содержимому функции «тело».

Проблема 2) Я не понимаю, где определяется атрибут body в методе inferrer и почему. Является ли эта часть ECore? (Я не смог найти)

Проблема 3) Каков правильный способ дать пользователю возможность указать блок кода? Строка, кажется, не правильно, поскольку это не позволяет многострочный

Задача 4) Как правильно преобразовать блок кода в то, что принято в «тело» таким образом, что она заканчивается в сгенерированном коде ,

Задача 5) Как настроить несколько inferrers (как у меня есть более чем одну вещь, для которой мне нужно код, сгенерированный (в основном) с помощью генератора кода XBase)

Цените заранее какие-либо предложения, или указатель для кодирования примеров, разрешающих подобные проблемы.

Как стороннее наблюдение, Inferrer и его взаимодействие с XBase были очень сложными и трудными для понимания.

ответ

1

вообще: есть взглянуть на Xtend документы на xtend-lang.org

  1. Вы можете сделать, если (х тип InstanceOf) или переключатель заявление с типом охраны (смотри пример модели предметной области)

  2. У меня нет этого вопроса. и ваши фильтры FilterDSL и FilterCode должны иметь поле + getter/setter с именем body, FilterCode типа String, FilterDSL типа XBlockExpression. JvmTypesBuilder добавляет методы расширения в JvmOperation, называемые setBody (String) и setBody (XExpression), синтаксический сахар позволяет вам называть body = .... вместо setBody (...) (кстати, вы можете сделать crtl + click, чтобы узнать, где вещь определена)

  3. строки фактически многострочный

  4. отвечает на (2)

  5. вам не нужно несколько inferrers, вы можете вывести несколько вещей, например, путем вызова toClass или toField несколько раз для того же входа

+0

спасибо. Я вижу, что inferrer вызывается для всех экземпляров объектов в моей грамматике, а не только для фильтра (я неправильно предположил, что он будет вызван только для того, что я указал в объявлении метода, но это не так, как работает динамическая отправка). Это также объясняет, почему в отладчике, который у меня был с входом без атрибута body –

Смежные вопросы