0

したがって、次の XText 文法があります。

grammar org.xtext.example.hyrule.HyRule with org.eclipse.xtext.xbase.Xbase

generate hyRule "http://www.xtext.org/example/hyrule/HyRule"


Start:
    rules+=Rule+;

Rule:
    constantDecs+= XVariableDeclaration*
    elementDecs+=elementDec+
    'PAYLOAD' payload=PAYLOAD 'CONSTRAINT' expression= XExpression
;

elementDec:
    variable=FullJvmFormalParameter '=' xpath=XPATH
;




PAYLOAD:
    "Stacons" |  "any" | "sse";



//we override the definition in Xtype.xtext, so that we can have // in Xpaths
terminal SL_COMMENT:
    '#' !('\n' | '\r')* ('\r'? '\n')?;

terminal XPATH: 
    (('//'|'/')('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'_'|':'|'0'..'9')*)+

    ;

そして、JvmModelInferrer を使用して各ルールのメソッドを推測しています。推論者のコードの関連部分は次のとおりです。

def dispatch void infer(Start start, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {

        for (rule: start.rules) {
            acceptor.accept(rule.toClass("Rule" + counter)).initializeLater[
                ...
                // method used to check the rule this class represents 
                members += rule.toMethod("checkRule",rule.newTypeRef('boolean'))[
                    for (e : rule.elementDecs) {
                        parameters += e.variable.toParameter(e.variable.name, e.variable.parameterType)
                    }
                    setStatic(true)
                    body = expression
                ]

私が理解できないのは、constantDecs の変数宣言の値を式から見えるようにすることです。より具体的には、それらの値を含む式のコードを生成する方法です。現時点では、変数宣言は生成されたコードのスコープ内にありますが、その値はその名前として宣言されています。入力例:

val j = Integer::parseInt('199')
int x = //val/v
PAYLOAD Stacons CONSTRAINT x>j

生成されたメソッドは次のようになります。

public static boolean checkRule(final int x) {
    int _j = j;
    boolean _greaterThan = (x > _j);
    return _greaterThan;
  }

一方、メソッドを生成したい:

public static boolean checkRule(final int x) {
        int _j = 199;
        boolean _greaterThan = (x > _j);
        return _greaterThan;
      }

私のスコープ プロバイダーは次のようになります。

@Inject
    IJvmModelAssociations associations;

    @Override
    protected IScope createLocalVarScopeForJvmOperation(JvmOperation context, IScope parentScope) {
        parentScope = super.createLocalVarScopeForJvmOperation(context, parentScope);

        // retrieve the AST element associated to the method
        // created by our model inferrer
        EObject sourceElement = associations.getPrimarySourceElement(context);
        if (sourceElement instanceof Rule) {
            Rule rule = (Rule) sourceElement;
            return Scopes.scopeFor(rule.getConstantDecs(), parentScope);
        }

        return parentScope;

スコープと推論をいじってみましたが、役に立ちませんでした。私がやろうとしていることは可能ですか?

4

1 に答える 1

2

基本的に 2 つのオプションがあります。

  1. モデル内の各 constantDecl の JvmType で定数を推測できます。
  2. 定数値を式にインライン化するには、スコープ、コード生成、検証など、あらゆる種類のものをカスタマイズする必要があります。

(2)はダメだと思うので、(1)に行くことをお勧めします。

acceptor.accept(rule.toClass("Rule" + counter)).initializeLater[
  ..
  for(varDecl : constantDecs) {
    switch(varDecl) {
     XVariableDeclaration: members += varDecl.toField(varDecl.name, varDecl.type) [
       initializer = varDecl.right
       setStatic(true)
       setFinal(true)
     ]
    }

  }
  // method used to check the rule this class represents 
  members += rule.toMethod("checkRule",rule.newTypeRef('boolean'))[
    for (e : rule.elementDecs) {
      parameters += e.variable.toParameter(e.variable.name, e.variable.parameterType) 
    }
    setStatic(true)
    body = expression
  ]
]
于 2012-09-10T20:37:53.413 に答える