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("}"); }
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)); } } }