public bool Visit(Ident node)
        {
            if (node.SymType != null)
            {
                return(true);
            }

            var sym = !_inLastNamespace
                ? _symStack.FindIdent(node.ToString())
                : _symStack.FindIdentInScope(node.ToString()) ?? _symStack.FindIdent(node.ToString());

            if (sym == null)
            {
                if (node.ToString() == "result" && _inLastNamespace)
                {
                    throw new Exception(string.Format(
                                            "({0}, {1}) semantic error: procedure does not have return variable '{2}'",
                                            node.Token.Line, node.Token.Column, node.Token.Lexeme));
                }
                else if (_inLastNamespace)
                {
                    throw new Exception(string.Format(
                                            "({0}, {1}) semantic error: field '{2}' is not defined in this scope",
                                            node.Token.Line, node.Token.Column, node.Token.Lexeme));
                }
                else
                {
                    throw new Exception(string.Format(
                                            "({0}, {1}) semantic error: identifier '{2}' is not defined",
                                            node.Token.Line, node.Token.Column, node.Token.Lexeme));
                }
            }

            node.SymVar   = sym;
            node.SymType  = sym.VarSymType;
            node.IsLValue = !(sym is SymConstant);

            return(true);
        }