/// <summary> /// コマンドパラメータ名の指定ミスがあるかどうかのエラー解析 /// </summary> private void CommandParamNameLinting(CommandInfo commandInfo) { // 引数リストに存在しないパラメータがあるかどうかチェック foreach (var cmdParam in commandInfo.commandParams.GetTable()) { var linter = _linterRepository.GetLinter(commandInfo.commandName); // linterが存在していない場合はチェックをスキップ if (linter == null) { break; } bool isExists = linter.KeyList.Any(_ => _.Equals(cmdParam.Key)); if (!isExists) { // コマンドの引数リストに存在しないものが指定されているのでエラー確定 var paramStringList = new StringBuilder(); foreach (string key in linter.KeyList) { paramStringList.Append(key + ", "); } var err = new ErrorFormat( string.Format( @"{0} Specified a parameter that does not exist in the command specified: {1} {0} available parameter: {2} ", commandInfo.commandName, cmdParam.Key, paramStringList.ToString()), commandInfo.lineNumber); _errList.AddLast(err); } } }
/// <summary> /// コマンド情報の解析を行い、コマンドパラメータを生成して返す /// </summary> /// <param name="line"></param> /// <returns></returns> private CommandInfo CommandAnalysis(int lineNumber, string text) { CommandInfo commandInfo = new CommandInfo(); commandInfo.commandParams = new ParamDictionary(); var commandParamDic = commandInfo.commandParams.GetTable(); // 行番号の付加 commandInfo.lineNumber = lineNumber; // コマンド名の取得 var tag = Regex.Match(text, "@(\\S+)\\s"); // コマンド検出されなかった場合は文章としてBuilderに付加 if (!tag.Success) { if (_firstTextLineNumber == 0) { _firstTextLineNumber = lineNumber; } _textBuilder.Append(text); return(null); } // 検出したコマンドがシステムのコマンドに存在するかどうかチェック // 無いと記述ミスとしてエラー登録 var commandName = tag.Groups[1].ToString(); // Linterリストに存在していないコマンドは存在しないものとみなす if (!_linterRepository.ExistCommandName(commandName)) { var errData = new ErrorFormat("Command not found: " + commandName, lineNumber); _errList.AddLast(errData); commandInfo.commandName = commandName; return(commandInfo); } // コマンド名登録 commandInfo.commandName = commandName; // コマンドパラメータ取得 var cmdMatchRegex = new Regex("(\\S+)=(\\S+)"); var cmdMatches = cmdMatchRegex.Matches(text); foreach (Match match in cmdMatches) { var paramTag = match.Groups[1].ToString(); var paramValue = match.Groups[2].ToString(); // 同名パラメータ検出時はエラーとして登録 if (commandParamDic.ContainsKey(paramTag)) { var errData = new ErrorFormat( string.Format( "Parameter name duplicate: {0}={1}, {0}={3}", paramTag, paramValue, commandParamDic[paramTag]), lineNumber); _errList.AddLast(errData); continue; } commandParamDic.Add(paramTag, paramValue); } return(commandInfo); }