Beispiel #1
0
        const byte BC_VERSION_PRIVATE_MINOR = 0; // バイトコードのプライベートマイナーバージョン。

        //------------------------------------------------------------
        // コンストラクタ。
        public BCModule(ModuleSymbolNode aModuleSymbolNode)
        {
            mModuleSymbolNode   = aModuleSymbolNode;
            mConstantValueTable = new BCConstantValueTable();
            mSymbolLinkTable    = new BCSymbolLinkTable();
            mObjectTypeList     = new BCObjectTypeList();
        }
Beispiel #2
0
        //------------------------------------------------------------
        // モジュールを追加する。
        public bool Add(ModuleContext aModuleContext)
        {
            // 同じパスのものが既に追加されていないかチェックしつつ追加する
            ISymbolNode node      = mRoot;
            IdentPath   identPath = aModuleContext.ModuleDecl.IdentifierPath;

            for (int i = 0; i < identPath.Count; ++i)
            {
                ISymbolNode nextNode = node.FindChildNode(identPath.At(i));
                if (i + 1 == identPath.Count)
                {     // 最後
                    if (nextNode != null)
                    { // 最後なのに存在している
                        setErrorInfo(aModuleContext, ErrorKind.NODE_NAME_IS_ALREADY_EXIST, node.GetIdentifier().Token);
                        return(false);
                    }
                    break;
                }

                if (nextNode == null)
                {// 存在しないようなので追加
                    NamespaceSymbolNode addNode = new NamespaceSymbolNode(node, identPath.At(i));
                    if (node.GetNodeKind() == SymbolNodeKind.Root)
                    {
                        ((RootSymbolNode)node).AddNode(addNode);
                    }
                    else
                    {
                        ((NamespaceSymbolNode)node).AddNode(addNode);
                    }
                    node = addNode;
                }
                else
                {// 既に存在している
                    node = nextNode;
                    if (node.GetNodeKind() != SymbolNodeKind.NameSpace)
                    {// 名前空間じゃないものとして存在する
                        setErrorInfo(aModuleContext, ErrorKind.NODE_NAME_IS_ALREADY_EXIST_AS_NOT_NAMESPACE, node.GetIdentifier().Token);
                        return(false);
                    }
                }
            }
            Assert.Check(node.GetNodeKind() == SymbolNodeKind.NameSpace);

            // Moduleノードを追加
            var moduleSymbolNode = new ModuleSymbolNode(node, aModuleContext);

            ((NamespaceSymbolNode)node).AddNode(moduleSymbolNode);
            mModuleSymbolNodeList.Add(moduleSymbolNode);

            return(true);
        }