15

我在互联网上搜索了一些关于开发 C# 抽象语法树的新手信息,但我只能找到已经“知道”的人的信息。我是一名业务线应用程序开发人员,所以像这样的主题有点过头了,但这是为了我自己的教育,所以我愿意花时间学习任何必要的概念。

通常,我想了解从代码字符串开发代码的抽象表示背后的技术。更具体地说,我希望能够使用这个 AST 来做 C# 语法高亮。(我意识到语法高亮不需要 AST,但这似乎是学习一些“编译器”级技术的好机会。)

如果这个问题有点宽泛,我深表歉意,但我不知道还能问什么。

谢谢!

4

3 回答 3

21

首先你需要了解什么是解析,什么是抽象语法树。为此,您可以先查阅有关抽象语法树的维基百科。

您确实需要花一些时间阅读编译器教科书,以了解抽象语法树如何与解析相关,并且可以在解析时构建;经典参考是 Aho/Ullman/Sethi 的“编译器”一书(很容易在网上找到)。您可能会找到关于是否有任何“有趣”的方式来学习语言、语法、解析和编译器的答案?有指导意义。

一旦您了解了如何为简单语法构建 AST,您就可以将注意力转向 C# 之类的东西。这里的问题是规模庞大。玩一种有 20 条语法规则的玩具语言是一回事。使用数百或一千条规则的语法是另一回事。经验会让小人物更容易理解大人物是如何组合在一起的,以及如何与他们相处。

您可能不想构建自己的 C# 语法(或实现 C# 标准的语法);它的工作量很大。您可以获得可用的工具来为您提供 C# AST(Roslyn 已经被提及;ANTLR 有一个 C# 解析器,还有更多)。

确实,您可能会使用 AST 来突出显示语法(尽管这可能会用大锤杀死一个小虫子)。大多数人并没有考虑太多(但编译器书籍强调),是在您拥有 AST 之后会发生什么;大多数情况下,它们本身并没有用。你实际上需要更多的机器来做任何有趣的事情。与其一遍又一遍地重复这一点(我一直看到同样的问题),你可以查看我在解析后的生活中的讨论以获取更多详细信息。

于 2012-05-21T01:21:19.017 回答
5

你可能应该看看 Phil Trelford 的这个演讲:

24小时编写自己的编译器

这个人是个天才,会让你兴奋地学习编译器。他从字面上简单地解释了它,足以让一个五岁的孩子理解。有问题的五岁是他的儿子,所以可能有不公平的优势,但五岁就是五岁。

于 2016-05-13T14:37:34.187 回答
1

看看罗斯林。我认为这可能是您正在寻找的东西。它使您可以访问编译器 AST,以及许多其他令人惊奇的东西!

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

除此之外,我建议一本关于编译器的教科书。

于 2012-05-21T00:07:48.343 回答