Пример #1
0
 public void AddStruct(SymStruct val)
 {
     RegisterSymbol(val.tokenId, val);
     Structs.Add(val);
     Domains.Add(val);
     domainTypes.Add(val.tokenId);
 }
Пример #2
0
 public void AddStruct(SymStruct val)
 {
     if (CheckSymbol(val))
     {
         TypeContainer.RegisterType(val);
         _curDomain.AddStruct(val);
     }
 }
Пример #3
0
        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();
        }
Пример #4
0
        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;                     //结构体对齐
        }
Пример #5
0
        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);
        }
Пример #6
0
 public SymStruct RegisterType(SymStruct type)
 {
     type.typeId = _curTypeId;
     _allTypes.Add(type);
     return(type);
 }
Пример #7
0
 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);
     }
 }