簡體   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