当前位置: 首页 > 知识库问答 >
问题:

引用元素的XText格式规则

司凡
2023-03-14

我试图用一个简单的例子来描述这个问题。比方说,我有一个语法,看起来像这样:

Model:
    rules+=Rule*;

Rule:
    View | Element;

Element:
    'element' name=ID members+=Member members+=Member* 'end';

View:
    'view' name=ID 'for' forElement=[Element] 
    forMembers+=[Member] forMembers+=[Member]* 'end';

Member:
    'member' name=ID;

这种语言的一个简单例子是:

// Element is where the Members are instantiated
element Foo
    member bar
    member foobar
    member barfoo
    member something
end

// Views only reference the members by simple name
view FooView for Foo
    bar 
    foobar 
    something
end

我有一个自定义作用域提供程序,用于视图规则for成员属性:

class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {
    def scope_View_forMembers(View view, EReference reference) {
        Scopes.scopeFor(view.forElement.members);
    }
}

到目前为止一切都很好,我的问题是:

我也有一个格式化程序,我无法为引用的成员s添加规则:

class MyDslFormatter extends AbstractDeclarativeFormatter {

    @Inject extension MyDslGrammarAccess

    override protected void configureFormatting(FormattingConfig c) {

        // Rules for element: line breaks, indentation increment and decrement
        c.setLinewrap(1).after(elementAccess.nameAssignment_1)
        c.setLinewrap(1).after(elementRule)
        c.setIndentationIncrement.after(elementAccess.nameAssignment_1)
        c.setIndentationDecrement.before(elementAccess.endKeyword_4)

        // Rules for view: line breaks, indentation increment and decrement
        c.setLinewrap(1).after(viewAccess.forElementElementCrossReference_3_0)
        c.setLinewrap(1).after(viewRule)
        c.setIndentationIncrement.after(viewAccess.forElementElementCrossReference_3_0)
        c.setIndentationDecrement.before(viewAccess.endKeyword_6)

        //formatting for Member rule, only works, where Member rules are instantiated.
        c.setLinewrap(1).after(memberRule)
    }
}

如您所见,我已经为ElementView规则以及成员规则设置了格式。然而,成员规则的格式仅应用于实例化的地方(例如:Element声明)。当我运行此格式器(CtrlShiftF)时,我得到以下格式:

element Foo
    member bar
    member foobar
    member barfoo
    member something
end
view FooView for Foo
    bar foobar something end

然而,我希望所有被引用的成员也在一个新的行中。如何做到这一点?任何帮助都将不胜感激!

共有1个答案

牟黎昕
2023-03-14

成员在视图规则中被引用。必须在以下成员之后设置换行:

    c.setLinewrap(1).after(viewAccess.forMembersAssignment_4)
    c.setLinewrap(1).after(viewAccess.forMembersAssignment_5)
 类似资料:
  • 纵观全书,我们已经使用过一些诸如远程分支到本地引用的简单映射方式,但这种映射可以更复杂。 假设你添加了这样一个远程版本库: $ git remote add origin https://github.com/schacon/simplegit-progit 上述命令会在你的 .git/config 文件中添加一个小节,并在其中指定远程版本库的名称(origin)、URL 和一个用于获取操作的引

  • 我正在努力让交叉引用在我的DSL中工作。下面是语法的精简版本(标准示例DSL的修改版本): 因为我没有使用标准的模式,所以我跟随这篇关于如何创建自己的的博客文章: 从另一个答案来看,我认为我应该实现自己的范围提供程序: 我还在运行时模块中绑定了这些: 运行生成的编辑器时,我创建了一个如下所示的文件: 问题是(1)编辑器不会在扩展子句上自动完成,(2)编辑器显示错误消息的引用。 我错过了什么?

  • 从终端创建myDSL语法 起点,包含行列表 每一行都可以选择以LABEL开始,然后以关键字开始 这个语法适用于单引号中有空格的字符串。但是它有很多错误/警告 警告(200):/组织。xtext。实例mydsl/src gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl。g:309:3:决策可以使用多个选项匹配输入,例如“R

  • 我有下面这样的jaxb类,我希望我的xmlAdapter格式化日期值,我得到了异常? 原因:java。lang.RuntimeException:com。太阳xml。绑定v2。运行时。IllegalAnnotationsException:1 IllegalAnnotationExceptions计数无效@XmlElementRef:Type“class java.lang.String”或其任何

  • 我尝试在Xtext中定义浮点类型,但是我在生成ariti事实时收到错误消息: 我的浮动终端如下: 我的浮点是复制一个能够被Java接受的浮点:1.1、1、0.1

  • 我知道这方面有很多问题,但似乎没有任何帮助。使用键打开一个新的选项卡或窗口,这样元素就不会过时,这并没有任何作用。不会打开新选项卡。它什么也没做。我正在抓取一个网站,主页上有一个链接列表,我需要通过点击每个链接循环,并从每个链接获取数据。在第一次迭代之后,当它回到主页面时,元素显然已经过时了。这是我第一次使用Selenium,所以我为这个天真的问题道歉,但我已经被困了好几天了,现在我迫切需要一些帮