Читать буквально из метамодели - PullRequest
0 голосов
/ 16 октября 2018

Я хочу спросить, возможно ли прочитать - из моего кода Python - литерал, который я определил в метамодели.Это может быть лучше всего объяснено на примере.Допустим, это моя метамодель (вдохновленная примером Entitiy):

EntityModel:
  entities+=Entity
;

Entity:
  EntityKeyword name=ID '{'
    attributes+=Attribute
  '}'
;

EntityKeyword:
  'entity'
;

Теперь, если я проанализирую это, у меня будет доступ ко всем сущностям, которые были определены во входном файле.Но я также хочу иметь возможность читать литерал «entity», который определен в правиле EntityKeyword.Я пытаюсь сделать это, чтобы избежать жесткого кодирования значения («сущности») в моем собственном коде.

Мне не удалось найти способ сделать это.Возможно ли это?

Я прочитал документацию, а также пробовал встроенные объекты.У меня не было никакой удачи.

Надеюсь, я что-то понимаю.

Спасибо.

ОБНОВЛЕНИЕ:

Спасибо за ответы - и извините замой поздний ответ.

Теперь я вижу, что мой пример был плохим.Я прошу прощения за это.

Я поиграл с textX, прочитал еще несколько документов и наткнулся на этот раздел:

"textX интегрируется с системой ввода Python.textX нет возвращаемых ключевых слов. Класс, используемый для правила, будет динамически создаваться классом Python для всех несоответствующих правил. Разработчик языка может предоставить класс с помощью регистрации пользовательских классов в мета-модели. Если правило имеет значение [matchtype], чем всегда будет возвращать строку Python или некоторые базовые типы Python для унаследованных правил BASETYPES." Типы, используемые для правил

Выделенная часть звучит очень многокак то, что я пытаюсь достичь.Я постараюсь сделать это, но в противном случае очень ценю пример этого - если у вас есть время для этого.

С уважением, ДонХаугард

1 Ответ

0 голосов
/ 30 октября 2018

Итак, я нашел решение своей проблемы.

В чем заключалась моя проблема?Я хотел избежать жесткого кодирования любого литерала в моей метамодели.Например,

EntityKeyword:
  'entity'
;

- это простой тип соответствия, который пытается сопоставить литерал «сущность».Если это ключевое слово является именем необязательного параметра для объекта, то при выполнении поиска "hasattr (obj, 'entity')" мне пришлось бы жестко закодировать это ключевое слово в моем исходном коде Python.Это означает, что у меня есть значение ключевого слова, которое нужно поддерживать в 2 местах - в моей метамодели и в моем исходном коде.

Решение, которое я нашел для этого, действительно простое.Я просто загружаю метамодель из строки, используя "metamodel_from_str ()".Как бы это выглядело?:

from string import Template
from textx.metamodel import metamodel_from_str

EXTEND_KEYWORD = 'entity'  
GRAMMAR=Template("""
EntityKeyword:
    '$ext_keyword'
;
""").substitute(ext_keyword=EXTEND_KEYWORD)

stackoverflow_mm = metamodel_from_str(GRAMMAR)

Здесь я определяю свою метамодель как строку и использую string.Template (https://docs.python.org/3/library/string.html#template-strings) для подстановки любых ключевых слов. После этого я могу загрузитьметамодель в виде строки. Теперь мне нужно только поддерживать один литерал (атрибут «EXTEND_KEYWORD»), и я могу свободно делать «hasattr (obj, EXTEND_KEYWORD)».

Недостатком этого подхода являетсяконечно, что мета-язык может быть загрязнен различными выходами ($$), так как я использую string.Template для подстановки любых ключевых слов.

Если мета-язык большой, было бы более разумно написать его вотдельный файл и загрузите его как строку.

...