0

私は翻訳者を書きたいです。アイデアは、特別に形成された C++ インターフェイスを C++/CLI に変換することです。すべてを解析して AST を生成する antlr 文法があります。ここで、この情報といくつかの文字列テンプレートを使用して、ソース コードを出力したいと考えています。

私のアイデアは、プロパティを使用して何らかのオブジェクト階層で AST を変換することでした (たとえば、メソッド記述オブジェクトを含むインデックス付きプロパティ メソッドを含むインターフェイス オブジェクト)。次に、マスター文字列テンプレートにルート オブジェクトが渡され、プロパティが次の場所に挿入されます。位置を修正するか、サブテンプレートに渡します。

ここで私の質問: 未定義の回数呼び出す必要がある文字列テンプレート/プロパティを作成するにはどうすればよいですか? 例: インターフェイスには多数のメソッドが含まれています。これは、メソッドのサブテンプレートを、毎回異なるプロパティで数回呼び出す必要があることを意味します。これを文字列テンプレートとインデックス付きプロパティの組み合わせとして書き留めるにはどうすればよいですか?

助けてくれてありがとう トビアス

4

1 に答える 1

0

私は非常に似たようなことをしています。基本的な考え方は、モデルは何らかのオブジェクトのリストを公開する必要があり、そのリストを文字列テンプレート内で使用するというものです。たとえば、非常に頭がおかしい実装があるとしましょう。Java を使用するのは、それが私が最もよく知っていることだからです。あなたはアイデアを得る必要があります。

https://gist.github.com/894632

public class GeneratedClass {
    private String accessModifier;
    private String name;
    private String superClass;
    private List<Method> methods;
}

public class Method {
    private String comments;
    private String name;
    private String accessModifier;
    private Type returnType;
    private List<Argument> arguments;
    private String body;
}

public class Argument {
    private Type type;
    private String name;
}

public class Type {
    private String name;
}

私のテンプレートには、次のようなものがあります。

group Java;

class(accessModifier, name, superclass, methods)::=<<

$accessModifier$ class $name$ extends $superclass$ {

    $methods:method(); separator="\n"$

}
>>

method(method)::=<<
/**
 $method.comments$
*/
$method.accessModifier$ $method.returnType.name$ $name$ ($method.arguments:argument(); separator=","$) {
    $method.body$
}
>>

argument(argument)::=<<
$argument.type.name$ $argument.name$
>>

重要なのは、私が持っているメソッド オブジェクトごとにテンプレートを機能的に適用することです。それ$methods:method()がそうです。空のリストがある場合、テンプレートはまったく呼び出されません。これにより、可変サイズの問題が処理されます。メソッド定義内で同様のことを行います。($method.arguments:argument(); separator=","$). これにより、予想どおり、括弧の間にメソッド パラメーターのコンマ区切りリストが作成されます。

于 2011-03-30T15:45:11.967 に答える