/// <summary> /// Gets Tokens from state till it's index where all "string" cases are excluded /// </summary> /// <param name="q">State to get tokens from</param> /// <returns></returns> private static List <Token> getNSCData(la.State q, int start = 0) { List <Token> ret = new List <Token>(); bool inSC = false; for (int i = start; i < q.Index; i++) { var t = q.data[i]; if (t.t == TType.cas && t.args.First()[1] != ':') { continue; } if (t.t == TType.cas && t.args.First()[2] == '"') { ret.Add(new Token(TType.cas, Enumerable.Repeat("::end", 1))); inSC = true; continue; } if (inSC && t.t == TType.cas) { inSC = false; if (t.args.First() != "::end") { ret.Add(t); } continue; } if (!inSC) { ret.Add(t); } } return(ret); }
/// <summary> /// Generates states to check for a certain string in input /// </summary> /// <param name="il">ILGenerator of main method</param> /// <param name="c">Current symbol</param> /// <param name="arg">String to check</param> private static void String(ILGenerator il, LocalBuilder c, string query) { string arg = query.Substring(1, query.Length - 2); last = la.Body.curState; last.skip = true; la.State t; for (int i = 0; i < arg.Length - 2; i++) { t = new la.State(); t.AddData(new List <Token>() { new Token(TType.cas, Enumerable.Repeat(":" + (SCC) + ":" + arg.Substring(0, i + 1), 1)) }); t.AddData(getNSCData(last)); t.AddData(new List <Token>() { new Token(TType.cas, Enumerable.Repeat("::'" + arg[i + 1] + "'", 1)), //new Token(TType.cas,Enumerable.Repeat("!entered "+ i,1)), new Token(TType.state, Enumerable.Repeat("" + (SCC) + ":" + arg.Substring(0, i + 2), 1)), new Token(TType.cas, Enumerable.Repeat("::end", 1)) }); statesToFill.Add(new Tuple <la.State, int>(t, last.Index)); } t = new la.State(); t.AddData(new List <Token>() { new Token(TType.cas, Enumerable.Repeat(":" + (SCC) + ":" + arg.Substring(0, arg.Length - 1), 1)) }); t.AddData(getNSCData(last)); t.AddData(new List <Token>() { new Token(TType.cas, Enumerable.Repeat("::'" + arg.Last() + "'", 1)) }); tempState = new Tuple <la.State, int>(t, last.Index); il.Emit(OpCodes.Ldc_I4_S, arg[0]); il.Emit(OpCodes.Ldloc, c); il.Emit(OpCodes.Ceq); ReadingSC = true; SCS = arg[0]; }