带有lookbehind的XText DSL

时间:2017-03-13 09:55:08

标签: 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 += Class) (',' subclasses += Class)* '}')?

如果类必须用逗号分隔,这将有效,独立于它们是否具有子类。但是,由于Class可以使用花括号括起来的子类,因此在结束大括号后不能使用逗号。

这意味着我需要一个表达以下内容的语法:

Class: ID (',' Class | '{' subclasses += Class '}' ','? Class)?

由于我无法引用包含规则,因此Class中的Class规则引用将不起作用。我相信这个问题有一个简单的解决方案,我看不到。

编辑:我相信一个外观将是一个解决方案。但是,在我看来,XText中并没有这样做。

1 个答案:

答案 0 :(得分:2)

您可以尝试以下内容(+最后一个逗号的验证)

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
;