我想问问是否有可能从我的Python代码中读取我在元模型中定义的文字。最好用一个例子来解释这一点。让我们说这是我的元模型(受实体示例的启发):
EntityModel:
entities+=Entity
;
Entity:
EntityKeyword name=ID '{'
attributes+=Attribute
'}'
;
EntityKeyword:
'entity'
;现在,如果我解析这一点,我将可以访问在输入文件中定义的任何实体。但我也希望能够读取EntityKeyword规则中定义的“实体”文本。为了避免在我自己的代码中硬编码值('entity'),我尝试这样做。
我一直没有办法做到这一点。有可能吗?
我已经阅读了文档,也尝试过使用内置对象。我一点运气都没有。
我希望我能理解。
谢谢。
更新:
谢谢你的回答-很抱歉我的回答太晚了。
我现在明白了我的榜样是坏的。对此我很抱歉。
我玩过textX,阅读了更多的文档,并了解了这一节:
"textX与Python系统集成。在textX中没有关键字返回。用于该规则的类将动态地为所有不匹配的规则创建Python类。语言设计器可以使用在元模型上注册的用户类提供类。如果规则是匹配类型的,则返回字符串或BASETYPES继承规则的一些基本Python类型。__“用于规则的类型。
这个部分听起来很像我想要达到的目标。我会尝试这样做,但如果你有时间的话,我会非常感激这方面的一个例子。
看待DonHaugaard
发布于 2018-10-30 08:03:20
所以,我找到了解决问题的办法。
我的问题是什么?我想避免在我的元模型中硬编码任何文字。例如。
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来替换任何关键字。
如果元语言很大,那么将其写入单独的文件并将其作为字符串加载可能更有意义。
https://stackoverflow.com/questions/52830145
复制相似问题