我已经有了创建令牌列表的分词器接口,并且已经实现了解析器的工作机制,它非常独特,运行得非常好。我所缺少的只是AST的基本结构,以及如何在抽象层面上表示树、节点和语句的方式。我不需要任何实现,只需要快速了解类层次结构中应该看起来像什么?
我正在开发一种面向对象的语言。是的,我已经意识到我将需要两种类型的语句。一些返回值的“表达式”类型语句和一种无返回值的指令流控制类型语句。
非常感谢。
如果你的编程语言是命令式/C语言风格,通常情况下顶层结构会被分成两个超类型:
程序是语句列表,每个语句本身都是一个语句。
您可能希望有一个语句类型的类扩展语句基类。
一个典型的场景看起来像:
对于表达式:
有这两个抽象(表达式和语句)的好处是在所有类中,您将拥有抽象类型,并能够使用访问者模式访问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而言,仅静态类型就足够了;如果要实现一些后端,还需要一些动态类型)。
如果您不打算支持需要大小信息的定长数组,则通常可以使用一些枚举指定静态类型。 如果您想要带有大小的定长数组,则可以为类型实现一个类,并使数组类型包含额外的大小信息。
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,它将持有包含有关运行时内存信息的堆栈/堆。此时,您需要将值与其类型信息一起存储。
ABT
? - HelloGoodbye