Пример #1
0
        /// <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;
        }
Пример #2
0
 /// <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;
     }
 }