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