/// <summary> /// 無効トークンエラーをログ出力する /// </summary> /// <param name="categoryName">カテゴリ名</param> /// <param name="token">トークン</param> /// <param name="lexer">字句解析器</param> public static void InvalidToken(string categoryName, Token token, TextLexer lexer) { Warning("[{0}] Invalid token: {1} ({2} L{3})", categoryName, ObjectHelper.ToString(token.Value), lexer.FileName, lexer.LineNo); }
/// <summary> /// 先頭のトークンを解析し、読み込みポインタを移動する /// </summary> /// <returns></returns> private Token Read() { // 既に解析済みのトークンがあれば返す if (_token != null) { Token result = _token; _token = null; return result; } return Parse(); }
/// <summary> /// トークンを保留する /// </summary> /// <param name="token"></param> public void ReserveToken(Token token) { _token = token; }
/// <summary> /// 先頭のトークンを解析し、読み込みポインタを移動しない /// </summary> /// <returns></returns> private Token Peek() { // 既に解析済みのトークンがあれば返す if (_token != null) { return _token; } _token = Parse(); return _token; }
/// <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); }