【问题标题】:Defining Primitives within xtext Grammar在 xtext 语法中定义原语
【发布时间】:2013-10-19 19:21:15
【问题描述】:

我想使用 xtext 创建一个非常简单的 DSL,具有以下功能:

  • 它将有两种基本类型:数字和字符串
  • 用户可以定义自己的类,由字段声明组成
  • 字段声明将名称与类型相关联,其中类型可以是类或原语

以下是我对 DSL 的尝试,类定义和引用工作正常,但我不知道如何拥有原始类型。 'String' 和 'Number' 文字不起作用:

Model:
    (classes+=Class)*
    (fields+=Field)*;

FieldType: Class | 'String' | 'Number';

Field:
    type=[FieldType] name=ID ";";

Class:
    "class" name=ID
    "{"
        (fields+=Field)*
    "}";

这是一个我希望对上述 DSL 有效的示例:

Class SomeClass {

}

// This works!
SomeClass reference;

// This does not, doesn't recognise the "String" literal
String string;

请注意,接下来我将支持分配。因此,我的 DSL 将需要结合数字/字符串文字的概念,以便它支持 Number someNumber = 123;

【问题讨论】:

  • 您的其他文字用双引号括起来,这有关系吗?我不懂语法。

标签: java xtext


【解决方案1】:

睡了之后,我认为正确的答案是改变我的方法。在上面的定义中,我们有

Field:
    type=[FieldType] name=ID ";";

这定义了一个名为“字段”的规则,它由两部分组成; “类型”和“名称”。它是呈现问题的类型部分。方括号表示我们期待FieldType 的实例,即:

FieldType: Class | 'String' | 'Number';

现在,可以清楚地看到您可以拥有类的实例,但从语义上讲,没有办法拥有“字符串”或“数字”字面量的实例。

我相信这就是我上面的 DSL 不允许我声明原语的原因。字符串/数字“类型”根本不是您可以拥有实例的元素。


进一步思考,原始字段的定义与类实例的字段定义之间存在一些非常重要的区别。例如,您只能在类的实例上调用方法(在我的例子中,我将 String 视为真正的原语,因此没有方法)。

因此,拥有两种不同类型的声明可能很重要,一种用于PrimitiveField,另一种用于ObjectField。字段可以是以下任何一种:

Model:
    (classes+=Class)*
    (fields+=Field)*;

PrimitiveType: 'String' | 'Number' | 'Boolean';

Field:
    PrimitiveField | ObjectField
;

PrimitiveField:
    type=PrimitiveType name=ID ";"
;
ObjectField:
    type=[Class] name=ID ";";

Class:
    "class" name=ID
    "{"
    (fields+=Field)*
    (methods+=Method)*
    "}";

【讨论】:

  • 我不完全确定我是否完全理解了这个问题!如果您发现我看到的东西,请发表评论/提供新答案!
  • 我也遇到了同样的问题。您的解决方案几乎 100% 正确工作,但在生成的基本类型编辑器中没有代码完成(例如:NumberString)。你知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多