3

カスタム(Iron)Pythonコンソールを実装しています。

一般的にプロンプ​​トを表示する必要があり>>>ますが、ステートメントが不完全な場合は、プロンプトをに変更して、...実行する前にさらに行を収集する必要があります。

ユーザーが入力した行が完全であるかどうか、またはさらに行を読み取る必要があるかどうかを確認するにはどうすればよいですか?

簡単な方法は、:が存在するかどうかを確認することのようです。しかし、存在しない他のケースを見逃していないかどうかはわかりません:

IronPythonソースコードを調べて、これがどのように行われるかを理解しましたが、多くの手順が必要であり、単純再生産は完全には機能しませんでした。

4

4 に答える 4

4

コロンと角かっこのコード文字列を見ただけで推測しようとするのは非現実的です。それを正しく行うには、Pythonパーサーの半分を実装する必要があります。

標準ライブラリコードモジュールは、インタラクティブなPythonインタープリターの動作を再現します。このモジュールが、IronPythonがコンソールを実装するために使用していると思います。(CPythonのものはPython自体には実装されていません。)

関心のある行継続ロジックは、codeop.compile_command関数から取得されます。

ちょっとしたハックです。基本的にcompile()、あいまいなPyCF_DONT_IMPLY_DEDENTフラグを使用して指定されたコードを試行します。つまり、ブロックの最後で開いているインデントが自動的に閉じられるとは想定していません。次に、改行を追加して再度コンパイルを試みます(明示的なDEDENTが発生します)。2番目が機能するが、最初が機能しない場合は、継続の可能性があり、ブロックにさらに入力できます。

于 2010-11-12T01:20:21.150 に答える
3

プロンプトを表示するために私が考えることができるいくつかの異なる方法があり...ます。

  • ブロックの開始(または継続)
    • def foo():
  • 閉じられていない括弧、中括弧、角括弧(および入れ子に注意してください)
    • x = (
    • x = {
    • x = [
  • 閉じられていない三重引用符付き文字列
    • x = '''
  • 行末の円記号:
    • x = \
于 2010-11-12T00:20:20.177 に答える
3

replループには、パーサーへの完全な知識とアクセス権があります。パーサーの状態がステートメント以外のものを期待するようなものである場合、replループは。を生成し...ます。閉じられていない括弧の場合、ステートメントを含む可能性のある部分式がないため、次の行のステートメントは無効になります。に続いて:、次に期待されるトークンは常にインデントです。ここでも、ステートメントは常に違法です。そのため、replループでインデントされたブロックの最後に空白行を入力する必要があります。これは、ステートメントが次に期待されるプロダクションルールになるために、終了ディデントを指定する必要があるためです。

于 2010-11-12T00:35:14.387 に答える
1

:aまたはa \(または角かっこやparensなどの閉じられていない区切り文字)を使用しましたか?インタラクティブインタプリタはを表示し...ます。

実際のロジックはもう少し複雑かもしれませんが、それが基本的なルールです。

于 2010-11-12T00:19:13.753 に答える