【问题标题】:Developing Abstract Syntax Tree开发抽象语法树
【发布时间】:2012-05-21 00:04:01
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • FWIW,如果你想从编译器开始的好地方,龙书是(恕我直言)一本很棒的书。 en.wikipedia.org/wiki/…
  • @James Manning:谢谢,我会检查一下!

标签: c# abstract-syntax-tree


【解决方案1】:

首先您需要了解什么是解析,以及什么是抽象语法树。为此,您可以先咨询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 来突出显示语法(尽管这可能会用大锤杀死一个小虫子)。大多数人并没有考虑太多(但编译器书籍强调),是在您拥有 AST 之后会发生什么;大多数情况下,它们本身并没有用。你实际上需要更多的机器来做任何有趣的事情。 不要一遍又一遍地重复这个(我一直看到同样的问题),你可以在Life After Parsing上查看我的讨论以了解更多详细信息。

【讨论】:

  • 我知道这有点晚了,但你看过GOLD Parser吗?该程序允许您使用 BNF 规则构建语法并生成任何语言的框架代码来处理解析树,即在您遍历解析树或生成代码时解释代码。
  • @Mike Clarke:我以为只有 GOLD 被解析了。它实际上构建了一个解析树?没有证据表明我可以从网页goldparser.org/doc/index.htm
【解决方案2】:

您或许应该看看 Phil Trelford 的这篇演讲:

Write your own compiler in 24 hours

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我认为 Roslyn 不是 abstract 语法树的一个很好的例子。它的语法树包含每个分号、注释和空格,这使它成为一个非常具体的语法树。但如果语法高亮是目标,Roslyn 将是一个不错的选择。
    • 有什么特别的教科书可以推荐吗?我并不是真的在寻找现成的解决方案,我希望通过开发自己的解决方案来启发自己。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多