//- 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; } }
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; }
public DeclSpecNode buildFunctionSpecifier(Token tok) { DeclSpecNode node = new DeclSpecNode(); node.isInline = (tok.type == TokenType.INLINE); return(node); }
public DeclSpecNode buildTypeSpecifier(OILNode typeNode) { DeclSpecNode node = new DeclSpecNode(); node.baseType = (TypeDeclNode)typeNode; return(node); }
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); }
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); }
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); }
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); }
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); }
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 }
public TypeNameNode makeTypeNameNode(DeclSpecNode list, DeclaratorNode declar) { return(null); }
public StructDeclarationNode makeStructDeclarationNode(DeclSpecNode specqual, List <StructDeclaratorNode> fieldnames) { return(null); }