代码之家  ›  专栏  ›  技术社区  ›  Erik Forbes

把C代码翻译成AST?

  •  15
  • Erik Forbes  · 技术社区  · 16 年前

    当前是否可以将C代码转换为抽象语法树?

    编辑:一些澄清;我不一定期望编译器为我生成AST——解析器会很好,尽管我想使用一些“正式”的东西。遗憾的是,lambda表达式不够,因为它们不允许我使用语句体,这正是我要找的。

    12 回复  |  直到 8 年前
        1
  •  17
  •   Paul Rubel    13 年前

    这个 Roslyn 项目位于Visual Studio 2010中,通过它,您可以通过编程访问 Syntax Tree 以及其他事情。

    SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
        @" C# code here ");
    var root = (CompilationUnitSyntax)tree.Root;
    
        2
  •  12
  •   Konrad Rudolph    16 年前

    当前是否可以将C代码转换为抽象语法树?

    是的,在特殊情况下(使用新的 Expressions framework ):

    // Requires 'using System.Linq.Expressions;'
    Expression<Func<int, int>> f = x => x * 2;
    

    这将为lambda创建表达式树,即一个函数 int 把双人间还给我。您可以使用表达式框架(=该命名空间中的类)修改表达式树,然后在运行时编译它:

    var newBody = Expression.Add(f.Body, Expression.Constant(1));
    f = Expression.Lambda<Func<int, int>>(newBody, f.Parameters);
    var compiled = f.Compile();
    Console.WriteLine(compiled(5)); // Result: 11
    

    请注意,所有表达式都是不可变的,因此必须通过组合重新构建它们。在这种情况下,我已经准备了一个附加的1。

    请注意,这些表达式树只适用于实际表达式,即C函数中的内容。您不能通过这种方式获得类等更高构造的语法树。使用codedom框架。

        3
  •  6
  •   Rob Walker    16 年前

    退房.NET CodeDom 支持。有一篇关于 C# CodeDOM parser 但它不支持新的语言功能。

    还应该在开发中支持根据此从C源代码生成codedom树 posting .

        4
  •  4
  •   NN_    14 年前
        5
  •  3
  •   konrad.kruczynski    12 年前

    我个人会用 NRefactory 这是免费的,开源的,并获得普及。

        6
  •  2
  •   Erik Forbes    16 年前

    根据C 4之后的内容,看起来这类功能将包括在内。 Anders Hejlsberg's 'Future of C#' PDC video .

        7
  •  2
  •   Erik Forbes    16 年前

    这个 ANTLR Parser Generator 有一个C 3.0的语法,它涵盖了除LINQ语法之外的所有内容。

        8
  •  1
  •   yeeen    15 年前

    Antlr不是很有用。林肯不是你想要的。

    试试塞西尔! http://www.mono-project.com/Cecil

    它在许多项目中使用,包括ndepend! http://www.ndepend.com/

        9
  •  1
  •   Community CDub    7 年前

    我刚刚在StackOverflow的另一个线程上回答了一个解决方案,我在该解决方案中实现了一个API create and manipulate AST from C# Source Code

        10
  •  1
  •   SK-logic    14 年前

    奇怪的是,没有人建议对现有的Mono C编译器进行黑客攻击。

        11
  •  1
  •   Community CDub    7 年前

    我们的 C# front end for DMS 分析完整的C 3.0,包括LINQ并生成AST。实际上,DMS是一个生态系统,用于使用ASTS为前端提供的语言分析/转换源代码。

    编辑3/10/2010:…现在处理完整的C 4.0

    编辑:2014年6月27日:处理C 5.0很久了。

    编辑:2016年6月15日:处理C 6.0。见 https://stackoverflow.com/a/37847714/120163 对于一个样本AST。

        12
  •  0
  •   Community CDub    7 年前

    请参阅R项目(抱歉,文档是俄文的,但有一些代码示例)。它允许对C代码进行AST操作。

    http://www.rsdn.ru/projects/rsharp/article/rsharp_mag.xml

    项目的SVN是 here :(URL已更新,谢谢, derigel )

    另请参见 Nemerle 语言。它是一种.NET语言,支持元编程。