Ejemplo n.º 1
0
        private void GenerateSwitch(DfaState dfa, int errorState, SwitchMode mode)
        {
            _main.WriteLine("switch(state)");
            _main.WriteLine("{");

            dfa.ForEachNR((state) =>
            {
                _main.WriteLine("case State{0}:", state.Index);

                foreach (var nfa1 in state.AllMarks)
                {
                    if (nfa1.Mark == Marks.ResetRange)
                    {
                        var name = GetVarname(nfa1.Name, "");
                        // #1 Do NOT use SetDefaultValue, it clears bytes too -> wrong!
                        // #1 Should to create special method for this
                        // #2 Ok for IndexArray optimimized
                        _main.WriteLine("{0}." + GetSetDefauleValueCall() + ";", name);
                    }

                    if (nfa1.Mark == Marks.ResetRangeIfInvalid)
                    {
                        var name = GetVarname(nfa1.Name, "");
                        _main.WriteLine("if({0}.End <0) {0}.Begin = int.MinValue;", name);
                    }

                    if (nfa1.Mark == Marks.Custom)
                    {
                        var name = GetVarname(nfa1.Name, "");
                        _main.WriteLine(nfa1.Value.Replace("Var", name));
                    }
                }

                foreach (var nfa1 in state.NfaStates)
                {
                    if (nfa1.Mark == Marks.Count)
                    {
                        _main.WriteLine("{0}++;", GetVarname(nfa1.Name, "Count."));
                    }
                }

                foreach (var mark in state.AllMarks)
                {
                    if (mark.Mark == Marks.ContinueRange)
                    {
                        var ifv = GetCountComparation(RemoveExtraInfo(mark.Name));
                        if (ifv != "")
                        {
                            ifv += " && ";
                        }
                        _main.WriteLine("if({1}{0}.End == i-1) {0}.End = i;", GetVarname(mark.Name, ""), ifv);
                    }
                }

                foreach (var nfa1 in state.NfaStates)
                {
                    switch (nfa1.Mark)
                    {
                    case Marks.BeginRange:
                    case Marks.EndRange:
                    case Marks.EndRangeIfInvalid:

                        var varName = GetVarname(nfa1.Name, "") +
                                      ((nfa1.Mark == Marks.BeginRange) ? ".Begin" : ".End");

                        var condition = GetCountComparation(RemoveExtraInfo(nfa1.Name));
                        if (nfa1.Mark != Marks.EndRange)
                        {
                            if (condition != "")
                            {
                                condition += " && ";
                            }
                            condition = varName + " < 0";
                        }

                        if (condition != "")
                        {
                            _main.Write("if({0})", condition);
                        }

                        _main.Write("{0} = i", varName);

                        if (nfa1.Offset != 0)
                        {
                            _main.Write("{0} {1}", (nfa1.Offset > 0) ? "+" : "-", Math.Abs(nfa1.Offset));
                        }

                        _main.WriteLine(";");

                        break;


                    case Marks.BoolEx:
                        _main.WriteLine("boolExPosition = i;");
                        goto case Marks.Bool;

                    case Marks.Bool:
                        _main.WriteLine("{0} = true;", GetVarname(nfa1.Name, ""));
                        break;

                    case Marks.BoolExNot:
                        _main.WriteLine("if(boolExPosition == i-1) {0} = false;", GetVarname(nfa1.Name, ""));
                        break;


                    case Marks.Final:
                        _main.WriteLine("Final = true;");
                        break;
                    }

                    //if (nfa1.Mark == Marks.BeginRange)
                    //{
                    //    var extra = GetCountComparation(RemoveExtraInfo(nfa1.Name));
                    //    if (extra != "")
                    //        extra += " && ";
                    //    _main.Write("if({1}{0} < 0) {0} = i", GetVarname(nfa1.Name, "") + ".Begin", extra);
                    //    if (nfa1.Offset != 0)
                    //        _main.Write("{0} {1}", (nfa1.Offset > 0) ? "+" : "-", Math.Abs(nfa1.Offset));
                    //    _main.WriteLine(";");
                    //}

                    //if (nfa1.Mark == Marks.EndRange)
                    //{
                    //    var ifv = GetCountComparation(RemoveExtraInfo(nfa1.Name));
                    //    if (ifv != "")
                    //        _main.Write("if({0}) ", ifv);
                    //    _main.WriteLine("{0} = i;", GetVarname(nfa1.Name, "") + ".End");
                    //}

                    ////if (nfa1.Mark == Marks.ContinueRange)
                    ////{
                    ////    var ifv = GetCountComparation(RemoveExtraInfo(nfa1.Name));
                    ////    if (ifv != "")
                    ////        ifv += " && ";
                    ////    _main.WriteLine("if({1}{0}.End == i-1) {0}.End = i;", GetVarname(nfa1.Name, ""), ifv);
                    ////}

                    //if (nfa1.Mark == Marks.Bool)
                    //    _main.WriteLine("{0} = true;", GetVarname(nfa1.Name, ""));

                    //if (nfa1.Mark == Marks.Final)
                    //    _main.WriteLine("Final = true;");
                }

                if (mode == SwitchMode.ActionJump || mode == SwitchMode.ActionOnly)
                {
                    if (state.HasMarks)
                    {
                        foreach (var decimal1 in state.Decimals)
                        {
                            _main.WriteLine("{0} = ({0} << 1) * 5 + bytes[i - 1] - 48;", GetVarname(decimal1.Name, ""));
                        }

                        foreach (var hex1 in state.Hexes)
                        {
                            _main.WriteLine("{0} = ({0} << 4) + AsciiCodeToHex[bytes[i - 1]];", GetVarname(hex1.Name, ""));
                        }
                        //	_main.WriteLine("{0} = ({0} << 4) + GetHexDigit(bytes[i - 1]);", GetVarname(hex1.Name, ""));
                    }
                }

                if (state.Consts.Count > 0)
                {
                    foreach (var pair in state.ConstNameValues)
                    {
                        var ifv = GetCountComparation(RemoveExtraInfo(pair.Key));

                        if (ifv != "")
                        {
                            _main.Write("if(" + ifv + ") ");
                        }

                        _main.WriteLine("{0} = {1}s.{2};",
                                        AddCountPrefix(RemoveExtraInfo(pair.Key)),
                                        RemoveBrackets(VariableInfo.GetShortName(pair.Key)),
                                        pair.Value);
                    }
                }

                if (state.IsFinal)
                {
                    _main.WriteLine("goto exit1;");
                }
                else
                {
                    if (mode == SwitchMode.ActionJump || mode == SwitchMode.JumpOnly)
                    {
                        _main.WriteLine("state = table{0}[bytes[i]];", state.Index);
                    }
                    _main.WriteLine("break;");
                }
            });

            _main.WriteLine("case State{0}:", errorState);
            if (mode == SwitchMode.ActionJump || mode == SwitchMode.ActionOnly)
            {
                _main.WriteLine("i--;");
            }
            _main.WriteLine("Error = true;");
            _main.WriteLine("goto exit1;");

            _main.WriteLine("}");
        }
Ejemplo n.º 2
0
        public void AddVariable(IMark mark)
        {
            var shortname = VariableInfo.GetShortName(mark.Name);

            Dictionary <string, VariableInfo> dictionary = null;

            var mark1 = mark.Mark;

            if (mark1 == Marks.Custom)
            {
                if (mark.Type == "ByteArrayPart")
                {
                    mark1 = Marks.BeginRange;
                }
                if (mark.Type == "bool")
                {
                    mark1 = Marks.Bool;
                }
                if (mark.Type == "int")
                {
                    mark1 = Marks.Decimal;
                }
            }

            switch (mark1)
            {
            case Marks.Custom:
                if (string.IsNullOrEmpty(mark.Type) == false)
                {
                    dictionary = _customs;
                }
                break;

            case Marks.Const:
                AddEnum(mark.Name, mark.Value);
                break;

            case Marks.BeginRange:
                dictionary = _begins1;
                break;

            case Marks.EndRange:
                dictionary = _ends1;
                break;

            case Marks.Count:
                dictionary = _counts1;
                break;

            case Marks.Bool:
            case Marks.BoolEx:
                dictionary = _bools;
                break;

            case Marks.Decimal:
            case Marks.Hex:
                dictionary = _decimals1;
                break;
            }

            if (dictionary != null)
            {
                if (dictionary.ContainsKey(shortname) == false)
                {
                    dictionary.Add(shortname, new VariableInfo(mark));
                }
            }
        }