private static string CombineInBrace(DictionaryReader reader) { var depth = 1; var result = new StringBuilder(); while (reader.Peek() != -1) { // 1行読み取ってインデントを削除 var line = reader.ReadLine().Trim(); // コメント、空白文字を処理する if (string.Compare(line, 0, "//", 0, 2) == 0 || line.Length == 0) { continue; } else if (line == "{") { ++depth; } else if (line == "}") { --depth; if (depth == 0) { break; } } result.Append(line); } if (result.Length != 0 && (result[0] == '$' || result[0] == '@')) { result.Insert(0, "{"); result.Append("}"); } return(result.ToString()); }
/// <summary> /// 指定された辞書を解析し、関数を作成します。 /// </summary> /// <param name="path">辞書のパス。</param> /// <param name="functions">関数のコレクション。</param> public void ParseDictionary(string path, Functions functions) { var dicname = Path.GetFileName(path); using (var reader = new DictionaryReader(path, encoding)) { var isCommonBody = false; Function function = null; var defines = new List <Define>(); var commonExpressions = new List <IExpression>(); while (reader.Peek() != -1) { // 1行読み取ってインデントを削除 var line = reader.ReadLine().Trim(); // コメント、空白文字を処理する if (string.Compare(line, 0, "//", 0, 2) == 0 || line.Length == 0) { continue; } // ブレスならば中をすべて連結する if (line == "{") { line = CombineInBrace(reader); if (line.Length == 0) { continue; } } // プリプロセッサを処理する if (line[0] == '#') { if (line == "#Common") { // 取得する function = null; isCommonBody = true; } else if (line == "#Define") { var define = new Define("", ""); defines.Add(define); } else if (line == "#GlobalDefine") { var define = new Define("", ""); globalDefines.Add(define); } continue; } // プリプロセッサを処理 line = ExecPreProcessor(line, defines); // モードを判別する if (line[0] == '$') { // 関数定義 function = MakeFunction(line, functions); // 辞書名を追加 function.DictionaryName = dicname; // 辞書中の行を取得 function.DictionaryLine = reader.CurrentLine; // プリプロセス式を追加する function.Expressions.AddRange(commonExpressions); } else if (function != null) { // 関数ステートメント var functionStatements = MakeStatements(line); function.Statements.Add(functionStatements); } else if (isCommonBody) { isCommonBody = false; var expressions = MakeStatements(line); commonExpressions.AddRange(expressions); } } } }