Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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];
        }