Exemplo n.º 1
0
        //- declarations --------------------------------------------------------

        public void makeDeclarationNode(DeclSpecNode declarspecs, DeclaratorNode declarator, InitializerNode initializer)
        {
            VarDeclNode vardecl = new VarDeclNode();

            vardecl.varType = declarspecs.baseType;
            DeclaratorNode dnode = declarator;

            while (dnode != null)
            {
                if (dnode is IdentDeclaratorNode)
                {
                    vardecl.name = ((IdentDeclaratorNode)dnode).ident;
                }
                dnode = dnode.next;
            }
            vardecl.initializer = initializer;
            symbolTable.addSymbol(vardecl.name, vardecl);

            //add decl to either global or local decl list
            if (curFunc != null)
            {
                curFunc.locals.Add(vardecl);
            }
            else
            {
                curModule.globals.Add(vardecl);
            }

            if (initializer != null && curBlock != null)
            {
                DeclarInitStatementNode dstmt = new DeclarInitStatementNode(vardecl, initializer.initExpr);
                addStmtToBlock(dstmt);
                vardecl.initializer = null;
            }
        }
Exemplo n.º 2
0
        public void merge(DeclSpecNode that)
        {
            if (baseType == null)
            {
                baseType = that.baseType;
            }

            isTypedef  |= that.isTypedef;
            isExtern   |= that.isExtern;
            isStatic   |= that.isStatic;
            isAuto     |= that.isAuto;
            isRegister |= that.isRegister;

            isShort    |= that.isShort;
            isSigned   |= that.isSigned;
            isUnsigned |= that.isUnsigned;
            if (that.isLong)
            {
                longCount++;
            }

            isConst    |= that.isConst;
            isRestrict |= that.isRestrict;
            isVolatile |= that.isVolatile;

            isInline |= that.isInline;
        }
Exemplo n.º 3
0
        public DeclSpecNode buildFunctionSpecifier(Token tok)
        {
            DeclSpecNode node = new DeclSpecNode();

            node.isInline = (tok.type == TokenType.INLINE);
            return(node);
        }
Exemplo n.º 4
0
        public DeclSpecNode buildTypeSpecifier(OILNode typeNode)
        {
            DeclSpecNode node = new DeclSpecNode();

            node.baseType = (TypeDeclNode)typeNode;
            return(node);
        }
Exemplo n.º 5
0
        public DeclSpecNode buildDeclarationSpecifiers(List <OILNode> nodeList)
        {
            DeclSpecNode dnode = new DeclSpecNode();

            foreach (OILNode node in nodeList)
            {
                DeclSpecNode node1 = (DeclSpecNode)node;
                dnode.merge(node1);
            }

            //adjust base type if necessary
            if (dnode.baseType == null)
            {
                dnode.baseType = (TypeDeclNode)symbolTable.findSymbol("int");       //default base type
            }
            if (dnode.baseType.name.Equals("char"))
            {
                if (dnode.isSigned)
                {
                    dnode.baseType = (TypeDeclNode)symbolTable.findSymbol("signed-char");
                }
                else if (dnode.isUnsigned)
                {
                    dnode.baseType = (TypeDeclNode)symbolTable.findSymbol("unsigned-char");
                }
            }
            else if (dnode.baseType.name.Equals("int"))
            {
                String tname = "int";
                if (dnode.isShort)
                {
                    tname = "short-" + tname;
                }
                else if (dnode.longCount == 1)
                {
                    tname = "long-" + tname;
                }
                else if (dnode.longCount == 2)
                {
                    tname = "long-long-" + tname;
                }
                if (dnode.isUnsigned)
                {
                    tname = "unsigned-" + tname;
                }
                dnode.baseType = (TypeDeclNode)symbolTable.findSymbol(tname);
            }
            else if (dnode.baseType.name.Equals("double"))
            {
                if (dnode.longCount == 1)
                {
                    dnode.baseType = (TypeDeclNode)symbolTable.findSymbol("long-double");
                }
            }

            return(dnode);
        }
Exemplo n.º 6
0
        public DeclSpecNode buildTypeQualifier(Token tok)
        {
            DeclSpecNode node = new DeclSpecNode();

            node.isConst    = (tok.type == TokenType.CONST);
            node.isRestrict = (tok.type == TokenType.RESTRICT);
            node.isVolatile = (tok.type == TokenType.VOLATILE);
            return(node);
        }
Exemplo n.º 7
0
        public DeclSpecNode buildStorageClassSpecifier(Token tok)
        {
            DeclSpecNode node = new DeclSpecNode();

            node.isTypedef  = (tok.type == TokenType.TYPEDEF);
            node.isExtern   = (tok.type == TokenType.EXTERN);
            node.isStatic   = (tok.type == TokenType.STATIC);
            node.isAuto     = (tok.type == TokenType.AUTO);
            node.isRegister = (tok.type == TokenType.REGISTER);
            return(node);
        }
Exemplo n.º 8
0
        public DeclSpecNode buildTypeSpecifier(Token tok)
        {
            DeclSpecNode node = new DeclSpecNode();

            switch (tok.type)
            {
            case TokenType.VOID:
                node.baseType = (TypeDeclNode)symbolTable.findSymbol("void");
                break;

            case TokenType.CHAR:
                node.baseType = (TypeDeclNode)symbolTable.findSymbol("char");
                break;

            case TokenType.INT:
                node.baseType = (TypeDeclNode)symbolTable.findSymbol("int");
                break;

            case TokenType.FLOAT:
                node.baseType = (TypeDeclNode)symbolTable.findSymbol("float");
                break;

            case TokenType.DOUBLE:
                node.baseType = (TypeDeclNode)symbolTable.findSymbol("double");
                break;

            case TokenType.SHORT:
                node.isLong = true;
                break;

            case TokenType.LONG:
                node.isLong = true;
                break;

            case TokenType.SIGNED:
                node.isSigned = true;
                break;

            case TokenType.UNSIGNED:
                node.isUnsigned = true;
                break;

            default:
                break;
            }
            return(node);
        }
Exemplo n.º 9
0
        public void makeParamDeclarNode(DeclSpecNode declarspecs, DeclaratorNode declar)
        {
            ParamDeclNode pdecl = new ParamDeclNode();

            pdecl.pType = declarspecs.baseType;
            DeclaratorNode dnode = declar;

            while (dnode != null)
            {
                if (dnode is IdentDeclaratorNode)
                {
                    pdecl.name = ((IdentDeclaratorNode)dnode).ident;
                }
                dnode = dnode.next;
            }
            symbolTable.addSymbol(pdecl.name, pdecl);
            curParamList.paramList.Add(pdecl);
        }
Exemplo n.º 10
0
        public void startFuncDef(DeclSpecNode declarspecs, DeclaratorNode declarator)
        {
            FuncDefNode func = new FuncDefNode();

            func.returnType = declarspecs.baseType;
            DeclaratorNode dnode = declarator;

            while (dnode != null)
            {
                if (dnode is IdentDeclaratorNode)
                {
                    func.name = ((IdentDeclaratorNode)dnode).ident;
                }
                if (dnode is ParamListNode)
                {
                    func.paramList = ((ParamListNode)dnode).paramList;
                }
                dnode = dnode.next;
            }
            symbolTable.addSymbol(func.name, func);     //add func def to global symbol tbl
            curModule.funcs.Add(func);                  //add func to module's func list
            curFunc = func;
            enterBlock();                               //enter function "super" block
        }
Exemplo n.º 11
0
 public TypeNameNode makeTypeNameNode(DeclSpecNode list, DeclaratorNode declar)
 {
     return(null);
 }
Exemplo n.º 12
0
 public StructDeclarationNode makeStructDeclarationNode(DeclSpecNode specqual, List <StructDeclaratorNode> fieldnames)
 {
     return(null);
 }