2012-02-09 12 views
2

これはまさに質問ではありません。この時点で私は精確な質問をすることはできません。それは私の疑問を解決するために、他のメンバーと分かち合いたいと思う大きな声の集まりです。 JavaScriptのオートコンプリートを実装しようとしています。静的に型付けされたプログラミングではなく、完全なオートコンプリートを持つことは不可能だと私に言っている時間を無駄にしないでください。私はすでにそれを知っています。 I桁Aプログラミング言語のオートコンプリートを実装する方法

var a = { 
b: { first: "goofy",second: 5}, 
c: "minnie"}; 

if (a.b.second > 0) 
    a.s = 0; 
else 
    a.t = "honey"; 

:私が欲しいもの は、私はそのような何かを定義した場合という小さな自動入力補完です。オートコンプリートは私にb、c、s、tを示すはずです。 私は先月、スタンフォード大学http://www.stanford.edu/class/cs143/でコンパイラコースで提供された資料を使って物事を解析する方法を学びました。 今私は少し混乱しています。明らかに、コンパイラを作成しなければならない場合は、LALR文法とflex & bisonのようなツールを使用します。しかし、オートコンプリートは違うものです。インタラクティブです。あなたが入力している間、あなたは完全なコードではなく、一瞬で入力している行はプログラミング言語の有効な意味ではありません。私が入力している場合。 LALRパーサーは、その文章を最初のプロダクションに還元できないと言います。それは、私がこの瞬間までに書いたことを完全に解析することができないことを意味します。しかし、どのような場合でも、メンバーが "a"の中にいることを示すためには、文章を解析する必要があります。 私がよく理解しているのであれば、LALR構文解析はLLよりもlazierです。 LALRは、削減を適用する前にできるだけ多くの語彙を収集しようとしています。だから、私はLALRがコンパイラにとって正しい選択だと思っていますが、LLはオートコンプリートの方が優れています(解析するプログラミング言語にはLL文法があります)。それが正しいか? 申し訳ありません私の投稿が混乱していることを知っていますが、この瞬間に私は同じ考えを持っています。私は私の脳内の混乱を解消する助けをしてくれることを願っています。私はいくつかの小さく便利なヒントを与えることができたオートコンプリートを書いて何らかの経験を積んだ人を探しています。

答えて

3

これを達成するためにLALRパーサーまたはLLパーサーを使用するかどうかは関係ありません。ジェネレータの選択にかかわらず、重要な問題はパーサが意味のある方法でエラーを処理するのに十分堅牢であることです。

パーサーの不完全な入力は継続的に供給されるため、安定した方法でエラーから回復することができなくてはなりません。通常、簡単な解決策は、エラーが見つかったときに理解できる状態になるまでトークンを無視することです。 JSでは、;または}になるまで、トークンを食べるのが最善の方法だと思います。あたかもエラーが起きなかったかのように、解析を続けます。 Bisonは実際にこの状況をかなりうまく処理して、エラー処理のドキュメントを見てください。

オートコンプリータ自体は、基本的には任意のポイントからのシンボルテーブルの歩みです。あなたが正しく識別すると、言語が静的に型付けされていないので完全な自動補完を行うことは不可能ですが、少なくとも、ある点で何が静的に宣言されているか知ることができます。

関連する問題