C++ C+中的抽象语法树表示+;

C++ C+中的抽象语法树表示+;,c++,c++11,g++,C++,C++11,G++,我已经有了创建令牌列表的令牌发生器接口。我有解析器的工作机制。它真的很独特,很有魅力。我唯一错过的是AST的基本结构。如何在抽象层上表示树、节点和语句。我不需要任何实现,只需要快速了解它在类层次结构中应该是什么样子? 我正在研究一种面向对象的语言。是的,我已经意识到我需要两种类型的陈述。一些返回值的“表达式”类型语句和一个不返回的指令流控制类型语句。 非常感谢。如果您的语言是命令式的/c-like,那么常见的情况是将顶层层次结构拆分为两个超类型: 表情 声明 程序是一个语句列表,它本身就是一

我已经有了创建令牌列表的令牌发生器接口。我有解析器的工作机制。它真的很独特,很有魅力。我唯一错过的是AST的基本结构。如何在抽象层上表示树、节点和语句。我不需要任何实现,只需要快速了解它在类层次结构中应该是什么样子? 我正在研究一种面向对象的语言。是的,我已经意识到我需要两种类型的陈述。一些返回值的“表达式”类型语句和一个不返回的指令流控制类型语句。
非常感谢。

如果您的语言是命令式的/c-like,那么常见的情况是将顶层层次结构拆分为两个超类型:

  • 表情
  • 声明
程序是一个语句列表,它本身就是一个语句

您可能希望有一个类作为扩展语句基类的语句类型

典型的场景如下所示:

  • 语句块(语句列表)
  • ite(如果是其他)
  • for(for循环及其初始化语句列表、check expression、increment语句和block
  • while(类似,但仅检查表达式
  • 变量声明
  • 赋值(包括+=-=++--,您可以使用运算符字段、lval和rval将所有内容封装在一个类中)
  • 函数调用(void one)
表达方式:


  • 防喷器(二进制操作,任何包含2个操作数和1个运算符的操作,即+-*/%|&&&&&&&| |==我建议研究一下CLANG/LLVM项目。非常可靠的开源编译器,有很多工作要做。它将帮助您入门,并且挖掘他们的论坛/代码将比任何人在堆栈溢出帖子中都能提供更好的答案。@ChrisCM:Clang的一个问题,他们称之为
    AST
    实际上是一个
    ABT
    ,即绑定(此标识符在此处声明,此变量的类型为X)已经解决了。在两个阶段的算法1/生成AST 2/解析绑定中更容易做到这一点。这是一个正确的澄清,但我认为在使用它作为理解语法树的起点的领域中没有必要这样做。您需要的节点类型、结构、语句等…在两个方案中都是相似的,而且OP对此很好奇。@MatthieuM什么是
    ABT
    ?@hellogoodbay:这是我所知道的抽象绑定树的最佳名称。也就是说,一个富含语义信息的AST:名称被解析,表达式和变量被键入,…我应该如何在树层次结构中排列它们?我需要某种“AST”和“ASTNode”类遍历整个树。在我的解决方案中,实际上并不需要所有节点都是同一类型。您将有一个根,它是一个StatementBlock,它将包含一个语句列表。这些语句将包含其类定义的子树。正如您所见,我以递归方式定义了AST层次结构,因此您可以使用pattern visitor可以非常简单地浏览整个树。这是一种非常面向对象的方法,如果您不喜欢使用继承,您可以使用枚举来表示所有ASTNode节点及其类型,而不是为每个节点类型使用不同的类。问题是,如果需要语句,我将不知道派生节点的类型例如,键入。我只知道这是一个语句。为此,您必须使用一个非常强大的设计模式,名为pattern visitor!请参见我的另一个答案,如果这是您第一次看到它,您需要一些时间来理解:实际上我不建议返回类类型的对象,只是为了包装您将在中使用的类型你的语言带有一个名为type的抽象类,我根本不使用反射,所有的东西都将与C++完美地结合在一起!
    class Ite extends Statement {
       Expression condition;
       Statement ifBranch;
       Statement elseBranch;
    }
    
    
    class Bop extends Expression {
       BOperator operator;  // +, -. * or whatever
       Expression left;     // Left operand
       Expression right;    // Right operand
    }
    
    
    class StatementBlock extends Statement {
       List<Statement> statements;
    }
    
    
    class Assignment extends Statement {
       AOperator assignOp;  // = += -= etc.
       LVal lvalue;         // The lvalue cannot be an arbitrary expression, you will usually have a specific type for it
       Expression rvalue;   // Right value
    }
    
    enum Type {
       CHAR,
       SHORT,
       INT,
       LONG,
       FLOAT,
       DOUBLE,
       ARRAY
    }
    
    class Float extends StaticType {
        final Type type = Type.FLOAT;
    }
    
    class Array extends StaticArray {
        final Type type = Type.ARRAY;
    
        int size;
    }