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); }