我在互联网上搜索有关开发C#抽象语法树的一些新手信息,但我只能找到已经“知道”的人的信息。我是一个业务线应用程序开发人员,所以这些主题有点过头,但这是我自己的教育所以我愿意花时间学习任何必要的概念。
通常,我想了解从代码字符串开发代码的抽象表示背后的技术。更具体地说,我希望能够使用此AST来执行C#语法突出显示。 (我意识到语法高亮并不需要AST,但这似乎是学习一些“编译器”级技术的好机会。)
如果这个问题有点宽泛,我很抱歉,但我不确定该怎么回答。
谢谢!
答案 0 :(得分:16)
首先,您需要了解解析的内容以及树的抽象语法。为此,您可以先咨询Wikipedia on abstract syntax trees。
你真的需要花一些时间阅读编译器教科书来理解抽象语法树如何与解析相关,并且可以在解析时构建;经典的参考文献是Aho / Ullman / Sethi的“编制者”一书(很容易在网上找到)。你可以找到Are there any "fun" ways to learn about Languages, Grammars, Parsing and Compilers?指导的SO答案。
一旦你理解了如何为简单的语法构建AST,你就可以将注意力转向像C#这样的东西。这里的问题是规模庞大;用20种语法规则玩玩具语言是一回事。使用几百或一千条规则的语法是另一种方法。小经验将使人们更容易理解如何将大单元放在一起,以及如何与它们共处。
您可能不希望构建自己的C#语法(或实现C#标准中的语法);它做了很多工作。您可以获得可用于提供C#AST的工具(Roslyn已被提及; ANTLR有一个C#解析器,还有更多)。
确实,您可以使用AST进行语法突出显示(尽管这可能会使用大锤杀死一个gnat)。大多数人没有太多考虑(但编译器书籍强调),就是你拥有AST之后会发生的事情;大多数情况下他们自己都没用。你真的需要更多的机器来做任何有趣的事情。 而不是一遍又一遍地重复(我一直看到同样的问题),你可以在Life After Parsing上看到我的讨论,了解更多细节。
答案 1 :(得分:4)
你应该看看Phil Trelford的这个演讲:
Write your own compiler in 24 hours
这个人是个天才,会让你开火学习编译器。他对一个五岁的孩子的理解很容易解释。这个五岁的孩子是他的儿子,所以可能有不公平的优势,但五个是五岁。
答案 2 :(得分:1)
看看罗斯林。我想这可能就是你要找的东西。它使您可以访问编译器AST,以及许多其他令人惊奇的东西!
http://blogs.msdn.com/b/visualstudio/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx
除此之外,我建议编写一本关于编译器的教科书。