从元模型中读取文字

时间:2018-10-16 07:32:31

标签: textx

我想问一下是否可以从我的Python代码中读取我在元模型中定义的文字。最好用一个例子来解释。可以说这是我的元模型(受Entitiy示例启发):

EntityModel:
  entities+=Entity
;

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

EntityKeyword:
  'entity'
;

现在,如果我对此进行解析,则可以访问输入文件中定义的任何实体。但是我还希望能够读取EntityKeyword规则中定义的“实体”文字。我正在尝试这样做,以避免不得不在自己的代码中对值(“实体”)进行硬编码。

我无法找到一种方法来做到这一点。有可能吗?

我已经阅读了文档,并尝试使用内置对象。我没有运气。

我希望我有道理。

谢谢。

更新:

感谢您的回答-抱歉,我的回复很晚。

我现在看到我的例子很糟糕。对此我感到抱歉。

我玩弄了textX并阅读了更多文档,并遇到了本节:

“ textX与Python输入系统集成。在textX中,没有关键字返回。用于规则的类将为所有不匹配的规则动态创建Python类。语言设计者可以使用用户类注册来提供类如果规则为[match type],则它将始终为BASETYPES继承的规则返回Python字符串或某些基本Python类型。 Types used for rules

加粗的部分听起来很像我要达到的目标。我会尝试做的,但是如果您有时间的话,不然将不胜感激。

问候 DonHaugaard

1 个答案:

答案 0 :(得分:0)

所以,我找到了解决问题的方法。

我的问题是什么?我想避免对元模型中的任何文字进行硬编码。例如

EntityKeyword:
  'entity'
;

是一个简单的匹配类型类,它试图匹配文字“实体”。如果此关键字是对象的可选参数的名称,那么在执行“ hasattr(obj,'entity')”查找时,我将不得不在我的Python源代码中对该关键字进行硬编码。这意味着我要在两个地方维护一个关键字值-在我的元模型和源代码中。

我发现的解决方法很简单。我只是使用“ 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来替代任何关键字,因此元语言可能会被各种转义符($$)污染。

如果元语言很大,将它写在一个单独的文件中并作为字符串加载可能会更有意义。