2012-05-21 140 views
7

我已經在互聯網上尋找了一些有關開發C#抽象語法樹的新手信息,但我只能找到已知'已知'的人的信息。我是一個業務線應用程序開發人員,所以像這樣的主題有點凌駕於我的頭上,但這是爲了我自己的教育,所以我願意花時間學習任何必需的概念。開發抽象語法樹

通常,我想了解從代碼字符串開發代碼的抽象表示的技術。更具體地說,我希望能夠使用這個AST來做C#語法高亮。 (我意識到,語法高亮並不一定需要AST,但這似乎是學習一些「編譯器」級別技巧的好機會。)

如果此問題有點寬泛,但我很抱歉不知道該怎麼問。

謝謝!

+0

FWIW,如果你想要一個好的地方開始編譯器,龍書是(恕我直言)一本很好的書。 http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools –

+0

@ James Manning:謝謝,我會檢查一下! –

回答

12

首先您需要了解什麼是解析,以及什麼抽象語法樹。爲此,您可以首先查看Wikipedia on abstract syntax trees

你真的需要花一些時間在編譯器的教科書上來理解抽象語法樹是如何與解析相關的,並且可以在解析時構建;經典的參考文獻是Aho/Ullman/Sethi的「編譯器」一書(很容易在網上找到)。你可以找到答案Are there any "fun" ways to learn about Languages, Grammars, Parsing and Compilers?指導性的。

一旦您瞭解瞭如何爲簡單的語法構建AST,您就可以將注意力轉向類似C#的東西。這裏的問題很大,玩20種語法規則的玩具語言是一回事。使用數百或數千條規則的語法是另一回事。小的經驗會使它更容易理解大組合如何組合,以及如何與它們共處。您可能不想構建自己的C#語法(或實現C#標準中的一個);但是,您可能並不想構建自己的C#語法(或者實現C#標準中的一個)。其相當多的工作。您可以獲得可用的工具,它們將向您提供C#AST(Roslyn已經提到; ANTLR有一個C#解析器,還有更多)。

的確,您可能會使用AST進行語法高亮顯示(儘管這可能會使用大錘殺死一個gnat)。大多數人不太瞭解的東西(但編譯器書籍強調),是什麼發生在AST之後;大多數情況下他們本身並沒有用處。實際上你需要更多的機器去做任何有趣的事情。 而不是重複這一遍又一遍(我不斷看到同樣的問題),你可以看到我的Life After Parsing關於更多細節的討論。

+0

謝謝,只是我正在尋找的答案類型! –

+0

我知道這有點遲,但是你看過[GOLD Parser](http://goldparser.org/)嗎?這個程序允許你使用BNF規則構造一個語法,並且用任何語言生成骨架代碼來處理分析樹,也就是說當你分析樹或生成代碼時解釋代碼。 – Intrepid

+0

@Mike Clarke:我以爲只有GOLD被解析過。它實際上構建了一個分析樹?沒有證據顯示我可以從網頁上看到http://goldparser.org/doc/index.htm –

1

看看Roslyn。我想這可能是你要找的。它使您能夠訪問編譯器AST以及許多其他令人驚奇的事情!

http://blogs.msdn.com/b/visualstudio/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx

除此之外,我建議對編譯器的教科書。

+0

我認爲Roslyn不是一個* abstract *語法樹的好例子。它的語法樹包含每個分號,註釋和空白,這使得它成爲一個非常具體的語法樹。但如果語法突出是目標,羅斯林將是一個不錯的選擇。 – svick

+0

你可以推薦任何特定的教科書?我並不是在尋找現成的解決方案,我希望通過開發自己的方式來培養自己。 –

2

你或許應該看看這次講座由Phil Trelford:

Write your own compiler in 24 hours

這個人是個天才,而且會離開你解僱了了解編譯器。他對一個五歲的孩子很容易理解,這很容易。有問題的五歲是他的兒子,所以可能有不公平的優勢,但五歲就是五歲。