首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从元模型读取文字

从元模型读取文字
EN

Stack Overflow用户
提问于 2018-10-16 07:32:31
回答 1查看 69关注 0票数 0

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

代码语言:javascript
复制
EntityModel:
  entities+=Entity
;

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

EntityKeyword:
  'entity'
;

现在,如果我解析这一点,我将可以访问在输入文件中定义的任何实体。但我也希望能够读取EntityKeyword规则中定义的“实体”文本。为了避免在我自己的代码中硬编码值('entity'),我尝试这样做。

我一直没有办法做到这一点。有可能吗?

我已经阅读了文档,也尝试过使用内置对象。我一点运气都没有。

我希望我能理解。

谢谢。

更新:

谢谢你的回答-很抱歉我的回答太晚了。

我现在明白了我的榜样是坏的。对此我很抱歉。

我玩过textX,阅读了更多的文档,并了解了这一节:

"textX与Python系统集成。在textX中没有关键字返回。用于该规则的类将动态地为所有不匹配的规则创建Python类。语言设计器可以使用在元模型上注册的用户类提供类。如果规则是匹配类型的,则返回字符串或BASETYPES继承规则的一些基本Python类型。__“用于规则的类型

这个部分听起来很像我想要达到的目标。我会尝试这样做,但如果你有时间的话,我会非常感激这方面的一个例子。

看待DonHaugaard

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-30 08:03:20

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

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

代码语言:javascript
复制
EntityKeyword:
  'entity'
;

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

我找到的解决方案很简单,真的。我只是使用"metamodel_from_str()“从字符串加载元模型。这看起来怎么样?:

代码语言:javascript
复制
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来替换任何关键字。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52830145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档