2

こんにちは私は翻訳者を実装しようとしています。ますます複雑になるので、実装したいことをよりよく説明しようとします。

新しい Java ライクな言語を指定する必要があります。この言語は、Java メソッドのすべての構造を実装する必要があります: 変数宣言、式、条件式、括弧式など... この言語は、ベクトル、定数、およびブール値で動作します。log、avg、sqrt、sum、diff、shift など、さまざまな機能があります。この言語は、plsql およびその他の言語に翻訳する必要があります。したがって、定義されたメソッドは StoredProcedure または C++ 関数などになります。演算子の優先度 (+、-、​​、/、<<、>> など) などの数学的な制約も考慮する必要があります。

私はすでにこのヒントを取得しています: 基本操作で式を分解: ANTLR + StringTemplate

タスクを達成するための最適なソリューションを知る必要があります。パイプライン方式ですべてのソリューションを使用する必要があると思いますが、ソリューションに試行錯誤の方法を使用したくありません。

さまざまな(別々の)ソリューションを試しましたが、すべてをまとめるのは難しいです。

私の最後の問題は、ベクトルと定数の間の式と、ベクトルとベクトルの間の式を分離することです。実際にplsqlを使用すると、これらの状況を処理するためのさまざまな機能があります。つまり、式 vactor1+5 (または 5+vector1) は PKG_FUN.constant_sum(cursor1, 5) のように変換する必要があり、代わりに vector1+vector2 は PKG_FUN.vector_sum(vector1, vector2) として変換する必要があります。さらに、ベクトルを生成する関数または式と、定数を生成するその他の関数または式を使用できます。これは、式を分析するときに考慮する必要があります (つまり、ベクトル a = ベクトル 1 + ((5 + var2) * ln(ベクトル 2) * 2) ^ 2)。

この言語の例は次のとおりです。

DEFINE my_new_method(date date_from, date date_to, long variable1, long variable2){
   vector result;
   vector out1;
   vector out2; 
   int max = -5+(4);    

   out1 = GET(date_from, date_to, variable1, 20);
   out2 = GET(date_from, date_to, variable2);

   if(avg(out1) > max)
   {
       result = sqrt(ln(out2) + max)*4; 
   }else
   {
       result = out1 + ln(out1) + avg(out2);
   }

       for(int i=0; i<result.length ; i++)
       {
          int num = result.get(i);
          result.set(num*5, i);
       }

       return result;

}

plsql、c、c++、またはその他の言語に翻訳する必要があります。

どんな助けでも大歓迎です。

4

1 に答える 1

1

必要なのは「型推論」です。すべての式について、そのオペランドの型と、各演算子記号の結果の型を知る必要があります。

これは、いくつかの手順で取得できます。

1) 変数スコープで宣言されたエンティティの型を記録するシンボル テーブルを作成することによって

2) 各式をたどって、リーフ ノードの型を計算します。式の場合、言語では、少なくともすべての定数値はスカラーであり、任意の識別子にはシンボル テーブルで検索できる型があります。ほとんどの言語では、演算子の結果の型は、オペランドの型が与えられると、演算子の言語規則から計算できます。(一部の言語では、制約の伝播によって型を計算する必要があります)。これらすべてのタイプを計算したら、各ツリー ノードをそのタイプに関連付ける必要があります (または、少なくとも必要に応じてノードのタイプを計算できるようにする必要があります)。

この計算された型情報を使用して、さまざまな演算子 (たとえば、ベクトルの +、ベクトルの最初のオペランドとスカラーの 2 番目のオペランドの + など) を区別して、生成するターゲット言語構造を選択できます。

ANTLR は、ツリーを提供する以外に、シンボル テーブルの構築と管理、または型情報の計算をサポートしません。ツリーとすべての型情報を取得したら、コードの生成に使用する文字列テンプレートを選択して、オンザフライ スタイルのトランスレーターを提供できます。ですから、これを行うことはただの汗です。(オンザフライ トランスレータを実行することには欠点があります。生成された結果を最適化する機会がないため、その場所で必要な正確なコードを生成する方がよいでしょう。これは、何を選択するためにツリーの膨大なケース分析を行うことを意味する可能性があります。生成)。

DMS Software Reengineering Toolkit は、シンボル テーブルの作成や、属性付きの文法評価子を使用したツリーに対する推論の計算に対する追加のサポートを提供します。また、明示的な変換を記述し、そのようなタイプ ルックアップを簡単に条件付きにする追加の手段も提供します。変換は、ソース言語のツリーからターゲット言語のツリーにマップされます。次に、ターゲット言語への「より単純な」翻訳を行い、追加の明示的な変換を使用してターゲット言語に最適化を適用できます。これにより、翻訳プロセスが大幅に簡素化されます。

しかし、いずれにせよ、1 つの言語 (ましてや 3 つの言語) 用の完全なトランスレーターを構築することは、それを行うための経験とバックグラウンドを持っている人にとっては大変な作業です。この質問をしたという事実は、コードの分析と変換に関連する多くの問題を理解していない可能性が高いことを示唆しています。先に進む前に、優れたコンパイラの本 (たとえば、Aho/Ullman/Sethi の「コンパイラ」) を読むことをお勧めします。

于 2013-01-08T09:27:12.730 に答える