6

ここで自動魔法の解決策を探しているのではないことを最初に言わせてください。非常に単純な文が自動的に翻訳されることに気付いたので、コードをPythonからSmalltalkに翻訳したいと思います。例:

変数を値に割り当てる

Python

i = 1

Smalltalk

i := 1.

クラスの新しいインスタンスを作成する

Python

instance = module.ClassName()

Smalltalk

instance := ClassName new.

forループ

Python

for a in [0,1,2]:
  print (str(a)+str(a))

Smalltalk

#(0 1 2) do: [: a | Transcript show: a + a; cr ]

など(whileループ、条件など)。私の考えは、これらすべての非常に「単純な」ケースを翻訳するツールを用意することです。そうすれば、ルールシステムを手作業で完成または教えることができます。

私を助けることができるプログラミング翻訳ツールまたはライブラリを知っていますか?

ツールについて聞いたことがない場合、そのような翻訳を実装するためにどのような手法/パターンを使用しますか?例へのリンクを提供できますか?

ありがとう

4

3 に答える 3

3

Python コードを解析し、パーサーによって生成された抽象構文ツリーをたどって、Smalltalk を出力する必要があります。Eli Benderskyによる Python AST に関する素晴らしい記事と、少し古い記事がここにあります。Python では、Python 標準ライブラリがインタープリターの内部ツールの多くを公開しており、ドキュメントがかなり包括的であるため、これを比較的簡単に行うことができます。

于 2012-04-23T00:50:15.180 に答える
1

私はそのようなツールを認識していません。一般的に、複雑で非効率的である可能性があります。したがって、あなたのルートは、より正確な必要性に依存します: 既存の python ライブラリを移植するか、それを smalltalk から使用するか、python と同じことを行うきれいな smalltalk コードを作成します。

私が検討するルート:

  • Pythonライブラリをそのままにして、cインターフェイスを介してsmalltalkから呼び出す
  • 次に、ペティットパーサーでpythonパーサーを実装します。
    • smalltalkジェネレーターを実装する
    • smalltalk の python インタプリタ

ジェネレーターのバリアントは、一般的なケースでいくつかの困難な問題に直面する可能性があることに注意してください。たとえば、smalltalk ではインスタンス変数の数が固定されていますが、Python では、必要に応じてアタッチできます。これを回避することはできますが、結果の smalltalk コードはきれいではない可能性があります。

smalltalk 内での Python の実装については、Lukas Renggli による helvetia プレゼンテーションを参照してください。これは、smalltalk IDE 内に他の言語を含めることをテーマとしています。

于 2012-04-23T06:34:50.153 に答える
0

Lex-Yacc Python 実装であるplyを見てください。私はこれを使って Python AST を構築することで、他の言語を Python バイト コードに変換するために主に使用しましたが、その逆も可能であるはずです。

于 2012-04-23T00:53:17.823 に答える