本文介紹了XText語法變量定義/引用的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
[any type]Realisation
語法規則初始化應該是一個值或對預定義變量的引用。
對于Integer,它看起來與您從Java中知道的類似:
public int i = 3;
為什么以下語法引發異常?
Integer returns ecore::ELong:
(Plus|Minus)? INT;
IntegerRealisation:
{Integer} Integer |
ref=[Integer];
異常:
Caused by: java.io.IOException: Generated EMF Model incomplete: The context 'IntegerRealisation' is not valid for type 'Integer'
Recommended contexts for type 'Integer':
Other valid contexts for type 'Integer': .... The context 'IntegerRealisation' is valid for types: Integer, IntegerRealisation
為什么同一錯誤的第一行和最后一行彼此不一致?
這里出了什么問題?
推薦答案
您嘗試引用的是整型文字,而不是任何其他整型變量。實施某事。如
public int i = 5; // 5 is a value
public int j = i; // i reference to a predefined variable
您的語法定義應如下所示
VariableDeclaration:
modifiers+=Modifier* type=Type name=ID ('=' value=VariableValue)? ';';
VariableValue:
TypedLiteral | VariableReference;
TypedLiteral:
IntegerLiteral | ...;
IntegerLiteral:
value=INTVAL;
terminal INTVAL returns ecore::ELong:
(Plus|Minus)? INT;
VariableReference:
ref=[VariableDeclaration|QualifiedName];
如您所見,它從定義變量的a規則開始。該變量有一個name屬性,這對于后面的參考實現非常重要。實際值分配是可選的(因為我會這樣做!)在這一點上,重要的是抽象規則VariableValue
,它將對文字(也稱為.常量值)或對任何其他變量的引用。
如果要引用任何預定義變量,您將使用其他變量名稱,但不是其值。因此,我們還需要VariableReference
,它定義我們通過(限定)名稱(在管道操作符|
之后)引用任何其他變量(在管道操作符之前)。
為確保類型安全,您必須實現yourdsl.validation.YourDslValidator
類以檢查文本是否與類型兼容,以及引用的變量的類型是否與類型兼容。
編輯:我稍微優化了語法。第一個版本有點不清楚。
回答您的其他問題:
變量值的返回類型是什么?
VariableValue
本身是所有可能值的公共(但抽象)返回類型。它類似于java.lang.Number
,java.lang.Integer
、java.lang.Double
、…
的超類型
這里的問題是單詞type本身在這里是不明確的。值的類型將是int
(IntegerLiteral extends TypedLiteral extends VariableValue
),但AST節點的類型是IntegerLiteral
或VariableReference
。
要確定VariableReference
的值類型,必須查看引用的VariableDeclaration
(((VariableReference)vd1.getValue()).getRef().getValue()
)的value
屬性。永遠不會有EString
值類型!
若要為VariableDeclaration.value
屬性設置值,您需要IntegerLiteral
(最顯式的TypeWrital)或VariableReference
。
這篇關于XText語法變量定義/引用的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,