从元模型中读取文字



我想问一下是否可以从我的Python代码中读取我在元模型中定义的文字。这可以用一个例子来最好地解释。假设这是我的元模型(灵感来自 Entitiy 示例(:

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

现在,如果我解析它,我将可以访问输入文件中定义的任何实体。但我也希望能够阅读 EntityKeyword 规则中定义的"实体"文本。我正在尝试这样做,以避免必须在我自己的代码中对值("实体"(进行硬编码。

我一直无法找到这样做的方法。可能吗?

我已经通读了文档,并尝试了内置对象。我没有任何运气。

我希望我有任何意义。

谢谢。

更新:

感谢您的回答 - 对不起我迟到的责任。

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

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

"textX与Python打字系统集成。在 textX 中,没有关键字返回。用于规则的类将是为所有非匹配规则动态创建的 Python 类。语言设计者可以在元模型上使用用户类注册来提供类。如果规则是[匹配类型],那么它将始终返回Python字符串或BASETYPES继承规则的一些基本Python类型。用于规则的类型

粗体部分听起来很像我想要实现的目标。我会尝试这样做,但否则将非常感谢一个例子 - 如果你有时间的话。

问候 唐豪加德

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

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

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)

我在这里所做的是将我的元模型定义为字符串并使用字符串。模板 (https://docs.python.org/3/library/string.html#template-strings( 替换任何关键字。之后,我能够将元模型加载为字符串。现在我只需要维护一个文字(属性"EXTEND_KEYWORD"(,我可以自由地做"hasattr(obj,EXTEND_KEYWORD("。

这种方法的一个缺点当然是元语言可能会被各种转义($$(污染,因为我使用的是字符串。用于替换任何关键字的模板。

如果元语言很大,那么将其写入单独的文件中并将其加载为字符串可能更有意义。

最新更新