2013-05-17 53 views
2

当用访客解析AST时,访问者如何检测范围更改?例如,当我们在Class节点中时,我们创建了Class scope,但是如何检测我们何时离开一个类节点来关闭范围?AST解析,检测当前范围

1: Stmt_Class(
    type: 0 
    extends: null 
    implements: array(
    ) 
    stmts: array(
     0: Stmt_ClassMethod(
      type: 1 
      byRef: false 
      params: array(
       0: Param(
        name: str 
        default: null 
        type: null 
        byRef: false 
       ) 
      ) 
      stmts: array(
       0: Stmt_Return(
        expr: Expr_FuncCall(
         name: Name(
          parts: array(
           0: mysql_real_escape_string 
          ) 
          name: null 
         ) 
         args: array(
          0: Arg(
           value: Expr_Variable(
            name: str 
           ) 
           byRef: false 
           name: null 
          ) 
         ) 
        ) 
        name: null 
       ) 
      ) 
      name: clear 
     ) 
    ) 
    name: Filter 
) 

回答

2

使用简单的作用域堆栈。当你进入一个新的作用域时,当你离开它时,将一个新的作用域表示推送到堆栈 - 弹出它。

堆栈中的第一个作用域将被预先定义并保存诸如语言常量之类的东西。

当查找参考从上到下迭代通过堆栈时。