Ejemplo n.º 1
0
        //------------------------------------------------------------
        // TypePath。
        TypePath parseTypePath()
        {
            // todo:
            // 配列演算子対応
            // オブジェクトハンドル対応

            Token    t        = currentToken();
            TypePath typePath = null;

            if (t.Value == Token.Kind.Identifier)
            {// identPath
                IdentPath identPath = parseIdentPath();;
                if (identPath != null)
                {
                    typePath = new TypePath(identPath);
                }
            }
            else
            {// builtInType?
                BuiltInType builtinType = ParseBuiltInType(t);
                if (builtinType != BuiltInType.Unknown)
                {
                    typePath = new TypePath(t, builtinType);
                    nextToken();
                }
            }
            return(typePath);
        }
Ejemplo n.º 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);
        }
Ejemplo n.º 3
0
        //------------------------------------------------------------
        /// <summary>
        /// ExternalModuleDecls:
        ///   ExternalModuleDecl
        ///   ExternalModuleDecl ExternalModuleDecls
        ///
        /// ExternalModuleDecl:
        ///   ImportExternalModule
        ///   UsingExternalModule
        ///
        /// ImportExternalModule:
        ///   "import" ModulePath ";"
        ///
        /// UsingExternalModule
        ///   "using" ModulePath ";"
        ///
        /// </summary>
        bool parseExternalModuleDecls(ModuleContext aModuleContext)
        {
            List <ExternalModuleDecl> decls = new List <ExternalModuleDecl>();

            while (true)
            {
                // キーワードチェック
                ExternalModuleDecl.Kind kind;
                if (currentToken().Value == Token.Kind.KeyImport)
                {// import
                    kind = ExternalModuleDecl.Kind.IMPORT;
                }
                else if (currentToken().Value == Token.Kind.KeyUsing)
                {// using
                    kind = ExternalModuleDecl.Kind.USING;
                }
                else
                {// exit
                    break;
                }
                nextToken();

                // パスをパース
                IdentPath identPath = parseModulePath();
                if (identPath == null)
                {// パース失敗
                    return(false);
                }
                // セミコロンで終わるはず
                if (currentToken().Value != Token.Kind.OpSemicolon)
                {// 失敗
                    setErrorKind(ErrorKind.EXTERNAL_MODULE_DECL_SEMICOLON_TERM_EXPECTED);
                    return(false);
                }
                nextToken();

                // 追加
                decls.Add(new ExternalModuleDecl(identPath, kind));
            }

            // 設定
            aModuleContext.ExternalModuleDecls = new ExternalModuleDecls(decls);
            return(true);
        }
Ejemplo n.º 4
0
        //------------------------------------------------------------
        /// <summary>
        /// ModuleDecl:
        ///   "module" ModulePath ";"
        ///   "prototype" "module" ModulePath ";"
        /// </summary>
        bool parseModuleDecl(ModuleContext aModuleContext)
        {
            // 'prototype'
            bool isProtoType = false;

            if (currentToken().Value == Token.Kind.KeyPrototype)
            {
                isProtoType = true;

                nextToken();
            }

            // 'module'
            if (currentToken().Value != Token.Kind.KeyModule)
            {
                setErrorKind(ErrorKind.MODULE_DECL_KEYWORD_EXPECTED);
                return(false);
            }
            nextToken();

            // ModulePath
            IdentPath modulePath = parseModulePath();

            if (modulePath == null)
            {
                return(false);
            }

            // ';'
            if (currentToken().Value != Token.Kind.OpSemicolon)
            {
                setErrorKind(ErrorKind.MODULE_DECL_SEMICOLON_TERM_EXPECTED);
                return(false);
            }
            nextToken();

            // ModuleDeclを作成
            aModuleContext.ModuleDecl = new ModuleDecl(modulePath, isProtoType);

            return(true);
        }
Ejemplo n.º 5
0
 //------------------------------------------------------------
 // コンストラクタ。
 public InheritType(IdentPath aTypeIdentPath)
 {
     IdentPath = aTypeIdentPath;
 }
Ejemplo n.º 6
0
 //------------------------------------------------------------
 // コンストラクタ。
 public ModuleDecl(IdentPath aPath, bool aIsProtoType)
 {
     IdentifierPath = aPath;
     IsProtoType    = aIsProtoType;
 }
Ejemplo n.º 7
0
 //------------------------------------------------------------
 // コンストラクタ。
 public ExternalModuleDecl(IdentPath aPath, Kind aKind)
 {
     mIdentifierPath = aPath;
     mKind           = aKind;
 }
Ejemplo n.º 8
0
        //------------------------------------------------------------
        // StaticTypeDef
        bool parseStaticTypeStandardDef(StaticTypeDef aTD, bool aIsProtoType)
        {
            // 最初はIdentifierのはず
            if (currentToken().Value != Token.Kind.Identifier)
            {
                setErrorKind(ErrorKind.STATIC_TYPE_DEF_IDENTIFIER_EXPECTED);
                return(false);
            }
            aTD.Ident = new Identifier(currentToken());
            nextToken();

            if (currentToken().Value == Token.Kind.OpColon)
            {// 継承
                if (aTD.TypeKind != StaticTypeDef.Kind.Class ||
                    aTD.TypeKind != StaticTypeDef.Kind.Interface
                    )
                {
                    setErrorKind(ErrorKind.STATIC_TYPE_DEF_ONLY_CLASS_OR_INTERFACE_CAN_IMPLEMENT_INTERFACE);
                    return(false);
                }
                nextToken();

                // IdentifierPath , のループ
                while (true)
                {
                    // 継承するインターフェースのパス
                    IdentPath typeIdentPath = parseIdentPath();
                    if (typeIdentPath == null)
                    {
                        setErrorKind(ErrorKind.STATIC_TYPE_DEF_IDENTIFIER_EXPECTED);
                        return(false);
                    }

                    // 登録
                    aTD.InheritTypeList.Add(new InheritType(typeIdentPath));

                    if (currentToken().Value == Token.Kind.OpColon)
                    {// 次のインターフェースへ
                        nextToken();
                        continue;
                    }

                    break;
                }
            }

            // 開始括弧
            if (currentToken().Value != Token.Kind.OpLCurly)
            {
                setErrorKind(ErrorKind.STATIC_TYPE_DEF_LCURLY_EXPECTED);
                return(false);
            }
            nextToken();

            // 内部実装ループ
            {
                Protection defaultProtection = Protection.Public;
                while (currentToken().Value != Token.Kind.OpRCurly &&
                       currentToken().Value != Token.Kind.EOF
                       )
                {
                    // Protection
                    if (parseTypeProtection(currentToken()) != Protection.Unknown &&
                        currentToken().Next.Value == Token.Kind.OpColon
                        )
                    {// DefaultProtectionChange
                        defaultProtection = parseTypeProtection(currentToken());
                        if (!checkProtection(defaultProtection, aIsProtoType))
                        {
                            return(false);
                        }
                        nextToken();
                        nextToken();
                        continue;
                    }

                    // Symbol
                    SymbolDef symbolDef = parseSymbolDef(aTD, defaultProtection, aIsProtoType);
                    if (symbolDef == null)
                    {
                        return(false);
                    }
                    aTD.SymbolDefList.Add(symbolDef);
                }
            }

            // 終端括弧
            if (currentToken().Value != Token.Kind.OpRCurly)
            {
                setErrorKind(ErrorKind.STATIC_TYPE_DEF_RCURLY_EXPECTED);
                return(false);
            }
            nextToken();

            // セミコロン
            if (currentToken().Value != Token.Kind.OpSemicolon)
            {
                setErrorKind(ErrorKind.STATIC_TYPE_DEF_SEMICOLON_EXPECTED);
                return(false);
            }
            nextToken();

            return(true);
        }
Ejemplo n.º 9
0
 //------------------------------------------------------------
 // ユーザー定義型として初期化。
 public TypePath(IdentPath aIP)
 {
     IdentPath = aIP;
 }