我正在尝试为我的编程语言创建一个抽象语法树(非常类似于Java和C ++) 我想知道代表一个物体的最佳方法是什么。
以下关系是可能的:
类:: StaticObject
类:: STATICMETHOD()
object.attribute
的object.method()
我正在考虑用这种方式表示它(伪代码):
interface Primitive
Object : Primitive
{
Lexeme Lefthandside;
boolean Staticreference; // true = ::, false is . operator
Primitive Righthandside; // Can either be a method or an object, null if no operator is present
}
Method : Primitive
{
Lexeme Lefthandside;
List of Parameters; // Parameters of the method
}
或者你们会采用另一种方法,我的意思是你们也可以使用运算符。和::作为节点名称,然后将两个子节点附加到它,但是这不会使解析和递归树更难吗?
感谢您的帮助!
答案 0 :(得分:0)
我不认为AST中有一个词汇通常是常见的。它们在解析树中使用,但由于AST是作为语义分析的一部分创建的,因此您实际上在此处拥有更丰富的信息。因此,AST中的节点应指向您的符号表。
例如,符号表将包含对象的条目(可能在您看到声明或首次使用对象时插入),以及方法的条目(并且该方法的条目包含指向对象类的条目的指针。
此时,您可以决定对象是作为显式参数传递给方法(例如在python或Ada中),还是隐式传递(C ++)。
因此,对于object.method(),AST将包含一个节点'methodcall',其中一个子节点'self'指向对象条目,一个子节点'method'指向方法条目,加上n每个参数的子节点(指向相应的条目或表达式节点)。