1

この問題を間違った方法で考えているだけかもしれませんが、例としてルビーを使用すると、次のようになります

ree-1.8.7-2011.03 :004 > a =
ree-1.8.7-2011.03 :005 >   1
 => 1 

ただし、次はエラーをスローします

ree-1.8.7-2011.03 :006 > a sdlkfj
NameError: undefined local variable or method `sdlkfj' for #<Object:0x101986e88>

これは当然のことのように思えますが、これは ruby​​ に「この行は完全で正しい式なのか、不完全な (しかしおそらく正しい!) 式なのか、それとも完全にはなりえない式なのか?」という論理があることを意味します。

ANTLR を使用して一度にスクリプトを解析するのは簡単ですが、このようなインクリメンタル スクリプトをどのようにサポートするのが最適なのか疑問に思っています。1つの方法は、「不完全だが正しい可能性のある表現」を検証することを唯一の目的とする文法を作成することだと思いますが、それは深刻なコードの重複につながるようです... ANTLR内でこれをサポートするよりエレガントな方法はありますか?

前もって感謝します

4

1 に答える 1

1

これは一連のガイドラインにすぎませんが、一般的な考え方を提供する必要があります。

ステートメントを解析するために使用しているパーサー ルールが明示的な で終わっていることを確認する必要がありますEOF

start : stmt EOF; // good

start : stmt;     // bad! might not parse the whole buffer!
  1. 入力のいずれかの行が実行される完全なステートメントを生成した後、複数行の入力「バッファー」をクリアします。
  2. ユーザーから 1 行のデータが入力された後、そのデータをバッファーに追加し、バッファー全体の解析を試みます。
    • 入力バッファが正常に解析された場合は、入力を実行します (つまり、上記の項目 #1 に進みます)。
    • 構文エラーが発生したが、パーサーがEOFトークン ストリームから (予測中または照合中に) シンボルを消費した後でのみ発生した場合、現在の入力は不完全です。何も実行せず、ユーザーがさらにテキストを入力するのを待ちます。
    • EOFパーサーがシンボルを消費する前に構文エラーが発生した場合、入力には構文エラーが含まれます。適切と思われるエラーを報告および/または処理します (おそらく、何も実行せずに入力バッファーをクリアすることを含みます)。
于 2013-01-04T19:47:28.203 に答える