/// <summary> /// トリガーのコンテナを構文解析する /// </summary> /// <param name="lexer"></param> /// <returns></returns> private static List<Trigger> ParseContainerTrigger(TextLexer lexer) { List<Trigger> list = new List<Trigger>(); int lastLineNo = lexer.LineNo; while (true) { Token token = lexer.GetToken(); // ファイルの終端 if (token == null) { break; } // } (セクション終端) if (token.Type == TokenType.CloseBrace) { break; } // 無効なトークン if (token.Type != TokenType.Identifier) { Log.InvalidToken(LogCategory, token, lexer); if (lexer.LineNo != lastLineNo) { // 現在行が最終解釈行と異なる場合、閉じ括弧が不足しているものと見なす lexer.ReserveToken(token); break; } continue; } string keyword = token.Value as string; if (string.IsNullOrEmpty(keyword)) { continue; } keyword = keyword.ToLower(); // 無効なキーワード if (!TypeMap.ContainsKey(keyword)) { Log.InvalidToken(LogCategory, token, lexer); if (lexer.LineNo != lastLineNo) { // 現在行が最終解釈行と異なる場合、閉じ括弧が不足しているものと見なす lexer.ReserveToken(token); break; } continue; } Trigger trigger = new Trigger { Type = TypeMap[keyword] }; // = token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); continue; } token = lexer.GetToken(); if (token.Type == TokenType.OpenBrace) { List<Trigger> triggers = ParseContainerTrigger(lexer); if (triggers == null) { continue; } trigger.Value = triggers; list.Add(trigger); // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } if (token.Type != TokenType.Number && token.Type != TokenType.Identifier && token.Type != TokenType.String) { Log.InvalidToken(LogCategory, token, lexer); if (lexer.LineNo != lastLineNo) { // 現在行が最終解釈行と異なる場合、閉じ括弧が不足しているものと見なす lexer.ReserveToken(token); break; } continue; } trigger.Value = token.Value; list.Add(trigger); // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; } return list.Count > 0 ? list : null; }
/// <summary> /// コピーコンストラクタ /// </summary> /// <param name="original">コピー元のトリガー</param> public Trigger(Trigger original) { Type = original.Type; if (ParamTypeTable[(int) Type] == TriggerParamType.Container) { Value = new List<Trigger>(); foreach (Trigger trigger in (List<Trigger>) original.Value) { ((List<Trigger>) Value).Add(new Trigger(trigger)); } } else { Value = original.Value; } }