Exemplo n.º 1
0
        /// <summary>
        ///     minister_personalitiesセクションを構文解析する
        /// </summary>
        /// <param name="lexer">字句解析器</param>
        /// <returns>閣僚特性リスト</returns>
        private static List <MinisterPersonalityInfo> ParseMinisterPersonalities(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);
            }

            List <MinisterPersonalityInfo> list = new List <MinisterPersonalityInfo>();

            while (true)
            {
                // ファイル終端
                token = lexer.GetToken();
                if (token == null)
                {
                    break;
                }

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

                // 無効なトークン
                if (token.Type != TokenType.Identifier || !((string)token.Value).Equals("personality"))
                {
                    Log.InvalidToken(LogCategory, token, lexer);
                    continue;
                }

                // personalityセクション
                MinisterPersonalityInfo info = ParseMinisterPersonality(lexer);
                if (info == null)
                {
                    Log.InvalidSection(LogCategory, "personality", lexer);
                    continue;
                }

                // 閣僚特性リストへ登録
                list.Add(info);
            }

            return(list);
        }
Exemplo n.º 2
0
        /// <summary>
        ///     閣僚特性定義ファイルを構文解析する
        /// </summary>
        /// <param name="fileName">ファイル名</param>
        /// <returns>閣僚特性リスト</returns>
        public static List <MinisterPersonalityInfo> Parse(string fileName)
        {
            List <MinisterPersonalityInfo> list = new List <MinisterPersonalityInfo>();

            using (TextLexer lexer = new TextLexer(fileName, true))
            {
                while (true)
                {
                    Token token = lexer.GetToken();

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

                    // 無効なトークン
                    if (token.Type != TokenType.Identifier || !((string)token.Value).Equals("minister"))
                    {
                        Log.InvalidToken(LogCategory, token, lexer);
                        continue;
                    }

                    // ministerセクション
                    MinisterPersonalityInfo info = ParseMinister(lexer);
                    if (info == null)
                    {
                        Log.InvalidSection(LogCategory, "minister", lexer);
                    }

                    // 閣僚特性リストへ登録
                    list.Add(info);
                }

                return(list);
            }
        }
        /// <summary>
        ///     ministerセクションを構文解析する
        /// </summary>
        /// <param name="lexer">字句解析器</param>
        /// <returns>閣僚特性データ</returns>
        private static MinisterPersonalityInfo ParseMinister(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;
            }

            MinisterPersonalityInfo info = new MinisterPersonalityInfo();
            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);
                    return null;
                }

                string keyword = token.Value as string;
                if (keyword == null)
                {
                    return null;
                }

                // trait
                if (keyword.Equals("trait"))
                {
                    // =
                    token = lexer.GetToken();
                    if (token.Type != TokenType.Equal)
                    {
                        Log.InvalidToken(LogCategory, token, lexer);
                        lexer.SkipLine();
                        continue;
                    }

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

                    // 閣僚特性文字列
                    info.String = token.Value as string;
                    continue;
                }

                // id
                if (keyword.Equals("id"))
                {
                    // 暫定: 1行単位で読み飛ばす
                    lexer.SkipLine();
                    continue;
                }

                // name
                if (keyword.Equals("name"))
                {
                    // =
                    token = lexer.GetToken();
                    if (token.Type != TokenType.Equal)
                    {
                        Log.InvalidToken(LogCategory, token, lexer);
                        lexer.SkipLine();
                        continue;
                    }

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

                    // 閣僚特性名
                    info.Name = token.Value as string;
                    continue;
                }

                // desc
                if (keyword.Equals("desc"))
                {
                    // 暫定: 1行単位で読み飛ばす
                    lexer.SkipLine();
                    continue;
                }

                // position
                if (keyword.Equals("position"))
                {
                    // =
                    token = lexer.GetToken();
                    if (token.Type != TokenType.Equal)
                    {
                        Log.InvalidToken(LogCategory, token, lexer);
                        lexer.SkipLine();
                        continue;
                    }

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

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

                    // 閣僚地位
                    if (PositionMap.ContainsKey(position))
                    {
                        // いずれか1つ
                        info.Position[PositionMap[position]] = true;
                    }
                    else if (position.Equals("all"))
                    {
                        // 全て
                        for (int i = 0; i < info.Position.Length; i++)
                        {
                            info.Position[i] = true;
                        }
                    }
                    else if (!position.Equals("generic"))
                    {
                        // 無効なトークン
                        Log.InvalidToken(LogCategory, token, lexer);
                        lexer.SkipLine();
                    }
                    continue;
                }

                // value
                if (keyword.Equals("value"))
                {
                    // 暫定: 1行単位で読み飛ばす
                    lexer.SkipLine();
                    continue;
                }

                // command
                if (keyword.Equals("command"))
                {
                    // 暫定: 1行単位で読み飛ばす
                    lexer.SkipLine();
                    //continue;
                }
            }

            return info;
        }
Exemplo n.º 4
0
        /// <summary>
        ///     閣僚特性を初期化する(HoI2)
        /// </summary>
        private static void InitPeronalityHoI2()
        {
            int positionCount = Enum.GetValues(typeof (MinisterPosition)).Length;
            int personalityCount = Enum.GetValues(typeof (MinisterPersonalityHoI2)).Length;

            // 閣僚特性情報を初期化する
            Personalities = new MinisterPersonalityInfo[personalityCount];
            PersonalityStringMap.Clear();
            for (int i = 0; i < personalityCount; i++)
            {
                MinisterPersonalityInfo info = new MinisterPersonalityInfo
                {
                    String = PersonalityStringsHoI2[i],
                    Name = PersonalityNamesHoI2[i]
                };
                Personalities[i] = info;
                PersonalityStringMap.Add(info.String.ToLower(), i);
            }

            // 閣僚地位と閣僚特性の対応付けを初期化する
            for (int i = 0; i < positionCount; i++)
            {
                // MinisterPosition.Noneに対しては何もしない
                if (PositionPersonalityTableHoI2[i] == null)
                {
                    continue;
                }

                PositionPersonalityTable[i] = PositionPersonalityTableHoI2[i].ToList();
                foreach (int j in PositionPersonalityTable[i])
                {
                    Personalities[j].Position[i] = true;
                }
            }
        }
Exemplo n.º 5
0
        /// <summary>
        ///     personalityセクションを構文解析する
        /// </summary>
        /// <param name="lexer">字句解析器</param>
        /// <returns>閣僚特性データ</returns>
        private static MinisterPersonalityInfo ParseMinisterPersonality(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);
            }

            MinisterPersonalityInfo info = new MinisterPersonalityInfo();

            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);
                    return(null);
                }

                string keyword = token.Value as string;
                if (keyword == null)
                {
                    return(null);
                }

                // personality_string
                if (keyword.Equals("personality_string"))
                {
                    // =
                    token = lexer.GetToken();
                    if (token.Type != TokenType.Equal)
                    {
                        Log.InvalidToken(LogCategory, token, lexer);
                        lexer.SkipLine();
                        continue;
                    }

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

                    // 閣僚特性文字列
                    info.String = token.Value as string;
                    continue;
                }

                // name
                if (keyword.Equals("name"))
                {
                    // =
                    token = lexer.GetToken();
                    if (token.Type != TokenType.Equal)
                    {
                        Log.InvalidToken(LogCategory, token, lexer);
                        lexer.SkipLine();
                        continue;
                    }

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

                    // 閣僚特性名
                    info.Name = token.Value as string;
                    continue;
                }

                // desc
                if (keyword.Equals("desc"))
                {
                    // 暫定: 1行単位で読み飛ばす
                    lexer.SkipLine();
                    continue;
                }

                // minister_position
                if (keyword.Equals("minister_position"))
                {
                    // =
                    token = lexer.GetToken();
                    if (token.Type != TokenType.Equal)
                    {
                        Log.InvalidToken(LogCategory, token, lexer);
                        lexer.SkipLine();
                        continue;
                    }

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

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

                    // 閣僚地位
                    if (PositionMap.ContainsKey(position))
                    {
                        // いずれか1つ
                        info.Position[PositionMap[position]] = true;
                    }
                    else if (position.Equals("all"))
                    {
                        // 全て
                        for (int i = 0; i < info.Position.Length; i++)
                        {
                            info.Position[i] = true;
                        }
                    }
                    else if (Game.Type != GameType.DarkestHour || !position.Equals("generic"))
                    {
                        // 無効なトークン
                        Log.InvalidToken(LogCategory, token, lexer);
                        lexer.SkipLine();
                    }
                    continue;
                }

                // modifier
                if (keyword.Equals("modifier"))
                {
                    if (!ParseMinisterPersonalityModifier(lexer))
                    {
                        Log.InvalidSection(LogCategory, "modifier", lexer);
                    }
                    continue;
                }

                // 無効なトークン
                Log.InvalidToken(LogCategory, token, lexer);
            }

            return(info);
        }