private static void LinkBarket(AnalyzeBlock root) { AnalyzeUnitBase pre = null; AnalyzeBlock cur = null; // CodeItemType pretype = CodeItemType.None; foreach (var unit in root.ResetElements()) { var block = unit as AnalyzeBlock; if (block == null) { var word = (WordUnit)unit; pre = word.IsPunctuate || word.IsKeyWord ? null : unit; root.Append(unit); //pretype = CodeItemType.None; continue; } LinkBarket(block); switch (block.ItemType) { case CodeItemType.Brackets21: //case CodeItemType.Brackets31: //if (pretype == CodeItemType.None || cur == null) { if (pre == null) { root.Append(unit); break; } if (pre != cur) { cur?.Release(); cur = new AnalyzeBlock(); var wd = pre as WordUnit; cur.Primary = wd ?? ((AnalyzeBlock)pre).Primary; root.Elements.Remove(pre); cur.Elements.Add(pre); cur.ItemRace = CodeItemRace.Value; cur.ItemFamily = CodeItemFamily.ValueSentence; cur.ItemType = CodeItemType.Brackets21 == block.ItemType ? CodeItemType.Call : CodeItemType.Table_Child; root.Elements.Add(cur); pre = cur; } unit.Name = "_call_"; cur.Elements.Add(unit); } //root.Elements.Add(block); //pretype = block.ItemType; continue; } root.Append(unit); pre = unit; } cur?.Release(); }
/// <summary> /// 加入到全局字典 /// </summary> /// <param name="word"></param> private void AddVariableToDictionary(AnalyzeUnitBase word) { if (word == null) { return; } if (word.ItemType == CodeItemType.Variable_Global || word.ItemType == CodeItemType.Variable_Local) { AddToDictionary(word); } }
private void CheckTableItem(AnalyzeBlock parent, AnalyzeUnitBase element, int idx) { string name; switch (element.ItemType) { case CodeItemType.Brackets31: name = element.Name ?? element.Word; element.ValueType = LuaDataTypeItem.Nil; break; case CodeItemType.Separator_Equal: var block = (AnalyzeBlock)element; if (block.Elements.Count <= 1) { name = $"[{idx}]"; element.ValueType = LuaDataTypeItem.Nil; } else { var ne = block.Elements[0]; name = ne.Name ?? ne.Word; if (ne.ItemType != CodeItemType.Brackets31) { name = $"['{name}']"; } if (block.Elements.Count > 2) { block.ValueType = ne.ValueType = block.Elements[2].ValueType; } else { ne.ValueType = LuaDataTypeItem.Nil; } } break; default: name = $"[{idx}]"; if (element.ValueType == null) { element.ValueType = LuaDataTypeItem.Nil; } break; } if (element.ValueType == null) { element.ValueType = LuaDataTypeItem.Nil; } _vers.Add($"{parent.Name}{name}", element.ValueType); }
/// <summary> /// 类型对等设置 /// </summary> /// <param name="def"></param> /// <param name="value"></param> private void SetVarDataType(WordUnit def, AnalyzeUnitBase value) { if (def == null) { return; } if (def.Name == null) { def.Name = def.Word; } if (!_vers.ContainsKey(def.Name)) { _vers.Add(def.Name, AnalyzeValueBlock(value)); } else if (_vers[def.Name] == LuaDataTypeItem.Confirm) { _vers[def.Name] = AnalyzeValueBlock(value); } }
/// <summary> /// 加入到全局字典 /// </summary> /// <param name="unit"></param> private void AddToDictionary(AnalyzeUnitBase unit) { if (unit == null || unit.ItemType == CodeItemType.Separator_Comma) { return; } var name = unit.Name ?? unit.Word; if (unit is AnalyzeBlock)//BUG { switch (unit.ItemType) { case CodeItemType.Separator_Dot: case CodeItemType.Separator_Colon: break; default: return; //其它是不适合的情况 } } if (!_vers.ContainsKey(name)) { if (unit.ValueType == null) { unit.ValueType = LuaDataTypeItem.Nil; } _vers.Add(name, unit.ValueType); return; } var type = _vers[name]; if (type == LuaDataTypeItem.Nil || type == LuaDataTypeItem.Confirm) { _vers[name] = unit.ValueType; } else if (unit.ValueType == null || unit.ValueType == LuaDataTypeItem.Nil) { unit.ValueType = type; } }
/// <summary> /// 分级组合 /// 0 括号块组合(不使用此方法) /// 1 .;单词粘连组合 /// 2 一元操作符组合(not # -) /// 3 串联组合(.. ^) /// 4 乘除余指数(* / %) /// 5 加减(+ -) /// 6 比较(== ~大小于) /// 7 逻辑(and) /// 8 逻辑(or) /// 9 赋值(=) /// </summary> /// <param name="root"></param> /// <param name="level"></param> /// <returns></returns> public void MergeSimpleBlock(AnalyzeBlock root, int level) { AnalyzeUnitBase preUnit = null; var joinNext = false; var array = root.Elements.ToArray(); root.Elements.Clear(); foreach (var unit in array) { if (unit.IsEmpty) { continue; } if (unit.IsContent) { root.Append(unit); joinNext = false; preUnit = null; continue; } var block = unit as AnalyzeBlock; if (block != null) { if (!unit.IsLock && !unit.IsUnit) { MergeSimpleBlock(block, level); } if (!joinNext) { root.Append(block); preUnit = block; } else { ((AnalyzeBlock)preUnit).Append(block); joinNext = false; } continue; } var word = (WordUnit)unit; if (word.JoinLevel == level) { switch (word.JoinFeature) { case JoinFeature.Front: var newBlock = new AnalyzeBlock { Primary = word }; root.Append(newBlock); newBlock.Append(unit); preUnit = newBlock; joinNext = true; continue; case JoinFeature.TowWay: newBlock = new AnalyzeBlock { Primary = word }; if (preUnit == null) { newBlock.IsError = true; } else { root.Elements.Remove(preUnit); newBlock.Append(preUnit); } root.Append(newBlock); newBlock.Append(unit); preUnit = newBlock; joinNext = true; continue; } } if (!joinNext) { root.Append(word); if (!word.IsSpace && unit.ItemRace != CodeItemRace.Assist) { preUnit = level <= 6 && unit.ItemRace == CodeItemRace.Range ? null : word; } continue; } if (word.Char == ';')//终止符号出错 { ((AnalyzeBlock)preUnit).IsError = true; joinNext = false; preUnit = null; continue; } ((AnalyzeBlock)preUnit).Append(unit); if (word.IsSpace || unit.ItemRace == CodeItemRace.Assist) { continue; } if (level < 6) { preUnit.IsError = unit.ItemRace == CodeItemRace.Range; } joinNext = false; } }
/// <summary> /// 串联 /// </summary> /// <param name="root"></param> /// <param name="level"></param> /// <returns></returns> public void ConnectBlock(AnalyzeBlock root, int level) { AnalyzeUnitBase pre = null; var step = 0; AnalyzeBlock cur = root; foreach (var unit in root.ResetElements()) { if (unit.IsEmpty) { continue; } var block = unit as AnalyzeBlock; if (block != null) { if (!unit.IsLock && !unit.IsUnit) { ConnectBlock(block, level); } pre = block; } else { if (unit.JoinLevel == level && unit.JoinFeature == JoinFeature.Connect) { if (step == 0) { cur = new AnalyzeBlock { Primary = (WordUnit)unit }; if (pre != null) { cur.Append(pre); root.Elements.RemoveAt(root.Elements.Count - 1); } else { cur.IsError = true; } root.Append(cur); } step = 1; cur.Append(unit); continue; } pre = ((WordUnit)unit).IsPunctuate || ((WordUnit)unit).IsKeyWord ? null : unit; } switch (step) { case 0: root.Append(unit); break; case 1: step = 2; cur.Append(unit); break; default: step = 0; root.Append(unit); break; } } }
/// <summary> /// 分析值块的数据类型 /// </summary> /// <param name="value"></param> /// <returns></returns> private LuaDataTypeItem AnalyzeValueBlock(AnalyzeUnitBase value) { if (value == null) { return(LuaDataTypeItem.Confirm); } var name = value.Name ?? value.Word; if (name == null) { return(LuaDataTypeItem.Nil); } if (value.ValueType != null) { return(value.ValueType); } if (_vers.ContainsKey(name)) { return(_vers[name]); //已有 } var word = value as WordUnit; if (word != null) { return(null); } var block = (AnalyzeBlock)value; switch (block.ItemFamily) { case CodeItemFamily.Compare: return(LuaDataTypeItem.BoolValue); case CodeItemFamily.Compute: return(LuaDataTypeItem.NumberValue); case CodeItemFamily.Logical: return(AnalyzeValueBlock(block.Elements[0])); } switch (block.ItemType) { case CodeItemType.Number: return(LuaDataTypeItem.NumberValue); case CodeItemType.String: return(LuaDataTypeItem.StringValue); case CodeItemType.Separator_StringJoin: return(LuaDataTypeItem.StringValue); case CodeItemType.StringLen: return(LuaDataTypeItem.NumberValue); case CodeItemType.LogicalSentence: return(AnalyzeValueBlock(block.Elements[0])); case CodeItemType.Brackets41: return(LuaDataTypeItem.TableDefinition); case CodeItemType.Call: if (block.Elements[0].ItemType != CodeItemType.Brackets21) { if (_vers.ContainsKey(block.Elements[0].Word)) { return(_vers[block.Elements[0].Word]); //已有 } block.Elements[0].ValueType = LuaDataTypeItem.FunctionConfirm; return(new LuaDataTypeItem { Name = block.Elements[0].Word, ItemType = LuaDataType.Confirm, ValueType = LuaDataType.Function }); } return(null); case CodeItemType.Table_Child: return(new LuaDataTypeItem { Name = block.Elements[0].Word, ItemType = LuaDataType.Confirm, ValueType = LuaDataType.Error }); } return(LuaDataTypeItem.Error); //无法处理的 }
/// <summary> /// 赋值语句从右到左 /// </summary> /// <param name="variable"></param> /// <param name="value"></param> private void SetVarDataType(AnalyzeUnitBase variable, AnalyzeUnitBase value) { if (variable.Name == null) { variable.Name = variable.Word; } var varBlock = variable as AnalyzeBlock; if (variable.ItemType != CodeItemType.Separator_Comma) { if (value?.ValueType != null) { variable.ValueType = value.ValueType.ValueType == LuaDataType.Mulit ? value.ValueType.Childs[0] : value.ValueType; } AddToDictionary(variable); return; } if (varBlock == null) { return; } if (value == null) { foreach (var element in varBlock.Elements) { if (element.ItemType == CodeItemType.Separator_Comma) { continue; } AddToDictionary(element); } return; } var valueBlock = value as AnalyzeBlock; if (valueBlock == null || valueBlock.ValueType.ValueType != LuaDataType.Mulit) { varBlock.Elements[0].ValueType = value.ValueType; for (var index = 1; index < varBlock.Elements.Count; index++) { if (varBlock.Elements[index].ItemType == CodeItemType.Separator_Comma) { continue; } AddToDictionary(varBlock.Elements[index]); } return; } int idx = 0; foreach (var element in varBlock.Elements) { if (element.ItemType == CodeItemType.Separator_Comma) { continue; } if (idx < valueBlock.ValueType.Childs.Count) { element.ValueType = valueBlock.ValueType.Childs[idx++]; } AddToDictionary(element); } }