繁体   English   中英

Xtext交叉引用Enum常量

[英]Xtext cross-reference to constants of Enum

我尝试编写新的语法,并且用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识别为move常量(出现相同的错误)。

谢谢!

我不确定是否能找到你,但这里有一些提示

首先,您只能参考语法中允许的内容

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子类

请注意:这还不包括类型系统/作用域/验证

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM