Eclipse rcp 带后视功能的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

我一直在用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 += 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
;