开发抽象语法树

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

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

如果这个问题有点宽泛,我很抱歉,但我不确定该怎么回答。

谢谢!

首先,您需要了解解析的内容以及树的抽象语法。 为此,您可以首先查看抽象语法树上的Wikipedia 。

你真的需要花一些时间在编译器教科书上来理解抽象语法树如何与解析相关,并且可以在解析时构造; 经典的参考文献是Aho / Ullman / Sethi的“编译器”一书(很容易在网上找到)。 您可以找到SO答案是否有任何“有趣”的方式来学习语言,语法,解析和编译器? 启发。

一旦你理解了如何为简单的语法构建AST,你就可以将注意力转向像C#这样的东西。 这里的问题是规模庞大; 用20种语法规则玩玩具语言是一回事。 使用几百或一千条规则的语法是另一种方法。 通过小经验可以更容易地理解大的如何组合在一起,以及如何与它们共存。

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

确实,您可以使用AST进行语法突出显示(尽管这可能会使用大锤杀死一个gnat)。 大多数人没有太多考虑(但编译器书籍强调),就是你拥有AST后会发生的事情; 大多数情况下他们自己都没用。 你真的需要更多的机器来做任何有趣的事情。 而不是一遍又一遍地重复(我一直看到同样的问题),你可以看到我对解析后的生活的讨论了解更多细节。

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

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

这个人是天才,会让你开火学习编译器。 他对一个五岁的孩子的理解很容易解释。 这个五岁的孩子是他的儿子,所以可能有一个不公平的优势,但五个是五个。

看看罗斯林吧。 我想这可能就是你要找的东西。 它让您可以访问编译器AST,以及许多其他令人惊叹的东西!

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

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