[英]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.