private bool IsVisible(LogicalLine line)
 {
     return(line.Visible);
 }
        internal List <LogicalLine> Analyze(TokenCollection stream, AxData data)
        {
            List <LogicalLine> ret = new List <LogicalLine>();

            subAnalyzePreprocessor(ret, data);
            readingLine = ret.Count;
            //構文解析
            while (!stream.NextIsEndOfStream)
            {
                System.Windows.Forms.Application.DoEvents();
                System.Threading.Thread.Sleep(0);
                readingLine++;
                LogicalLine line = LogicalLineFactory.GetCodeToken(stream.GetLine());
                if (line != null)
                {
                    ret.Add(line);
                }
            }

            //ゴーストの削除 foreach2とかstopの後のgoto文とか。
            //repeatなどの後に出るラベルは構文解析で削除
            for (int i = 0; i < ret.Count; i++)
            {
                if (ret[i].HasFlagIsGhost)
                {
                    ret[i].Visible = false;
                }
                if ((ret[i].HasFlagGhostGoto) && (i != (ret.Count - 1)))
                {
                    ret[i + 1].Visible = false;
                }
            }
            ret = ret.FindAll(IsVisible);
            for (int i = 0; i < ret.Count; i++)
            {
                if (!ret[i].CheckRpn())
                {
                    ret[i].AddError("式:数式の変換に失敗");
                }
            }


            //subAnalyzeScoop、subAnalyzeLabelの順でやると
            //if(value){
            // 〜〜
            //}
            //*label
            //else{
            // 〜〜
            //}
            //となった時にエラー
            //しかしながらsubAnalyzeLabel、subAnalyzeScoopの順でやると
            //if(value){
            // 〜〜
            //*label
            //}
            //return
            //となってみっともない。
            //そこでsubAnalyzeScoop、subAnalyzeLabelの順で行い、subAnalyzeLabelの際に直後がelse節で直前がScoopEndなら一つ戻す処理を入れる。

            subAnalyzeScoop(ret);
            subAnalyzeLabel(ret, data);


            //タブ整形や余分な行の削除を行う
            int tabCount = 1;

            for (int i = 0; i < ret.Count; i++)
            {
                if (ret[i].TabDecrement)
                {
                    tabCount--;
                }
                ret[i].TabCount = tabCount;
                if (ret[i].TabIncrement)
                {
                    tabCount++;
                }
            }


            for (int i = 0; i < ret.Count; i++)
            {
                if (ret[i].GetErrorMes().Count != 0)
                {
                    foreach (string errMes in ret[i].GetErrorMes())
                    {
                        global::KttK.HspDecompiler.HspConsole.Warning(errMes, i + 1);
                    }
                }
            }
            ret[ret.Count - 1].Visible = false;            //末尾に自動生成されるstop文の削除
            ret = ret.FindAll(IsVisible);
            return(ret);
        }