سؤال

When parsing AST with visitor, how could visitor detect when scope changes? For example, when we are in Class node, we create Class scope, but how to detect when we leaving a class node, to close the scope?

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
)
هل كانت مفيدة؟

المحلول

Use a simple scope stack. When you enter a new scope, push a new scope representation to the stack, when you leave it - pop it.

The first scope on the stack would be pre-defined and hold things like language constants.

When looking up a reference iterate through the stack from top down.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top