抽象语法树:对象链(Class :: StaticMethod()。element.method())

时间:2014-07-20 07:37:05

标签: parsing compiler-construction abstract-syntax-tree

我正在尝试为我的编程语言创建一个抽象语法树(非常类似于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
}

或者你们会采用另一种方法,我的意思是你们也可以使用运算符。和::作为节点名称,然后将两个子节点附加到它,但是这不会使解析和递归树更难吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我不认为AST中有一个词汇通常是常见的。它们在解析树中使用,但由于AST是作为语义分析的一部分创建的,因此您实际上在此处拥有更丰富的信息。因此,AST中的节点应指向您的符号表。

例如,符号表将包含对象的条目(可能在您看到声明或首次使用对象时插入),以及方法的条目(并且该方法的条目包含指向对象类的条目的指针。

此时,您可以决定对象是作为显式参数传递给方法(例如在python或Ada中),还是隐式传递(C ++)。

因此,对于object.method(),AST将包含一个节点'methodcall',其中一个子节点'self'指向对象条目,一个子节点'method'指向方法条目,加上n每个参数的子节点(指向相应的条目或表达式节点)。