Example #1
0
        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);
        }
Example #4
0
 /// <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;
            }
        }
Example #6
0
        /// <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;
            }
        }
Example #7
0
        /// <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;
                }
            }
        }
Example #8
0
        /// <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);
            }
        }