我在使用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中并没有这样做。
答案 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
;