示例#1
0
        /// <summary>
        ///     生産中師団を構文解析する
        /// </summary>
        /// <param name="lexer">字句解析器</param>
        /// <returns>生産中師団</returns>
        private static DivisionDevelopment ParseDivisionDevelopment(TextLexer lexer)
        {
            // =
            Token token = lexer.GetToken();
            if (token.Type != TokenType.Equal)
            {
                Log.InvalidToken(LogCategory, token, lexer);
                return null;
            }

            // {
            token = lexer.GetToken();
            if (token.Type != TokenType.OpenBrace)
            {
                Log.InvalidToken(LogCategory, token, lexer);
                return null;
            }

            DivisionDevelopment division = new DivisionDevelopment();
            int lastLineNo = -1;
            while (true)
            {
                token = lexer.GetToken();

                // ファイルの終端
                if (token == null)
                {
                    break;
                }

                // } (セクション終端)
                if (token.Type == TokenType.CloseBrace)
                {
                    break;
                }

                // 無効なトークン
                if (token.Type != TokenType.Identifier)
                {
                    Log.InvalidToken(LogCategory, token, lexer);
                    lexer.SkipLine();
                    continue;
                }

                string keyword = token.Value as string;
                if (string.IsNullOrEmpty(keyword))
                {
                    continue;
                }
                keyword = keyword.ToLower();

                // id
                if (keyword.Equals("id"))
                {
                    TypeId id = ParseTypeId(lexer);
                    if (id == null)
                    {
                        Log.InvalidSection(LogCategory, "id", lexer);
                        continue;
                    }

                    // typeとidの組
                    division.Id = id;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // name
                if (keyword.Equals("name"))
                {
                    string s = ParseString(lexer);
                    if (s == null)
                    {
                        Log.InvalidClause(LogCategory, "name", lexer);
                        continue;
                    }

                    // 師団名
                    division.Name = s;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // cost
                if (keyword.Equals("cost"))
                {
                    double? d = ParseDouble(lexer);
                    if (!d.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "cost", lexer);
                        continue;
                    }

                    // 必要IC
                    division.Cost = (double) d;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // manpower
                if (keyword.Equals("manpower"))
                {
                    double? d = ParseDouble(lexer);
                    if (!d.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "manpower", lexer);
                        continue;
                    }

                    // 必要人的資源
                    division.Manpower = (double) d;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // unitcost
                if (keyword.Equals("unitcost"))
                {
                    bool? b = ParseBool(lexer);
                    if (!b.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "unitcost", lexer);
                        continue;
                    }

                    // unitcost
                    division.UnitCost = (bool) b;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // new_model
                if (keyword.Equals("new_model"))
                {
                    bool? b = ParseBool(lexer);
                    if (!b.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "unitcost", lexer);
                        continue;
                    }

                    // new_model
                    division.NewModel = (bool) b;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // date
                if (keyword.Equals("date"))
                {
                    GameDate date = ParseDate(lexer);
                    if (date == null)
                    {
                        Log.InvalidSection(LogCategory, "date", lexer);
                        continue;
                    }

                    // 完了予定日
                    division.Date = date;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // progress
                if (keyword.Equals("progress"))
                {
                    double? d = ParseDouble(lexer);
                    if (!d.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "progress", lexer);
                        continue;
                    }

                    // 進捗率増分
                    division.Progress = (double) d;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // total_progress
                if (keyword.Equals("total_progress"))
                {
                    double? d = ParseDouble(lexer);
                    if (!d.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "total_progress", lexer);
                        continue;
                    }

                    // 総進捗率
                    division.TotalProgress = (double) d;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // gearing_bonus
                if (keyword.Equals("gearing_bonus"))
                {
                    double? d = ParseDouble(lexer);
                    if (!d.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "gearing_bonus", lexer);
                        continue;
                    }

                    // 連続生産ボーナス
                    division.GearingBonus = (double) d;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // size
                if (keyword.Equals("size"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "size", lexer);
                        continue;
                    }

                    // 総生産数
                    division.Size = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // done
                if (keyword.Equals("done"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "done", lexer);
                        continue;
                    }

                    // 生産完了数
                    division.Done = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // days
                if (keyword.Equals("days"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "days", lexer);
                        continue;
                    }

                    // 完了日数
                    division.Days = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // days_for_first
                if (keyword.Equals("days_for_first"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "days_for_first", lexer);
                        continue;
                    }

                    // 1単位の完了日数
                    division.DaysForFirst = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // halted
                if (keyword.Equals("halted"))
                {
                    bool? b = ParseBool(lexer);
                    if (!b.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "halted", lexer);
                        continue;
                    }

                    // 停止中
                    division.Halted = (bool) b;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // close_when_finished
                if (keyword.Equals("close_when_finished"))
                {
                    bool? b = ParseBool(lexer);
                    if (!b.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "close_when_finished", lexer);
                        continue;
                    }

                    // 完了時にキューを削除するかどうか
                    division.CloseWhenFinished = (bool) b;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // waitingforclosure
                if (keyword.Equals("waitingforclosure"))
                {
                    bool? b = ParseBool(lexer);
                    if (!b.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "waitingforclosure", lexer);
                        continue;
                    }

                    // waitingforclosure (詳細不明)
                    division.WaitingForClosure = (bool) b;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // retooling_time
                if (keyword.Equals("retooling_time"))
                {
                    double? d = ParseDouble(lexer);
                    if (!d.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "retooling_time", lexer);
                        continue;
                    }

                    // 生産ライン準備時間
                    division.RetoolingTime = (double) d;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // type
                if (keyword.Equals("type"))
                {
                    UnitType? type = ParseDivisionType(lexer);
                    if (type == null)
                    {
                        Log.InvalidClause(LogCategory, "type", lexer);
                        continue;
                    }

                    // ユニット種類
                    division.Type = (UnitType) type;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // model
                if (keyword.Equals("model"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "model", lexer);
                        continue;
                    }

                    // モデル番号
                    division.Model = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // extra
                if (keyword.Equals("extra"))
                {
                    UnitType? type = ParseBrigadeType(lexer);
                    if (type == null)
                    {
                        Log.InvalidClause(LogCategory, "extra", lexer);
                        continue;
                    }

                    // 付属旅団のユニット種類
                    division.Extra1 = (UnitType) type;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // extra1
                if (keyword.Equals("extra1"))
                {
                    UnitType? type = ParseBrigadeType(lexer);
                    if (type == null)
                    {
                        Log.InvalidClause(LogCategory, "extra1", lexer);
                        continue;
                    }

                    // 付属旅団のユニット種類
                    division.Extra1 = (UnitType) type;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // extra2
                if (keyword.Equals("extra2"))
                {
                    UnitType? type = ParseBrigadeType(lexer);
                    if (type == null)
                    {
                        Log.InvalidClause(LogCategory, "extra2", lexer);
                        continue;
                    }

                    // 付属旅団のユニット種類
                    division.Extra2 = (UnitType) type;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // extra3
                if (keyword.Equals("extra3"))
                {
                    UnitType? type = ParseBrigadeType(lexer);
                    if (type == null)
                    {
                        Log.InvalidClause(LogCategory, "extra3", lexer);
                        continue;
                    }

                    // 付属旅団のユニット種類
                    division.Extra3 = (UnitType) type;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // extra4
                if (keyword.Equals("extra4"))
                {
                    UnitType? type = ParseBrigadeType(lexer);
                    if (type == null)
                    {
                        Log.InvalidClause(LogCategory, "extra4", lexer);
                        continue;
                    }

                    // 付属旅団のユニット種類
                    division.Extra4 = (UnitType) type;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // extra5
                if (keyword.Equals("extra5"))
                {
                    UnitType? type = ParseBrigadeType(lexer);
                    if (type == null)
                    {
                        Log.InvalidClause(LogCategory, "extra5", lexer);
                        continue;
                    }

                    // 付属旅団のユニット種類
                    division.Extra5 = (UnitType) type;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // brigade_model
                if (keyword.Equals("brigade_model"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "brigade_model", lexer);
                        continue;
                    }

                    // 付属旅団のモデル番号
                    division.BrigadeModel1 = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // brigade_model1
                if (keyword.Equals("brigade_model1"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "brigade_model1", lexer);
                        continue;
                    }

                    // 付属旅団のモデル番号
                    division.BrigadeModel1 = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // brigade_model2
                if (keyword.Equals("brigade_model2"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "brigade_model2", lexer);
                        continue;
                    }

                    // 付属旅団のモデル番号
                    division.BrigadeModel2 = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // brigade_model3
                if (keyword.Equals("brigade_model3"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "brigade_model3", lexer);
                        continue;
                    }

                    // 付属旅団のモデル番号
                    division.BrigadeModel3 = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // brigade_model4
                if (keyword.Equals("brigade_model4"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "brigade_model4", lexer);
                        continue;
                    }

                    // 付属旅団のモデル番号
                    division.BrigadeModel4 = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // brigade_model5
                if (keyword.Equals("brigade_model5"))
                {
                    int? n = ParseInt(lexer);
                    if (!n.HasValue)
                    {
                        Log.InvalidClause(LogCategory, "brigade_model5", lexer);
                        continue;
                    }

                    // 付属旅団のモデル番号
                    division.BrigadeModel5 = (int) n;

                    // 最終解釈行を覚えておく
                    lastLineNo = lexer.LineNo;
                    continue;
                }

                // 無効なトークン
                Log.InvalidToken(LogCategory, token, lexer);
                if (lexer.LineNo != lastLineNo)
                {
                    // 現在行が最終解釈行と異なる場合、閉じ括弧が不足しているものと見なす
                    lexer.ReserveToken(token);
                    break;
                }
                lexer.SkipLine();
            }

            return division;
        }
示例#2
0
 /// <summary>
 ///     生産中師団を書き出す
 /// </summary>
 /// <param name="division">師団</param>
 /// <param name="writer">ファイル書き込み用</param>
 private static void WriteDivisionDevelopment(DivisionDevelopment division, TextWriter writer)
 {
     writer.WriteLine("  division_development = {");
     writer.Write("    id             = ");
     WriteTypeId(division.Id, writer);
     writer.WriteLine();
     if (!string.IsNullOrEmpty(division.Name))
     {
         writer.WriteLine("    name           = \"{0}\"", division.Name);
     }
     writer.WriteLine("    type           = {0}", Units.Strings[(int) division.Type]);
     if (division.Model >= 0)
     {
         writer.WriteLine("    model          = {0}", division.Model);
     }
     if (division.Cost > 0)
     {
         writer.WriteLine("    cost           = {0}", DoubleHelper.ToString1(division.Cost));
     }
     if (!division.UnitCost)
     {
         writer.WriteLine("    unitcost       = no");
     }
     if (!division.NewModel)
     {
         writer.WriteLine("    new_model      = no");
     }
     if (division.Date != null)
     {
         writer.Write("    date           = ");
         WriteDate(division.Date, writer);
         writer.WriteLine();
     }
     if (division.Manpower > 0)
     {
         writer.WriteLine("    manpower       = {0}", DoubleHelper.ToString(division.Manpower));
     }
     if (Game.Type == GameType.ArsenalOfDemocracy)
     {
         if (division.Halted)
         {
             writer.WriteLine("    halted         = yes");
         }
         writer.WriteLine("    close_when_finished = {0}", BoolHelper.ToString(division.CloseWhenFinished));
         writer.WriteLine("    waitingforclosure = {0}", BoolHelper.ToString(division.WaitingForClosure));
         if (division.RetoolingTime > 0)
         {
             writer.WriteLine("    retooling_time = {0}", DoubleHelper.ToString4(division.RetoolingTime));
         }
     }
     if (division.TotalProgress > 0)
     {
         writer.WriteLine("    total_progress = {0}", DoubleHelper.ToString4(division.Progress));
     }
     if (division.Size > 0)
     {
         writer.WriteLine("    size           = {0}", division.Size);
     }
     if (division.Done > 0)
     {
         writer.WriteLine("    done           = {0}", division.Done);
     }
     if (division.Days > 0)
     {
         writer.WriteLine("    days           = {0}", division.Days);
     }
     if (division.DaysForFirst > 0)
     {
         writer.WriteLine("    days_for_first = {0}", division.DaysForFirst);
     }
     if (division.GearingBonus > 0)
     {
         writer.WriteLine("    gearing_bonus  = {0}", DoubleHelper.ToString4(division.GearingBonus));
     }
     if (division.Extra1 != UnitType.Undefined)
     {
         writer.WriteLine("    extra{0}         = {1}",
             (division.Extra2 == UnitType.Undefined) && (Units.Items[(int) division.Type].Branch != Branch.Navy)
                 ? " "
                 : "1",
             Units.Strings[(int) division.Extra1]);
     }
     if (division.Extra2 != UnitType.Undefined)
     {
         writer.WriteLine("    extra2         = {0}", Units.Strings[(int) division.Extra2]);
     }
     if (division.Extra3 != UnitType.Undefined)
     {
         writer.WriteLine("    extra3         = {0}", Units.Strings[(int) division.Extra3]);
     }
     if (division.Extra4 != UnitType.Undefined)
     {
         writer.WriteLine("    extra4         = {0}", Units.Strings[(int) division.Extra4]);
     }
     if (division.Extra5 != UnitType.Undefined)
     {
         writer.WriteLine("    extra5         = {0}", Units.Strings[(int) division.Extra5]);
     }
     if (division.Extra1 != UnitType.Undefined && division.BrigadeModel1 >= 0)
     {
         writer.WriteLine("    brigade_model{0} = {1}",
             (division.Extra2 == UnitType.Undefined) && (Units.Items[(int) division.Type].Branch != Branch.Navy)
                 ? " "
                 : "1",
             division.BrigadeModel1);
     }
     if (division.Extra2 != UnitType.Undefined && division.BrigadeModel2 >= 0)
     {
         writer.WriteLine("    brigade_model2 = {0}", division.BrigadeModel2);
     }
     if (division.Extra3 != UnitType.Undefined && division.BrigadeModel3 >= 0)
     {
         writer.WriteLine("    brigade_model3 = {0}", division.BrigadeModel3);
     }
     if (division.Extra4 != UnitType.Undefined && division.BrigadeModel4 >= 0)
     {
         writer.WriteLine("    brigade_model4 = {0}", division.BrigadeModel4);
     }
     if (division.Extra5 != UnitType.Undefined && division.BrigadeModel5 >= 0)
     {
         writer.WriteLine("    brigade_model5 = {0}", division.BrigadeModel5);
     }
     writer.WriteLine("  }");
 }