我想问一下是否可以从我的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
答案 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来替代任何关键字,因此元语言可能会被各种转义符($$)污染。
如果元语言很大,将它写在一个单独的文件中并作为字符串加载可能会更有意义。