textX:如何使用ObjectProcessors生成对象名称?

textX:如何使用ObjectProcessors生成对象名称?,textx,Textx,我有一个简单的示例模型,我想为位置规则的对象生成名称,这些对象没有使用as命名。这是必需的,以便我以后可以使用内置的FQN作用域提供程序找到它们 我的想法是在position\u name\u generator对象处理器中执行此操作,但只有在解析整个模型后才会调用此操作。我真的不明白为什么会这样,因为当我在项目中需要一个位置对象时,对象已经创建了,仍然不会调用对象处理器 另一个想法是在Position.location的自定义作用域提供程序中执行此操作,该提供程序将首先生成名称,然后使用内置F

我有一个简单的示例模型,我想为
位置
规则的对象生成名称,这些对象没有使用
as
命名。这是必需的,以便我以后可以使用内置的FQN作用域提供程序找到它们

我的想法是在
position\u name\u generator
对象处理器中执行此操作,但只有在解析整个模型后才会调用此操作。我真的不明白为什么会这样,因为当我在
项目中需要一个
位置
对象时,对象已经创建了,仍然不会调用对象处理器

另一个想法是在
Position.location
的自定义作用域提供程序中执行此操作,该提供程序将首先生成名称,然后使用内置FQN查找
location
对象。虽然这是可行的,但我认为这是一个错误,我宁愿避免。 textX解决这个问题的方法是什么

(请注意,这只是一个小例子。实际上,一个相当大和复杂的模型需要类似的功能。由于这是一项要求,所以不可能使用生成的名称更改此行为。)

导入textx
MyLanguage=“”
模型
:(位置+=位置)*
(雇员+=雇员)*
(职位+=职位)*
(项目+=项目)*
;
项目
:“项目”名称=ID
('{'
('use'use=[Position])*
'}')?
;
位置
:'define''position'employee=[employee | FQN]'->'location=[location | FQN]('as'name=ID)?
;
雇员
:'employee'name=ID
;
位置
:“location”name=ID
( '{'
(子位置+=位置)+
'}')?
;
FQN
:ID('.'ID)*
;
评论:
/\/\/.*$/
;                
"""
MyCode=“”
位置建筑
{
位置入口
位置出口
}
雇员汉斯
雇员尤尔根
//应使用给定的名称“Guy”
将位置->建筑入口定义为入口
//应使用自动生成的名称“At”引用
定义位置Juergen->Building.Exit
项目安全项目
{
用这个家伙
使用JuergenAtExit
}
"""
def位置名称发生器(obj):
如果“”==obj.name:
obj.name=obj.employee.name+“位于”+obj.location.name
def main():
meta_model=textx.metamodel_from_str(MyLanguage)
meta\u model.register\u scope\u providers({
“Position.location”:textx.scoping.providers.FQN(),
})
meta_model.register_obj_处理器({
“位置”:位置\u名称\u生成器,
})
模型=元模型。模型来自(MyCode)
断言模型,“无法创建模型…”
如果“\uuuu main\uuuuuu”==\uuuuuuuu name\uuuuuuu:
main()
解决这个问题的textx方法是什么。。。 您描述的用例是基于其他模型元素定义对象的名称,包括对其他模型元素的引用。这目前不是我们的测试套件和textx docu中包含的任何测试和用例的一部分

对象处理器在模型构建期间的定义阶段执行(请参见)。在所述设置中,它们在参考解析后执行。由于要定义/推导的名称本身是参考解析所必需的,此处不能使用对象处理器(即使我们允许控制在范围解析之前或之后执行对象处理器的时间,所述设置仍将不起作用)

考虑到模型加载的动态性(请参见),解决方案位于范围提供程序中(如您所建议的)。在这里,我们允许控制引用解析的顺序,以便推迟对由自定义过程命名的对象的引用,直到推导/定义解析的名称所需的引用

可能的解决办法 关于如何解决您的用例的初步草图将在A中讨论(附带一个问题)。此textx PR包含一个可能用于项目的scoping.py版本(只需复制并重命名模块)。一个成熟的解决方案可能是textx-TEP-001的一部分,我们计划让最终用户更容易控制范围

这一非常有趣的问题向我揭示了textx框架的新方面

  • 依赖于模型内容的名称(涉及未解析的引用)。根据我们的参考解析逻辑,此名称解析可以推迟(在参考PR中,见下文)
  • 更有趣的是这样做的后果:指向未解析名称所在位置的引用会发生什么情况?在这里,我们必须推迟引用解析过程,因为我们无法知道解析时名称是否匹配

您的示例包括:

我不理解您答案的以下部分:
(即使我们允许控制对象处理器的执行时间,在范围解析之前或之后,所描述的设置仍然不起作用)。
我认为在我的用例中,如果对象处理器用于“位置”就足够了将在对象的引用解析完成后调用。不按从上到下的顺序处理(解析)引用。引用解析可以延迟,因此不可能定义在单个元素的引用解析之后调用对象处理器(以简单的方式)。此时,在解析所有引用后调用对象处理器。我们曾讨论过在引用解析之前执行某些对象处理器,但我们没有找到它的好用例(而且它也解决不了问题)