一段時間以來,我一直在思考從頭開始設計一種小型玩具語言,沒有什麼能夠「統治世界」,但主要是作爲一種練習。我意識到爲了實現這個目標需要學習很多東西。解析,突出顯示和完成之間的關係
這個問題是關於三個不同的概念(解析,代碼突出顯示和完成),這使我非常相似。當然,解析和ASTgen是編譯的一部分,而代碼突出顯示和完成是IDE的更多功能,但我不知道它們有什麼相似之處和不同之處。
我需要一些有關此主題更有經驗的人的提示。這些概念之間可以共享哪些代碼,以及哪些體系結構考慮有助於這種意義?
一段時間以來,我一直在思考從頭開始設計一種小型玩具語言,沒有什麼能夠「統治世界」,但主要是作爲一種練習。我意識到爲了實現這個目標需要學習很多東西。解析,突出顯示和完成之間的關係
這個問題是關於三個不同的概念(解析,代碼突出顯示和完成),這使我非常相似。當然,解析和ASTgen是編譯的一部分,而代碼突出顯示和完成是IDE的更多功能,但我不知道它們有什麼相似之處和不同之處。
我需要一些有關此主題更有經驗的人的提示。這些概念之間可以共享哪些代碼,以及哪些體系結構考慮有助於這種意義?
你想要的是一個語法導向structure editor。這是一個將分析與AST構建結合起來並使用解析器預測您可以輸入的內容(無論是語法完成)還是與編譯器上次運行相關聯的解析器,以便它可以解釋編輯點以查看可能的有效標識符接下來是檢查代碼中當時最後相關的編譯器符號表。
最困難的部分是爲用戶提供無縫體驗;她幾乎不得不相信她正在編輯文本或(結構編輯的經驗表明)她會拒絕它的尷尬。
這是很多機器來協調和相當大的努力。好消息是,編譯器無論如何都需要解析器;如果編輯也解析,則編譯器所需的AST基本可用。 (當然你也必須擔心批量編譯問題)。編譯器必須構建一個符號表;所以你可以在編輯完成過程中使用它。更困難的消息是解析器難於構建;他們不能只聲明用戶可見的語法錯誤並退出;相反,他們必須容忍同時存在的許多錯誤,爲這些部分保留部分AST,並在錯誤被用戶刪除時將它們縫合在一起。
Berkeley Harmonia人們在這方面做得很好。閱讀他們的一些論文以詳細瞭解問題以及處理這些問題的方法是非常值得的。
其他主要方法人員(特別是Intentional Programming和XText)似乎嘗試的是面向對象的編輯器,您將編輯操作附加到每個AST節點,並將屏幕上的每個點與AST節點相關聯。然後編輯動作調用特定於AST節點的動作(插入字符,向右走,向上走......),並且它可以決定如何操作以及如何修改屏幕。可以說,你可以讓這些編輯做任何事情;它在實踐中有點難度。我用過這些編輯器;他們不喜歡文本編輯。有一些熱心的用戶,但YMMV。
我想你可能應該選擇嘗試構建一個這樣的編輯器,而不是試圖定義一個新的語言。同時做兩件事可能會讓你陷入困境。
感謝您的回答。儘管您提供了一些有價值的鏈接,但我仍然錯過了您在編譯器中的解析器與IDE中的解析器之間所提到的差異的程度。例如,我將IDE中的解析器想象成整個代碼+當前行的一些函數 - >可能的完成,它已經存在於某些編譯器中(例如,當您向函數提供錯誤參數類型時,會提出替代方案)。 – 2011-04-26 10:29:29
IDE解析器必須比編譯器解析器「做得更多」,在某種意義上(正如你所指出的)它需要知道* legal * next(正如編譯器那樣)和* probable * next編譯器一般不關心)。「可能」基於整個應用程序的上下文;主要來自編譯器構建的符號表數據,並且可以在您使用IDE時進行更新。 (海灣合作委員會給你的替代方案實際上是在做這種「可能」的診斷。當然,它的幫助,這就是爲什麼你想要它在IDE中,也:) – 2011-04-26 10:50:11