C++ C+中的抽象语法树表示+;
我已经有了创建令牌列表的令牌发生器接口。我有解析器的工作机制。它真的很独特,很有魅力。我唯一错过的是AST的基本结构。如何在抽象层上表示树、节点和语句。我不需要任何实现,只需要快速了解它在类层次结构中应该是什么样子? 我正在研究一种面向对象的语言。是的,我已经意识到我需要两种类型的陈述。一些返回值的“表达式”类型语句和一个不返回的指令流控制类型语句。C++ C+中的抽象语法树表示+;,c++,c++11,g++,C++,C++11,G++,我已经有了创建令牌列表的令牌发生器接口。我有解析器的工作机制。它真的很独特,很有魅力。我唯一错过的是AST的基本结构。如何在抽象层上表示树、节点和语句。我不需要任何实现,只需要快速了解它在类层次结构中应该是什么样子? 我正在研究一种面向对象的语言。是的,我已经意识到我需要两种类型的陈述。一些返回值的“表达式”类型语句和一个不返回的指令流控制类型语句。 非常感谢。如果您的语言是命令式的/c-like,那么常见的情况是将顶层层次结构拆分为两个超类型: 表情 声明 程序是一个语句列表,它本身就是一
非常感谢。如果您的语言是命令式的/c-like,那么常见的情况是将顶层层次结构拆分为两个超类型:
- 表情
- 声明
- 语句块(语句列表)
- ite(如果是其他)
- for(for循环及其初始化语句列表、check expression、increment语句和block
- while(类似,但仅检查表达式
- 变量声明
- 赋值(包括+=-=++--,您可以使用运算符字段、lval和rval将所有内容封装在一个类中)
- 函数调用(void one)
- 防喷器(二进制操作,任何包含2个操作数和1个运算符的操作,即+-*/%|&&&&&&&| |==我建议研究一下CLANG/LLVM项目。非常可靠的开源编译器,有很多工作要做。它将帮助您入门,并且挖掘他们的论坛/代码将比任何人在堆栈溢出帖子中都能提供更好的答案。@ChrisCM:Clang的一个问题,他们称之为
实际上是一个AST
,即绑定(此标识符在此处声明,此变量的类型为X)已经解决了。在两个阶段的算法1/生成AST 2/解析绑定中更容易做到这一点。这是一个正确的澄清,但我认为在使用它作为理解语法树的起点的领域中没有必要这样做。您需要的节点类型、结构、语句等…在两个方案中都是相似的,而且OP对此很好奇。@MatthieuM什么是ABT
?@hellogoodbay:这是我所知道的抽象绑定树的最佳名称。也就是说,一个富含语义信息的AST:名称被解析,表达式和变量被键入,…我应该如何在树层次结构中排列它们?我需要某种“AST”和“ASTNode”类遍历整个树。在我的解决方案中,实际上并不需要所有节点都是同一类型。您将有一个根,它是一个StatementBlock,它将包含一个语句列表。这些语句将包含其类定义的子树。正如您所见,我以递归方式定义了AST层次结构,因此您可以使用pattern visitor可以非常简单地浏览整个树。这是一种非常面向对象的方法,如果您不喜欢使用继承,您可以使用枚举来表示所有ASTNode节点及其类型,而不是为每个节点类型使用不同的类。问题是,如果需要语句,我将不知道派生节点的类型例如,键入。我只知道这是一个语句。为此,您必须使用一个非常强大的设计模式,名为pattern visitor!请参见我的另一个答案,如果这是您第一次看到它,您需要一些时间来理解:实际上我不建议返回类类型的对象,只是为了包装您将在中使用的类型你的语言带有一个名为type的抽象类,我根本不使用反射,所有的东西都将与C++完美地结合在一起!ABT
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; }