internal static int[][] EmitLexer(bool optimize, params Ast[] expressions)
        {
            var parts = new KeyValuePair <int, int[][]> [expressions.Length];

            for (var i = 0; i < expressions.Length; ++i)
            {
                var l  = new List <int[]>();
                FA  fa = null;
                if (optimize)
                {
                    try
                    {
                        fa = FA.FromAst(expressions[i]);
                    }
                    // we can't do lazy expressions
                    catch (NotSupportedException) { }
                }
                //fa = null;// for testing
                if (null != fa)
                {
                    EmitPart(fa, l);
                }
                else
                {
                    EmitPart(expressions[i], l);
                }
                parts[i] = new KeyValuePair <int, int[][]>(i, l.ToArray());
            }
            var result = EmitLexer(parts);

            if (optimize)
            {
                result = _RemoveDeadCode(result);
            }
            return(result);
        }