我试图用一个简单的例子来描述这个问题。比方说,我有一个语法,看起来像这样:
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)
}
}
如您所见,我已经为Element
和View
规则以及成员
规则设置了格式。然而,成员
规则的格式仅应用于实例化的地方(例如:Element
声明)。当我运行此格式器(CtrlShiftF)时,我得到以下格式:
element Foo
member bar
member foobar
member barfoo
member something
end
view FooView for Foo
bar foobar something end
然而,我希望所有被引用的成员也在一个新的行中。如何做到这一点?任何帮助都将不胜感激!
成员在视图规则中被引用。必须在以下成员之后设置换行:
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,所以我为这个天真的问题道歉,但我已经被困了好几天了,现在我迫切需要一些帮