internal eRETURN Expect(char c) { eRETURN rc = eRETURN.OK; Trace.Write("Expect " + c + "\t"); TreeNode tn; if ((tn = tree.Find(depth, c)) != null) { depth++; if (tn.Last) { depth = 0; rc = eRETURN.DECODED; } } else { depth--; if (depth < 0) { depth = 0; } rc = eRETURN.ERROR; } return(rc); }
public void TestAddChildren() { Parser p = new Parser(codes); String tests = "I22dABAABACEFACDF123I22dAB"; char[] bTest = tests.ToCharArray(); for (int i = 0; i < tests.Length; i++) { eRETURN er = p.Parse(bTest[i]); if (i == 1) { Assert.AreEqual(er, eRETURN.DECODED); } Trace.WriteLine(Environment.NewLine + i + "\t" + er.ToString()); } }
public eRETURN Parse(char c) { eRETURN er = Expect(c); qChars.Enqueue(c); switch (er) { case eRETURN.DECODED: qChars.Clear(); Trace.WriteLine("Parser successfull !"); break; case eRETURN.ERROR: Trace.Write("ERROR !\t"); qChars.Dequeue(); while (qChars.Count > 0) { Trace.WriteLine("Try again!"); Parse(qChars.Dequeue()); } break; default: switch (sDecode) { case eDecode.IDLE: if (c == '%') { sDecode = eDecode.TYPE; } break; case eDecode.TYPE: type = c; sDecode = eDecode.LENGTH; break; case eDecode.LENGTH: if (!int.TryParse(c.ToString(), out length)) { sDecode = eDecode.IDLE; qChars.Clear(); Trace.WriteLine("Couldn't decode : " + c); } else { sDecode = eDecode.DECODING; index = 0; } break; case eDecode.DECODING: value[index++] = (byte)c; if (index >= length) { switch (type) { case 'd': BitConverter.ToUInt16(value, 0); break; case 'f': throw new NotImplementedException("Float"); break; default: throw new NotImplementedException("Type:" + type); break; } sDecode = eDecode.IDLE; } break; default: break; } break; } return(er); }