Exemple #1
0
        /// <summary>
        ///     分析方法调用块(在子级连接中)
        /// </summary>
        /// <param name="block"></param>
        /// <param name="type"></param>
        private bool AnalyzeCallBlock(AnalyzeBlock block, out LuaDataTypeItem type)
        {
            var error = false;
            var i     = 0;

            if (_vers.TryGetValue(block.Elements[i].Word, out type))
            {
                block.Elements[0].ValueType = type;
                block.Elements[1].ValueType = type;
                i = 2;
            }
            else
            {
                type          = LuaDataTypeItem.Error;
                block.IsError = error = true;
                i             = 1;
            }
            for (; i < block.Elements.Count; i++)
            {
                if (error)
                {
                    block.Elements[i].IsError = true;
                    continue;
                }

                LuaDataTypeItem chtype;
                if (type.ValueType == LuaDataType.Function && _vers.TryGetValue(type.Name, out chtype))
                {
                    block.Elements[i].ValueType = type;
                    type = chtype;
                }
                else
                {
                    block.Elements[i].IsError = error = true;
                }
            }
            block.IsError   = error;
            block.ValueType = type;
            return(!error);
        }
        /// <summary>
        ///     分析值块的数据类型
        /// </summary>
        /// <param name="parent"></param>
        /// <returns></returns>
        private void AnalyzeTableChildValue(AnalyzeBlock parent)
        {
            string          name    = null;
            LuaDataTypeItem type    = null;
            var             preCall = false;

            foreach (var item in parent.Elements)
            {
                switch (item.ItemType)
                {
                case CodeItemType.Separator_Dot:
                case CodeItemType.Separator_Colon:
                    continue;
                }
                if (name == null)
                {
                    name = item.Name ?? item.Word;
                    if (item.ValueType != null && item.ValueType != LuaDataTypeItem.Nil)
                    {
                        type = item.ValueType;
                        continue;
                    }
                }
                else
                {
                    switch (item.ItemType)
                    {
                    case CodeItemType.CallArgument:
                        if (!preCall)
                        {
                            preCall       = true;
                            type.ItemType = LuaDataType.Function;
                            continue;
                        }
                        name = type.Type;
                        break;

                    case CodeItemType.Brackets31:
                        if (item.ValueType != null && item.ValueType != LuaDataTypeItem.Nil)
                        {
                            type = item.ValueType;
                            continue;
                        }
                        preCall = false;
                        name    = $"{type.Type}{item.Word}";
                        break;

                    default:
                        if (item.ValueType != null && item.ValueType != LuaDataTypeItem.Nil)
                        {
                            type = item.ValueType;
                            continue;
                        }
                        preCall = false;
                        name    = $"{type.Type}['{item.Name ?? item.Word}']";
                        break;
                    }
                }
                if (_vers.TryGetValue(name, out type) && type != null)
                {
                    item.ValueType = type;
                    name           = type.Type;
                }
                else
                {
                    break;
                }
            }
            parent.ValueType = type ?? LuaDataTypeItem.Nil;
        }