public void AddStruct(SymStruct val) { RegisterSymbol(val.tokenId, val); Structs.Add(val); Domains.Add(val); domainTypes.Add(val.tokenId); }
public void AddStruct(SymStruct val) { if (CheckSymbol(val)) { TypeContainer.RegisterType(val); _curDomain.AddStruct(val); } }
void struct_specifier() { GetToken(); var tokenId = CurTokenId; SyntaxState = SNTX_DELAY; // 新取单词不即时输出,延迟到取出单词后根据单词类型判断输出格式 GetToken(); if (CurTokenId == TK_BEGIN) // 适用于结构体定义 { SyntaxState = SNTX_LF_HT; } else if (CurTokenId == TK_CLOSEPA) // 适用于 sizeof(struct struct_name) { SyntaxState = SNTX_NUL; } else // 适用于结构变量声明 { SyntaxState = SNTX_SP; } SyntaxIndent(); if (tokenId < TK_IDENT) // 关键字不能作为结构名称 { Error(ETipsType.ExpectStruct); } var sym = FindStruct(tokenId); if (sym == null) { // -1表示结构体未定义 sym = new SymStruct(); sym.__name = GetTokenName(tokenId); sym.align = 0; sym.tokenId = tokenId; AddStruct(sym); } PushDomain(sym); CurBuildInTypeId = T_STRUCT; CurSymbol = sym; if (CurTokenId == TK_BEGIN) { struct_declaration_list(sym); } PopDomain(); }
void struct_declaration_list(SymStruct curStruct) { SyntaxState = SNTX_LF_HT; // 第一个结构体成员与'{'不写在一行 SyntaxLevel++; // 结构体成员变量声明,缩进增加一级 GetToken(); int maxalign = 1; int offset = 0; while (CurTokenId != TK_END) { struct_declaration(ref maxalign, ref offset, curStruct); } SkipToken(TK_END); SyntaxState = SNTX_LF_HT; curStruct.memSize = calc_align(offset, maxalign); //结构体大小 curStruct.align = maxalign; //结构体对齐 }
void struct_declaration(ref int maxalign, ref int offset, SymStruct curStruct) { var rawTokenId = CurTokenId; type_specifier(); while (true) { int force_align = 0; int align = 0; int tokenId = 0; var symVar = declarator(ref tokenId, ref force_align) as SymVar; var size = type_size(ref align); if ((force_align & ALIGN_SET) != 0) { align = force_align & ~ALIGN_SET; } offset = calc_align(offset, align); if (align > maxalign) { maxalign = align; } symVar.offset = offset; symVar.tokenId = tokenId; symVar.Type = FindStruct(rawTokenId); symVar.__name = GetTokenName(tokenId); curStruct.AddVariable(symVar); offset += size; if (CurTokenId == TK_SEMICOLON || CurTokenId == TK_EOF) { break; } SkipToken(TK_COMMA); } SyntaxState = SNTX_LF_HT; SkipToken(TK_SEMICOLON); }
public SymStruct RegisterType(SymStruct type) { type.typeId = _curTypeId; _allTypes.Add(type); return(type); }
public TypeRegister(SymDomain globalDomain) { TypeStruct = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.TK_SYMSTRUCT, __name = "Struct", }); TypeVar = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.TK_SYMVAR, __name = "Variable", }); TypeFunction = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.TK_SYMDOMAIN, __name = "Function", }); TypeDomain = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.TK_SYMFUNCTION, __name = "Domain ", }); TypeBool = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_BOOL, __name = "Bool", }); TypeFloat = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_CHAR, __name = "Float", }); TypeChar = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_FLOAT, __name = "Char", }); TypeString = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_STRING, __name = "String", }); TypeInt8 = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_INT8, __name = "Int8", }); TypeInt16 = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_INT16, __name = "Int16", }); TypeInt32 = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_INT32, __name = "Int32", }); TypeInt64 = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_INT64, __name = "Int64", }); TypeUInt8 = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_UINT8, __name = "UInt8", }); TypeUInt16 = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_UINT16, __name = "UInt16", }); TypeUInt32 = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_UINT32, __name = "UInt32", }); TypeUInt64 = RegisterType(new SymStruct() { Type = TypeStruct, tokenId = Define.KW_UINT64, __name = "UInt64", }); TypeStruct.Type = TypeStruct; foreach (var type in _allTypes) { globalDomain.AddStruct(type); } }