2017-01-04 12 views
0

표현식을위한 비동기 코드를 생성해야하는 간단한 DSL이 있습니다 (이것이 가장 중요한 예입니다).XExpression 하위 유형에 대한 코드를 생성하는 방법은 무엇입니까?

grammar org.xtext.scripting.Scripting with org.eclipse.xtext.xbase.Xbase 

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

Script returns xbase::XBlockExpression: 
    {Script} 
    (expressions+=XExpressionOrVarDeclaration ';'?)*; 

XExpression returns xbase::XExpression: 
    super | Async 
; 

Async: 
    'async' expression=XExpression 
; 

아이디어가 async 코드가 다른 스레드에서 실행되는 것 : 난 그냥 scripting example에 새로운 async 문을 추가했다.

제 질문은 ScriptingJvmModelInferrer을 사용하여 Async.expression에 대한 코드를 어떻게 생성 할 수 있습니까?

가장 간단한 경우에 나는 단지 Async.expression에서 코드를 래핑하겠습니까?

AsyncRunner.exec(new Runnable() { 
     @Override 
     public void run() { 
      // the Async.expression would end up here 
     } 
    }) 

어떻게해야할까요?

+0

내가 HTTPS의 예를 발견 :

class ScriptingCompiler extends XbaseCompiler { override protected doInternalToJavaStatement(XExpression expr, ITreeAppendable it, boolean isReferenced) { switch expr { Async : { newLine append(''' AsyncRunner.exec(new Runnable() { @Override public void run() {''') expr.expression.doInternalToJavaStatement(it, false) newLine append('}});') } default : super.doInternalToJavaStatement(expr, it, isReferenced) } } override protected internalToConvertedExpression(XExpression obj, ITreeAppendable it) { if (hasName(obj)) append(getName(obj)) else super.internalToConvertedExpression(obj, it) } } 
  • 식의 유형은 모두 확장 주입 할 필요가

    class ScriptingTypeComputer extends XbaseWithAnnotationsTypeComputer { override computeTypes(XExpression expression, ITypeComputationState state) { if(expression instanceof Async) { super.computeTypes(expression.expression, state); } else { super.computeTypes(expression, state) } } } 
  • 지정해야합니다 : //eclipse.org/Xtext/documentation/207_template.html (템플릿 언어) * 컴파일러 확장 * –

  • 답변

    0

    당신을 Xbase를 확장 할 경우 ususally 컴파일에 대한 JvmModelInferrer을 apapt하지 않습니다하지만 당신은 3 명 변경하기 위해 XbaseTypeComputerXbaseCompiler.doInternalToJavaStatement/internalToConvertedExpression 당신은이

    0

    (당신이 실제로 소개하는 내용에 따라)를 확장 :

    1. 언어를 처리하도록 컴파일러를 확장하십시오. 요점은 Async 표현을 처리하는 것입니다. 내가 생각

      class ScriptingRuntimeModule extends AbstractScriptingRuntimeModule { 
          def Class<? extends XbaseCompiler> bindXbaseCompiler() { 
           return ScriptingCompiler 
          } 
      
          def Class<? extends ITypeComputer> bindITypeComputer() { 
           return ScriptingTypeComputer 
          } 
      }