2012-06-28 2 views
0

변수에 대한 제약 조건을 확인하기 위해 약간의 DSL을 설계하려고합니다. 순간 내 문법은 다음과 같습니다Xtext에서 Xbase 표현식을 평가하기위한 클래스를 생성합니까?

내가 입력으로 값을 취 또한 인 (제약 조건에 포함 된 유일한 변수에 매핑 한 방법을 포함하는 클래스의 인스턴스를 생성 할
Start: 
    varDeclarations += XVariableDeclaration* 
    rules+=Constraint*; 

Constraint: 
    {Constraint} 
    'FOR' 'PAYLOAD' payload=PAYLOAD 'ELEMENT' element=ID 'CONSTRAINED BY' constraint=XExpression; 



PAYLOAD: 
    "SimulationSessionEvents" 
    |"stacons" 
    |"any" 
; 

변수 만 선언 됨) 제약 조건이 충족되는지 확인합니다.

이러한 인스턴스는 각 인스턴스를 통해 값을 전달하는 다른 클래스에서 사용되며 제약 조건이 충족되는지 확인합니다.

  1. 명시 적으로 제약 클래스에 대한 코드를 생성, 난 그냥 식 평가 코드를 생성 할 XBaseCompiler을 사용할 수있는 경우 : 제가보기에는

    나는 두 가지 옵션이 있습니다. 그러나 나는 메모리 객체를 직접 생성하는 방법이 있다면 어떻게 든이 클래스들을로드해야 할 것이다.

  2. ModelInferrer을 사용하면 다른 클래스로 전달할 수있는 메모리 객체를 직접 생성 할 수 있으므로 클래스 로딩이 필요하지 않습니다. 이 경우에는 xbase 표현식 평가 코드를 생성하는 방법을 모르겠습니다.

모든 xtext 문서/자습서를 읽고, 그리고 예제와 함께 주위를 연주 후, 나는 다음과 같은 질문을 왼쪽 오전 :

scalabilty의 측면에서 '최고'접근 방식이다

(나중에 할 수있다 문법 및/또는 그가 생성 한 클래스의 기능을 확장하고 싶습니까?) ModelInferrer 방식을 따르려면 어떻게해야할까요? 다른 방법이 있습니까?

어떤 도움이 많이

답변

2

가장 좋은 방법은 당신의 DSL 요소의 Java 표현을 생성하기 위해 모델 inferer을 사용하는 것입니다 감상 할 수있다. 표현식은 일반적으로 JvmTypeBuilder # setBody를 통해 할당됩니다.

body = [ 
    append(varName).append(' = new ').append(typeName).append('();') 
] 

inferer 접근 방식은 강력한 수 있습니다 :

members += f.toMethod(f.name, f.type) [ 
    for (p : f.params) { 
     parameters += p.toParameter(p.name, p.parameterType) 
    } 
    body = f.body 
] 

또 다른 옵션은 수동으로 코드를 작성하는 것입니다 : 당신이 작업을 본체에 할당을 찾을 수있는 도메인 모델의 예에서보세요 유형 계층 구조, 호출 계층 구조 또는 선언으로 가기 이후의 Eclipse 통합은 모두 파생 된 Java를 존중합니다.

+0

괜찮은 것 같지만 생성 된 클래스에 어떻게 액세스합니까? 예를 들어, DSL 모델 파일을 파싱 할 때 생성 된 모든 인스턴스를 벡터에 추가하려면 어떻게해야합니까? 이것은 xtext 자습서에서 찾을 수없는 것입니다. 일단 이러한 유형이 액세스 될 수있는 방법이 만들어지면 명확하지 않기 때문입니다. –

+0

나는 위의 코멘트에 질문을했다. 그래서 나는 그것이 무엇을 의미하는지 명확하게했다. http://stackoverflow.com/questions/11260216/how-to-use-xtext-inferred-jvm-model-outside-of-xtext- 계획 –