Xtext 对 Enum 常量的交叉引用
Xtext cross-reference to constants of Enum
我尝试编写新的语法,我在 Java 中编写了类似 Enum 的东西,它使 Var(我的语法中的一种类型)成为一组预定义的常量。
我想让它识别包含在这个 Var 中的常量,但我没有找到方法(虽然我尝试阅读这本书 "Implementing Domain-Specific Languages with Xtext and Xtend",并在互联网)
所以我做了一个关于领域模型语法的小例子:
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 识别为移动常量(出现相同的错误)。
谢谢!
我不确定我是否明白你的意思,但这里有一些提示
首先你只能引用你在语法中允许的东西
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 子类
请注意:这还没有涵盖类型系统/范围界定/验证
我尝试编写新的语法,我在 Java 中编写了类似 Enum 的东西,它使 Var(我的语法中的一种类型)成为一组预定义的常量。
我想让它识别包含在这个 Var 中的常量,但我没有找到方法(虽然我尝试阅读这本书 "Implementing Domain-Specific Languages with Xtext and Xtend",并在互联网)
所以我做了一个关于领域模型语法的小例子:
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 识别为移动常量(出现相同的错误)。
谢谢!
我不确定我是否明白你的意思,但这里有一些提示
首先你只能引用你在语法中允许的东西
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 子类
请注意:这还没有涵盖类型系统/范围界定/验证