Eclipse rcp 带后视功能的XText DSL
我一直在用XText编写DSL。让我们假设我想解析如下内容:Eclipse rcp 带后视功能的XText DSL,eclipse-rcp,dsl,xtext,Eclipse Rcp,Dsl,Xtext,我一直在用XText编写DSL。让我们假设我想解析如下内容: A { B, //this comma is needed C, D {E}, //comma is optional after a closing curly brace F {G} H } I, J 它应该由类型Model和Class表示,其中Model包含一个类列表 我目前拥有的是: Model: (classes += Class)* Class: name = ID ('{' (subclasses
A {
B, //this comma is needed
C,
D {E}, //comma is optional after a closing curly brace
F {G}
H
}
I,
J
它应该由类型Model和Class表示,其中Model包含一个类列表
我目前拥有的是:
Model: (classes += Class)*
Class: name = ID ('{' (subclasses += Class) (',' subclasses += Class)* '}')?
如果类必须用逗号分隔,而与它们是否有子类无关,那么这将起作用。但是,由于类的子类可以用大括号括起来,所以在结束大括号后不一定要用逗号
这意味着我需要一个表达以下内容的语法:
Class: ID (',' Class | '{' subclasses += Class '}' ','? Class)?
由于我无法引用包含规则,类内的类规则引用将不起作用。我相信这个问题有一个简单的解决办法,但我看不到
编辑:我相信回头看是一个解决办法。但是,在我看来,XText中似乎不支持这种方法。您可以尝试以下方法(+最后一个逗号的验证)
您可以尝试以下方法(+验证最后一个逗号)
在你的例子中,
A{B{}}I
是允许的,但是A{}
不对吗?我只想提一下,有一次你使用ClassAtEnd
作为可选的,而另一次不是。在你的例子中,A{B}I
是允许的,但是A{}
不对?我只想提一下,有一次您将ClassAtEnd
用作可选项,而另一次则不是。
Model:
((classes+=ClassWithBraces|classes+=ClassWithComma)* classes+=ClassAtEnd?);
ClassWithComma returns Class:
name=ID ","
;
ClassWithBraces returns Class:
name=ID =>("{" ((classes+=ClassWithBraces|classes+=ClassWithComma)* classes+=ClassAtEnd?) "}") ","?
;
ClassAtEnd returns Class:
name=ID
;