2012-02-09 37 views
2

這不完全是一個問題,因爲在這一刻,我無法在腦海安排一個精確的問題。它更多的是我想與其他成員分享的一些大聲的想法,以解決我的疑惑。 我正在嘗試爲JavaScript實現一個自動完成器。不要浪費你的時間對我說,這是不可能有一個完全autocompleter非靜態類型的編程languate。我已經知道了。 我要的是一個小autocompleter,如果我定義了這樣的事情:如何爲編程語言實現自動完成器

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

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

,當我一個數字。 autocompleter應該給我看b,c,s,t。 我花了上個月學習如何使用編譯器課程提供的材料在斯坦福大學http://www.stanford.edu/class/cs143/解析事情。 現在我有點困惑。很明顯,如果我必須創建一個編譯器,我會使用LALR語法和工具,如flex & bison。但autocompleter這是一個不同的東西。它是互動的。在你輸入的時候,你還沒有完整的代碼,並且你在一個單元中輸入的行不是編程語言中的有效參數。如果我輸入一個。一個LALR解析器會說,不能將句子減少到開始生產。這意味着,直到現在,我還沒有完全能夠解析我所寫的內容。但無論如何,我必須解析句子才能顯示「a」內的成員。 如果我很好理解LALR解析比LL更加懶惰。 LALR試圖在應用減少之前收集儘可能多的詞位。所以我的印象是LALR是編譯器的正確選擇,但LL對於自動完成器來說更好(如果您要解析的編程語言顯然是LL語法的話)。這是對的嗎? 對不起,我知道我的帖子很混亂,但在這一刻,我腦海中也有同樣的困惑,我希望有人能幫助我清理我腦海中的混亂。我正在尋找一些具有寫autocompleter經驗的人,可以給我一些小的和有用的提示。

回答

3

我想說,如果您使用LALR或LL解析器來實現這一點並不重要。無論選擇哪種生成器,關鍵問題都是解析器足夠健壯,能夠以有意義的方式處理錯誤。

由於您將連續不斷地提供解析器不完整的輸入,因此它必須能夠以穩定的方式從錯誤中恢復而不會放棄。通常一個簡單的解決方案是,當你發現一個錯誤時,你會忽略令牌,直到你再次達到可理解的狀態。在JS中,我猜最好的方法是吃令牌,直到你得到;}。從中繼續解析,就好像錯誤從未發生過一樣。 Bison實際上很好地處理了這種情況,請查看錯誤處理文檔。

autocompleter本身基本上是任何給定點的符號表的散步。正如你正確的標識,不可能做一個完整的自動完成器,因爲語言不是靜態類型的,但你至少可以知道在給定點上靜態聲明瞭什麼。