我已经有了创建 token 列表的tokenizer接口(interface)。我有解析器的工作机制。它确实是独一无二的,并且像一种魅力。我唯一想念的是AST的基本结构。树,节点和语句应如何在抽象级别上表示。我不需要任何实现,只是一个快速的想法,它在类层次结构中应该是什么样子?
我正在研究一种面向对象的语言。是的,我已经意识到我将需要两种类型的陈述。一些值返回“表达式”类型的语句和一个非返回的指令流控制类型的语句。
非常感谢你。
最佳答案
如果您的语言是命令式/c语言,则常见的情况是将顶级层次结构划分为2个父类(super class)型:
该程序是一个语句列表,它本身就是一个语句。
您可能希望为扩展语句基类的语句类型使用一个类。
典型场景如下:
对于表达式:
拥有这2个抽象(表达式和语句)的好处是,在所有类中,您将拥有抽象类型,并且能够使用访问者模式访问AST。
例如,某些类如下所示(伪代码):
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
}
另外,您将需要某种方式来表示类型(对于AST,仅静态类型就足够了,如果您还计划实现某些后端,则也将需要一些动态类型)。
如果您不打算支持需要大小信息的固定大小的数组,则通常可以使用一些枚举来指定静态类型。如果要使用size固定大小的数组,则可以实现一个类型的类,并让数组类型保存其他大小信息。
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;
}
然后,您将为AST中的每种类型实例化一个StaticType实例,例如,当用户声明一个变量时。如果您将来也打算进行静态类型检查,则可以使用相同的层次结构。
至于以AST形式运行/解释代码,您将需要一个Memory,该Memory包含一个堆栈/堆,其中包含有关运行时内存的信息。此时,您将需要将值及其类型信息一起存储。
关于c++ - C++中的抽象语法树表示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18188612/