Acceleo - ссылка на другую модель

Я столкнулся с проблемой, и я немного в отчаянии:

Я пытаюсь преобразовать ограничение OCL в программу на С#. Для этого я определяю свои ограничения ocl в документе CompleteOCL и сохраняю его как Abstract Syntax: POC.ocl.oclas. Затем я использую Acceleo с метамоделью Pivot ('http://www.eclipse.org/ocl/2015/Pivot').

Однако общие операции OCL (например, «размер») определены в другой модели: в библиотеке. Поэтому, когда я пытаюсь восстановить операции, используемые в моей модели OCL, ничего не происходит, я могу восстановить только операцию, определенную в моем документе ocl.

Когда я открыл POC.ocl.oclas, у меня было две модели: модель POC.ocl + модель библиотеки. .

Я определил это поколение:

[comment encoding = UTF-8 /]
[module generate('http://www.eclipse.org/ocl/2015/Pivot','http://www.eclipse.org/ocl/2015/Library')]

[template public generateElement(aModel : Model)]
[comment @main/]
[file (aModel.name + 'xx', false, 'UTF-8')]
yo
[/file]
[/template]

И он генерирует только один файл: «POC.oclxx», а не «Library.oclxx».

Это привело нас к следующему вопросу: возможно ли в Acceleo сделать ссылку на другую модель (чем на основную)? И если есть, то как это сделать?


ПРИЛОЖЕНИЕ:

Код, который я написал:

[comment getCode() opération/]
[template public getCode(operationCallExp : pivot::OperationCallExp) post (trim())]
[operationCallExp.ownedSource.getCode()/] 
[operationCallExp.referredOperation.name/][operationCallExp.ownedArguments -> getArguments()/]
[/template]

Теоретически [operationCallExp.referredOperation.name/] дает мне название операции. На самом деле это ничего мне не дает, за исключением случаев, когда я определил операцию (и, следовательно, когда операция не исходит из библиотеки OCL)

Заранее спасибо !


Заархивированный проект: Archive_OCL_Acceleo

Папка POC содержит метамодель POC (POC.ecore), ограничение OCL для этой метамодели (POC.ocl) и ассоциированную модель Pivot (POC.ocl.oclas). Файлы, сгенерированные Acceleo, находятся в папке с файлами.

Папка POC_Acceleo содержит преобразование Acceleo (generate.mtl)


person Flora    schedule 29.05.2018    source источник


Ответы (2)


Судя по расширению файла *.oclas, я понимаю, что вы используете абстрактный синтаксис Eclipse OCL на основе Pivot.

Моя первая попытка генерации кода Java из OCL использовала Acceleo, но я отказался от нее по разным причинам, не последней из которых является то, что шаг от OCL AS к коду Java слишком велик, чтобы его можно было выполнить за один шаг M2T. Хотя Java (и, без сомнения, C#) обманчиво похожа на OCL, что делает привлекательным простой текстовый перевод на основе шаблонов, этот подход обречен на поддержку лишь скромного языкового подмножества. Генерация реального кода требует реального анализа, такого как устранение общих подвыражений, и это приводит к конфликту между сохраненным исходным кодом и переписанным исходным кодом, если вы переписываете исходный код.

Текущий генератор Eclipse OCL to Java (моя третья попытка) использует промежуточную модель CG, в которой происходят перезаписи. Он предназначен для перенацеливания на C (или C# или...). У меня много планов на более высокий уровень автогенерации в моей следующей (четвертой) попытке с дополнительной промежуточной моделью Java (или C, или C#, или...), чтобы отделить сериализацию "тривиального" текстового языка от нетривиального языка. синтез понятий.

Если вас интересует серьезный, а не упрощенный пример инструмента для генерации C#, я настоятельно рекомендую вам взглянуть на Eclipse OCL CG. Если вы хотите работать совместно, чтобы сделать его лучше, и рады сделать ваши вклады доступными в рамках EPL, то, возможно, мы можем что-то устроить.

person Ed Willink    schedule 29.05.2018
comment
Спасибо за совет :) Я выбрал Acceleo, потому что уже пользовался им раньше, и мне он кажется намного проще. Однако я думаю, что буду искать модель компьютерной графики, как вы сказали. Но на самом деле я не собираюсь создавать полный генератор OCL для C#, поэтому я надеюсь, что это не будет так сложно. Из любопытства, не знаете ли вы, есть ли решение моей проблемы с Acceleo: может ли Acceleo обрабатывать ссылки на другую модель, а не на основную? - person Flora; 31.05.2018

Вы используете последний код? Я помню, как недавно исправлял пару ошибок, связанных с отсутствующим «косметическим» контентом модели AS.

person Ed Willink    schedule 29.05.2018
comment
Действительно, я использую последний код. Модель ocl имеет ссылки на модель библиотеки, но модель библиотеки не загружается в Acceleo... - person Flora; 31.05.2018
comment
Под последним я подразумеваю выпуск Photon M7/RC1/RC2. Если вы предоставите заархивированный проект, я увижу, есть ли что-то очевидное. - person Ed Willink; 31.05.2018
comment
Извините за поздний ответ, до сегодняшнего дня у меня не было доступа к файлам. Я использую Eclipse Oxygen (выпуск (4.7.3a)) и версию Acceleo «3.7.2.201708211328». Я также пробовал с пакетом Photon, но мне это не удалось. Я отредактировал свой вопрос и прикрепил заархивированный проект. На самом деле спасибо за ваше время и хорошего дня. - person Flora; 06.06.2018
comment
Извиняюсь. Я недостаточно умен, чтобы загрузить вашу ссылку на свой компьютер; кажется, он настаивает на использовании GoogleDrive или других технологий, которых я избегаю. - person Ed Willink; 06.06.2018
comment
О, извините, я не подумал об этом. Сейчас он размещен на github, так лучше? (Я должен был подумать о git раньше, но я не знаю, почему это не пришло мне в голову) - person Flora; 06.06.2018
comment
(Кажется, у меня есть неизменная способность не использовать незнакомую технологию; электронная почта и группы новостей/форумы Eclipse поддерживают вложения, и они обычно работают.) Acceleo_Problem_Reference.zip не является действительным архивом. - person Ed Willink; 07.06.2018
comment
Я разместил свою проблему на форуме Eclipse, сообщение в настоящее время находится на модерации. Надеюсь на этот раз приставка сработает! Я опубликую здесь ссылку на пост, когда пост будет доступен на форуме Eclipse. - person Flora; 07.06.2018