Xtext кардинальная метамодель - PullRequest
0 голосов
/ 06 марта 2019

В настоящее время я работаю над проектом, в котором я создаю модель объектов из грамматики Xtext. Моя задача - преобразовать грамматический синтаксис в файл CSV, импортируемый в плагин eclipse pure :: Варианты.

Функциональная модель - это базовое дерево функций. Эти функции бывают разных типов (обязательные, необязательные, альтернативные и т. Д.).

Для построения дерева я использую сгенерированную метамодель ecore моего синтаксиса грамматики xtext. Этот файл (.ecore) в основном представляет собой XML-файл с объектами грамматики. Это последовательно, просто и легко создать дерево из.

Моя проблема в том, что мне нужно назначить типы (обязательные, альтернативные и т. Д.) Узлам моего созданного дерева. Эти типы функций соответствуют количеству операторов. Эти операторы записаны в грамматике xtext следующим образом: ´ (без оператора) ´, ´? ´, ´ * ´ и ´ + ´ (это можно увидеть в разделе 2.1.3 * 1008 руководства пользователя xtext) Проблема в том, что эти кардинальности грамматики xtext, кажется, нигде не найти. Я думал, что они появятся в файлах .ecore или .genmodel, но кардинальности нет вообще.

Я полагаю, что если xtext способен проверять и контролировать эти кардинальности, он должен иметь какую-то метамодель, где эти кардинальности можно увидеть и легко получить (что-то вроде XML-файла, похожего на .ecore или .genmodel). файл).

Итак, мой вопрос: существует ли какой-нибудь файл, сгенерированный xtext, который содержит эти числа элементов? Если нет, мне бы пришлось каким-то образом вывести эти кардинальности из самой грамматики, но это было бы излишне трудоемким и сложным, возможно, даже невозможным, потому что написанная грамматика не полностью соответствует метамодели ecore. Я получаю свое дерево функций и действительно сложный.

Только сгенерированный файл, который мне удалось найти, который содержит что-то «возможно полезное», это сгенерированный файл XXXXGrammarAccess.java (XXXX обозначает название грамматики), который является сложным сгенерированным файлом, с большим количеством библиотечных зависимостей, и у меня есть не знаю, как извлечь из этого кардинальность или если это вообще возможно. Я предполагаю, что есть возможность, потому что этот файл использует много методов IGrammarAccess, таких как getRule (), getKeyword () и другие, но я не могу использовать этот файл или распечатать что-то из него, потому что это сгенерированный файл, и я не могу запустить его сам.

Если нет какой-либо метамодели, которую я ищу, есть ли возможность каким-то образом получить эти кардинальные значения во время генерации?

Большое спасибо за ваши ответы.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Грамматика Xtext сама по себе является моделью, экземпляром http://www.eclipse.org/2008/Xtext. (Раньше это можно было продемонстрировать, открыв файл * .xtext с помощью Sample Reflective Ecore Editor, но, к сожалению, с использованием classpath: URI снова его сломали.) Тем не менее, вы можете программно открыть файл * .xtext как EMF Resource и увидеть все, что есть в грамматике. См. https://git.eclipse.org/c/ocl/org.eclipse.ocl.git/tree/examples/org.eclipse.ocl.examples.xtext2lpg/src/org/eclipse/ocl/examples/xtext2lpg/xtext2xbnf.qvto о первом этапе цепочки преобразований, которая начинается с чтения грамматики Xtext и заканчивается грамматикой LPG.

0 голосов
/ 06 марта 2019

Прежде всего кардинальности в метамодели и грамматике не должны совпадать на 100%. проверка мощности в парсере отличается от проверки в ecore.

нижняя мощность 1 (для обязательных) не существует, чтобы предотвратить действительно ужасные сообщения об ошибках. хотя: 1 или: -1 (= *) отражается в экоре.

это было преднамеренное решение, когда Xtext был создан 10 лет назад.

доступ к грамматике просто дает вам доступ к грамматике во время выполнения.

Вы можете уточнить, почему вы на самом деле заботитесь?

...