簡體   English   中英

XText-獲取XExpression的內容(編譯值)

[英]XText - get content (compiled value) of XExpression

我的XText語法器的某個部分為將打印其所有表達式的類定義了一個塊。 XText語法部分如下所示:

Print: 
    {Print}
    'print' '{' 
        print += PrintLine* 
    '}';
PrintLine:
    obj += XExpression;

現在,我使用以下推理程序代碼創建print()方法:

Print: {
    members += feature.toMethod('print', typeRef(void)) [
    body = '''
        «FOR printline : feature.print»
            System.out.println(«printline.obj»);
        «ENDFOR»
        '''
    ]
}

好的,我繼續在類中使用以下代碼對其進行測試:

print {
    "hallo"
    4
    6 + 7
}

結果如下:

public void print() {
   System.out.println([org.eclipse.xtext.xbase.impl.XStringLiteralImpl@20196ba8 (value: hallo)]);
   System.out.println([org.eclipse.xtext.xbase.impl.XNumberLiteralImpl@7d0b0f7d (value: 4)]);
   System.out.println([<XNumberLiteralImpl> + <XNumberLiteralImpl>]);}

當然,我希望:

public void print() {
   System.out.println("hallo");
   System.out.println(4);
   System.out.println(6+7);
}

我知道我可能必須在«printline.obj»的推斷程序中以某種方式調用編譯器,但是我真的不確定如何。

我認為您這樣做是錯誤的。 在我看來,這聽起來像xbase的擴展,不僅是簡單的使用。

import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase

Print: 
    {Print}
    'print' 
        print=XPrintBlock
    ;

XPrintBlock returns xbase::XBlockExpression:
    {xbase::XBlockExpression}'{'
        expressions+=XPrintLine*
    '}'
;

XPrintLine returns xbase::XExpression:
    {PrintLine} obj=XExpression

;

類型計算機

class MyDslTypeComputer extends XbaseTypeComputer {

     def dispatch computeTypes(XPrintLine literal, ITypeComputationState state) {
        state.withNonVoidExpectation.computeTypes(literal.obj)
        state.acceptActualType(getPrimitiveVoid(state))
    }

}

編譯器

class MyDslXbaseCompiler extends XbaseCompiler {

    override protected doInternalToJavaStatement(XExpression obj, ITreeAppendable appendable, boolean isReferenced) {
        if (obj instanceof XPrintLine) {
            appendable.trace(obj)
            appendable.append("System.out.println(")
            internalToJavaExpression(obj.obj,appendable);
            appendable.append(");")
            appendable.newLine
            return
        }

        super.doInternalToJavaStatement(obj, appendable, isReferenced)
    }

}

XExpressionHelper

class MyDslXExpressionHelper extends XExpressionHelper {

    override hasSideEffects(XExpression expr) {
        if (expr instanceof XPrintLine || expr.eContainer instanceof XPrintLine) {
            return true
        }
        super.hasSideEffects(expr)
    }

}

JvmModelInferrer

def dispatch void infer(Print print, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
    acceptor.accept(
        print.toClass("a.b.C") [
            members+=print.toMethod("demo", Void.TYPE.typeRef) [
                body = print.print
            ]
        ]

    )
}

綁定

class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {

    def Class<? extends ITypeComputer> bindITypeComputer() {
        MyDslTypeComputer
    }

    def Class<? extends XbaseCompiler> bindXbaseCompiler() {
        MyDslXbaseCompiler
    }

    def Class<? extends XExpressionHelper> bindXExpressionHelper() {
        MyDslXExpressionHelper
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM