/// <summary>
        /// Провести семантический анализ текста
        /// </summary>
        /// <param name="text"></param>
        /// <param name="libraryScope"></param>
        /// <param name="tokenStream"></param>
        /// <param name="tree"></param>
        /// <returns></returns>
        public VhdlFile ParseText(string text, string filePath, out CommonTokenStream tokenStream, out IParseTree tree)
        {
            VhdlFile file = null;

            lock (this)
            {
                // Start process
                ICharStream stream = new CaseInsensitiveStringStream(text, filePath);
                file = Parse(stream, currentLibrary, out tokenStream, out tree);
            }
            return(file);
        }
        private ArrayType GetArrayType(PapyrusType elementType)
        {
            var objectIdentifier = elementType.Name;

            lock (_arrayTypes)
            {
                if (!_arrayTypes.ContainsKey(objectIdentifier))
                {
                    var source = CreateArrayTypeSource(objectIdentifier);
                    var stream = new CaseInsensitiveStringStream(source);
                    var lexer  = new PapyrusLexer(stream);
                    var parser = new PapyrusParser(new CommonTokenStream(lexer));
                    parser.AsDynamic().KnownUserFlags = _program.FlagsFile.NativeFlagsDict;
                    parser.script();

                    var compilerType = parser.ParsedObject;

                    var nodeBinder = new NodeBinder();

                    var node = nodeBinder.Bind(null, _program,
                                               new ScriptText(null, source, "0"), compilerType.GetTokenStream(), compilerType.GetAst());

                    var scopeBinder = new ScopeBinder();
                    var scopeResult = scopeBinder.Bind(compilerType, node.Value);

                    node.Diagnostics.AddRange(scopeResult.Diagnostics);

                    var symbolBinder = new SymbolBinder();
                    var symbolResult = symbolBinder.Bind(node.Value);

                    var type = new ArrayType(_program, symbolResult.Value, compilerType, elementType.Name);
                    _arrayTypes.Add(objectIdentifier, type);
                }

                return(_arrayTypes[objectIdentifier]);
            }
        }
        /// <summary>
        /// Если обьект класса  CodeFile является VHDL_CodeFile,
        /// то провести его обработку и встроить в общую библиотеку,
        /// новый поток не создается,
        /// ошибки выписываются в обьект file
        /// </summary>
        /// <param name="file"></param>
        public override void ProcessCodeFile(CodeFile file)
        {
            try
            {
                lock (this)
                {
                    isBusy = true;
                    if ((file is VHDL_CodeFile) && ((file as VHDL_CodeFile).LibraryName == "work"))
                    {
                        VHDL_CodeFile vhdlCode = (file as VHDL_CodeFile);

                        vhdlCode.ParseException         = null;
                        vhdlCode.ParseSyntaxException   = null;
                        vhdlCode.ParseSemanticException = null;

                        VhdlFile oldFile = null;
                        foreach (VhdlFile f in currentLibrary.Files)
                        {
                            if (f.FilePath == file.FilePath)
                            {
                                oldFile = f;
                                break;
                            }
                        }
                        if (oldFile != null)
                        {
                            currentLibrary.Files.Remove(oldFile);
                        }

                        IParseTree        tree;
                        CommonTokenStream tokenStream;
                        ICharStream       stream     = new CaseInsensitiveStringStream(file.Text, file.FilePath);
                        VhdlFile          ParsedFile = Parse(stream, currentLibrary, out tokenStream, out tree);
                        if (ParsedFile != null)
                        {
                            ParsedFile.FilePath = file.FilePath;
                        }

                        vhdlCode.File = ParsedFile;
                        vhdlCode.ParseSemanticException = parseSemanticException;
                        vhdlCode.ParseSyntaxException   = parseSyntaxException;
                        vhdlCode.ParseException         = parseException;
                        vhdlCode.TokenStream            = tokenStream;
                        vhdlCode.Tree = tree;

                        vhdlCode.LibraryFileInfo = LibraryFileInfo.AnalyseText(vhdlCode.Text, vhdlCode.FilePath, vhdlCode.LibraryName);

                        foreach (CodeFile f in vhdlCode.Dependencies)
                        {
                            f.NeedForUpdate = true;
                        }

                        SetDependencies();
                    }
                    base.ProcessCodeFile(file);
                    isBusy = false;
                }
            }
            catch (Exception ex)
            {
                Messages.Add(new DiagnosticMessage(string.Format("Message: {0}\n Source: {1}\n StackTrace: {2}\n HelpLink: {3}", ex.Message, ex.Source, ex.StackTrace, ex.HelpLink)));
                NotifyCollectionChanged();
            }
        }