开发抽象语法树

15

我搜遍了互联网,寻找有关C#抽象语法树开发的新手信息,但我只能找到针对已经“知道的人”的信息。我是一名业务应用程序开发人员,因此这些主题有点难度,但这是为了自己的教育,所以我愿意花时间学习必要的概念。

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

如果我的问题有点宽泛,我很抱歉,但我不知道还有什么其他方式可以提问。

谢谢!


如果你想要一个编译器的好起点,那么“龙书”(IMHO)是一本很棒的书。http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools - James Manning
3个回答

21

首先,您需要了解什么是解析以及什么是抽象语法树。您可以参考维基百科的抽象语法树条目进行初步了解。

要理解抽象语法树与解析的关系以及在解析时如何构建抽象语法树,您确实需要花时间阅读编译器教材;经典参考书是Aho/Ullman/Sethi的《编译原理》(可轻松在网上找到)。您可能会发现Stack Overflow上的有关语言、语法、解析和编译器的“有趣”学习方法回答很有启发性。

一旦您了解如何为简单语法构建AST,您就可以开始研究类似C#这样的内容。问题在于规模非常大;玩具语言只有20个语法规则,但处理数百个或上千个语法规则的语法则另当别论。通过小规模的练习,您可以更容易地理解大规模语法的构建方式以及如何应对它们。

您可能不想构建自己的C#语法(或者实现C#标准中的语法),因为这需要很多工作量。您可以使用现有的工具来获取C# AST(如Roslyn已被提及;ANTLR有一个C#解析器,还有许多其他工具可用)。

确实,您可以将AST用于语法高亮(尽管这可能是杀鸡焉用牛刀)。大多数人没有考虑过的事情(但编译器书籍强调),是在获得AST后,它们本身并不太有用。要做任何有趣的事情,您实际上需要更多的机制。

如果您想了解更多信息,而不是一遍又一遍地重复(我经常看到相同类型的问题),您可以查看我在解析之后的生活中的讨论。


1
我知道有点晚了,但是你看过GOLD Parser吗?这个程序允许你使用BNF规则构建语法,并生成任何语言的骨架代码来处理解析树,即在遍历解析树时解释代码或生成代码。 - Intrepid
@Mike Clarke:我原本以为 GOLD 只是解析语法,事实上它确实构建了一棵解析树?但我从网页http://goldparser.org/doc/index.htm上没有发现任何证据。 - Ira Baxter

6

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

在24小时内编写自己的编译器

这个人是个天才,他会让你兴奋地学习编译器。他的解释甚至简单到一个五岁孩子都能理解。问题中的那个五岁孩子就是他的儿子,所以可能有不公平的优势,但五岁就是五岁。


1

我认为Roslyn不是抽象语法树的好例子。它的语法树包含每个分号、注释和空格,这使它成为一个非常具体的语法树。但如果语法高亮是目标,Roslyn将是一个不错的选择。 - svick
你能推荐一本特别的教材吗?我并不是在寻找现成的解决方案,我想通过开发自己的解决方案来提高自己。 - Vince Fedorchak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接