我在互联网上搜寻了一些关于开发C#抽象语法树的新手信息,但我只能找到那些已经“知情”的人的信息。我是一名业务线应用程序开发人员,所以像这样的主题有点超出我的理解,但这是为了我自己的教育,所以我愿意花时间学习任何必要的概念。
通常,我想了解从代码字符串开发代码的抽象表示背后的技术。更具体地说,我希望能够使用这个AST来突出显示C#语法。(我意识到语法突出显示不一定需要AST,但这似乎是学习一些“编译器”-level技术的好机会。)
如果这个问题有点宽泛,我很抱歉,但我不确定还能问什么。
谢谢!
发布于 2012-05-21 09:21:19
首先,您需要了解什么是解析,以及什么是抽象语法树。对于这一点,您可以咨询Wikipedia on abstract syntax trees进行初步了解。
你真的需要花一些时间阅读一本编译器课本来理解抽象语法树与解析的关系,并且可以在解析时构建;经典的参考是Aho/Ullman/Sethi的《编译器》一书(很容易在web上找到)。你可能会发现Are there any "fun" ways to learn about Languages, Grammars, Parsing and Compilers?的SO答案很有启发性。
一旦你理解了如何用一个简单的语法构建一个AST,你就可以把注意力转移到像C#这样的东西上。这里的问题是纯粹的规模;玩一种有20个语法规则的玩具语言是一回事。使用包含数百或数千条规则的语法则是另一回事。小的经验将使我们更容易理解如何将大的放在一起,以及如何与它们共处。
您可能不想构建自己的C#语法(或者实现来自C#标准的语法);这需要做大量的工作。您可以获得可用的工具,这些工具将为您提供C# AST(前面已经提到了C#;ANTLR有一个AST解析器,还有更多)。
的确,您可以使用AST来突出显示语法(尽管这可能是一把大锤砸死了一个gnat )。大多数人不会过多考虑(但编译器书籍强调),在拥有AST之后会发生什么;大多数情况下,它们本身并没有什么用处。你实际上需要更多的机器来做任何有趣的事情。与其一遍又一遍地重复这个问题(我总是看到同样的问题),你可以看看我在Life After Parsing上的讨论,了解更多细节。
发布于 2016-05-13 22:37:34
你可能应该看看Phil Trelford的这篇演讲:
Write your own compiler in 24 hours
这个人是个天才,他会让你热衷于学习编译器。他解释说,这对于一个五岁的孩子来说已经足够容易理解了。这个5岁的孩子是他的儿子,所以可能有不公平的优势,但5岁等于5岁。
发布于 2012-05-21 08:07:48
看看罗斯林。我想这可能就是你要找的。它可以让你访问编译器AST,以及其他许多令人惊叹的东西!
http://blogs.msdn.com/b/visualstudio/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx
除此之外,我建议编写一本关于编译器的教科书。
https://stackoverflow.com/questions/10678242
复制相似问题