AST中的函数参数?

时间:2018-04-20 20:48:02

标签: abstract-syntax-tree compiler-construction

我正在编写一个Complier,目前我正试图勾勒出我的示例代码的AST,我知道它是如何工作的。令我困惑的是,我究竟能代表它。我在网上查找了JavaScript AST,但他们在函数声明中没有任何参数声明,这让我很困惑。那么我究竟如何为具有两个参数的函数绘制AST?我把它们放在功能声明中吗?

1 个答案:

答案 0 :(得分:2)

我没有编译器设计经验,但我的工作让我盯着很多AST。以下是您提到的特定主题的几个示例 - 函数声明中的参数。

JavaScript(via esprima)包含函数参数作为函数声明节点的属性。参数myFunctionargOne的{​​{1}}示例声明如下:

argTwo

作为另一个例子,考虑FuncDecl的golang类型。

{
  "type": "FunctionDeclaration",
  "id": {
    "type": "Identifier",
    "name": "myFunction"
  },
  "params": [
    {
      "type": "Identifier",
      "name": "argOne"
    },
    {
      "type": "Identifier",
      "name": "argTwo"
    }
  ],
  "body": { ... }
}

函数参数保存在type FuncDecl struct { Doc *CommentGroup // associated documentation; or nil Recv *FieldList // receiver (methods); or nil (functions) Name *Ident // function/method name Type *FuncType // function signature: parameters, results, and position of "func" keyword Body *BlockStmt // function body; or nil for external (non-Go) function } 键下,其类型包含Type列表:

Params

作为最后一个例子,对于多样性,请考虑带有两个参数的Elixir函数的引用形式。

type FuncType struct {
    Func    token.Pos  // position of "func" keyword (token.NoPos if there is no "func")
    Params  *FieldList // (incoming) parameters; non-nil
    Results *FieldList // (outgoing) results; or nil
}

这里,元组的第三个元素是“参数列表”,无论是函数接受的参数列表(如上所述)还是应用于函数调用的参数。

祝你的编译器冒险好运!