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); }