5

バックグラウンド

FreeLing API は、標準の Java 命名規則に従わないインターフェースを定義します。例えば:

package freeling;

public class sentence extends ListWord {
  public void set_parse_tree(parse_tree arg0) {

インターフェイスはIDLに似たSWIGを使用して定義されます。

class sentence : public std::list<word> {
 public:
  sentence(void);

  void set_parse_tree(const parse_tree &);

問題

class Sentence学術的に言えば、インターフェイスを従来の Java 命名標準 (および など)にどのようにマッピングしますsetParseTree( parseTree arg0 )か?

アイデア

  1. 650 行以上のインターフェイス ファイルを手動で変換します (そして開発者にパッチを送信します)。
  2. voodooの正規表現検索と置換(vi を使用)::1,$s/_\([a-z]\)/\u\1/g
  3. 自動生成された 53 個の Java ソース ファイルからラッパー クラスを作成します。

ありがとうございました!

4

3 に答える 3

5

SWIG は%rename、クライアント言語と実装言語で異なる名前を使用できるようにするディレクティブを提供します。 ただし、これを行うと、インターフェイス ファイルの長さがほぼ 2 倍になります。

実際、SWIG は一括リネームを提供します。ドキュメントを見る

5.4.7.2 高度な名前変更のサポート

特定の宣言に対して %rename を記述するのは簡単ですが、SWIG 入力の多くの、場合によってはすべての識別子に同じ名前変更規則を適用する必要がある場合があります。たとえば、ラップされたすべての関数に特定のプレフィックスを追加するなど、ターゲット言語のすべての名前に何らかの変換を適用して、その命名規則によりよく従う必要がある場合があります。関数ごとに個別に行うのは現実的ではないため、名前を変更する識別子の名前が指定されていない場合、SWIG はすべての宣言に名前変更ルールを適用することをサポートしています。

%rename("myprefix_%s") ""; // print -> myprefix_print

これは、%rename の引数がリテラル文字列である必要はなく、printf() のようなフォーマット文字列であってもよいことも示しています。上記のように、最も単純な形式では、"%s" が元の宣言の名前に置き換えられます。しかし、これは必ずしも十分ではなく、SWIG は通常のフォーマット文字列構文に拡張機能を提供して、(SWIG 定義の) 関数を引数に適用できるようにします。たとえば、すべての C 関数 do_something_long() を Java ライクな doSomethingLong() としてラップするには、次のように「lowercamelcase」拡張フォーマット指定子を使用できます。

%rename("%(lowercamelcase)s") ""; // foo_bar -> fooBar; FooBar -> fooBar

一部の関数はパラメーター化できます。たとえば、「strip」関数は、指定されたプレフィックスを引数から削除します。プレフィックスは、関数名の後のコロンに続いて、フォーマット文字列の一部として指定されます。

%rename("%(strip:[wx])s") ""; // wxHello -> Hello; FooBar -> FooBar

そのままにしておくことをお勧めします。C++ 関数を呼び出していますが、C++ の名前があります。どちらかといえば、これは、C++ を呼び出しており、オブジェクトの有効期間管理のために C++ の規則に従う必要があること、JNI のパフォーマンスがわずかに低下することなどを思い出すのに役立ちます。

于 2012-05-28T22:38:33.750 に答える
1

正規表現を使用してHTMLを解析することになっていない方法を知っていますか?ええ、正規表現からコンパイラレベルのロジックを記述しないでください。そうではありません(2)。

インターフェイスを書き直さないでください。彼らのコードは、あなたが使用するかもしれない他の中間ライブラリと同様にそれを期待しています。(1)ではありません。

醜いコードをコードから除外したい場合は、ラッパーインターフェイスを作成します。そうすれば、彼らに丁寧な手紙を送ったり、慣習をより厳しく尊重する開発者によって作成されたライブラリに交換したりした後、巧みに移行することができます。

于 2012-05-28T22:27:13.280 に答える
0

FreeLing JNI API を統合しようとしたときに同じ命名規則の危機に見舞われましたが、この API がプロジェクトのコンパイル サイクルに苦労していることに気付きました。また、パフォーマンスに関しても最適とはほど遠いものでした (内部的にすべてのオブジェクトを再作成しているため)。あなたが提出するすべての文)。バンドルに含まれているアナライザー サーバーに切り替えることをお勧めします。クライアント/サーバー モード ドキュメント

PHP の例とAnalyzer.ccで実装されているものを再作成できます。

于 2012-06-15T09:20:54.107 に答える