/// <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; }