【问题标题】:Xtext cross-reference to constants of EnumXtext 对 Enum 常量的交叉引用
【发布时间】:2016-07-24 10:50:58
【问题描述】:

我尝试编写新语法,并在 Java 中编写了类似 Enum 的东西,它使 Var(我的语法中的一种类型)成为一组预定义的常量。

我希望它能够识别包含在这个 Var 中的常量,但是我没有找到方法来做到这一点(尽管我尝试阅读《使用 Xtext 和 Xtend 实现特定领域的语言》一书,并进行了搜索网上很多)

所以我就Domainmodel语法做了一个小例子:

Domainmodel:
    (elements+=AbstractElement)*;

PackageDeclaration:
    'package' name=QualifiedName '{'
    (elements+=AbstractElement)*
    '}';

AbstractElement:
    PackageDeclaration | Type | Import;

QualifiedName:
    ID ('.' ID)*;

Import:
    'import' importedNamespace=QualifiedNameWithWildcard;

QualifiedNameWithWildcard:
    QualifiedName '.*'?;

Type:
    DataType | Entity | Var;

DataType:
    'datatype' name=ID;

Entity:
    'entity' name=ID ('extends' superType=[Entity|QualifiedName])? '{'
    (features+=Feature)*
    '}';

Feature:
    (many?='many')? name=ID ':' type=[VarDecl |QualifiedName];

Var:
    kind='Var' var=VarDecl;

VarDecl:
    type=VarType name=SimpleVarID;

SimpleVarID:
    ID ('[' INT ']')*;

VarType:
    name='boolean'
    | '{' const+=TypeConstant (',' const+=TypeConstant)* '}';

TypeConstant:
    ID | INT | 'FALSE' | 'TRUE';

所以,例子是:

Var  {LEFT,RIGHT} move

entity C {
    content: move
    side: LEFT //ERROR: couldn't resolve reference to VarDecl 'LEFT'
}

我知道 LEFT 不是 VarDecl,它是 ID,但我不知道该怎么做。 我需要做什么才能让 LEFT 被识别为包括移动的东西?
评论:在我真正的语法中,我实际上尝试做 move==LEFT (布尔运算符)并且它没有将 LEFT 识别为移动常量(出现相同的错误)。

谢谢!

【问题讨论】:

    标签: eclipse enums xtext cross-reference


    【解决方案1】:

    我不确定我是否明白你的意思,但这里有一些提示

    首先你只能引用语法中允许的东西

    QualifiedName:
        TypeConstantLiteral ('.' TypeConstantLiteral)*;
    
    VarType:
        name='boolean'
        | '{' const+=TypeConstant (',' const+=TypeConstant)* '}';
    
    Feature:
        (many?='many')? name=ID ':' type=[Referrable | QualifiedName];    
    
    Referrable:
        VarDecl | TypeConstant
    ;
    
    TypeConstant:
        name=TypeConstantLiteral;
    
    TypeConstantLiteral:ID | INT | 'FALSE' | 'TRUE';    
    

    那么你必须关心命名

    class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
    
        override bindIQualifiedNameProvider() {
            SimpleNameProvider
        }
    
    }
    

    (根据您的用例,您可以改用您自己的 DefaultDeclarativeNameProvider 子类

    请注意:这还不包括类型系统/范围/验证

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多