Example #1
0
        /// <summary>
        /// 評価用メソッド.
        /// </summary>
        /// <param name="context">コンテキストオブジェクト.</param>
        public override void Interpret(EBNFContext context)
        {
            DebugLog(": ExceptionExpression.Interpret()");

            // 戻り値の準備
            StringBuilder       pattern = new StringBuilder();
            GeneratedExpression exp     = ExpressionFactory.CreateException();

            // 最初のトークンをチェック
            Token <TokenType> token = context.Current;

            CheckTokenExists(token);
            CheckFirstToken(token);
            pattern.Append(token.Text);

            // 2 番目のトークンをチェック
            token = context.Next();
            CheckTokenExists(token);
            DebugLog(": ExceptionExpression: (" + token.Type + ")");

            switch (token.Type)
            {
            case TokenType.String:
                exp.AddExpression(
                    ParseTerminal(context)
                    );
                pattern.Append(token.Text);
                token = context.Next();
                break;

            default:
                ThrowParseException(ErrorMessages.UnexpectedToken, token);
                break;
            }

            CheckTokenExists(token);
            if (token.IsLast)
            {
                //ThrowParseException(ErrorMessages.UnexpectedToken, token);
            }

            // 戻り値
            exp.Name = pattern.ToString();
            context.PushExpression(exp);
            //GeneratedExpression.Name = pattern;
        }
Example #2
0
        /// <summary>
        /// 評価用メソッド.
        /// </summary>
        /// <param name="context">コンテキストオブジェクト.</param>
        public override void Interpret(EBNFContext context)
        {
            DebugLog(": EBNFExpression.Interpret()");

            // 戻り値の準備
            GeneratedExpression root = ExpressionFactory.CreateRoot();

            // フィールドの繰り返し
            while (context.Current != null)
            {
                GeneratedExpression exp = ParseField(context);

                // 名前が付いていない場合はエラー
                if (exp.Name == string.Empty)
                {
                    ThrowParseException(
                        ErrorMessages.NameNotFound, context.Current
                        );
                }

                // リストに追加する
                root.AddExpression(exp);
                context.Fields.Add(exp.Name, exp);
            }

            // 終端に文字が残っている場合
            if (context.Next() != null)
            {
                ThrowParseException(
                    ErrorMessages.UnexpectedToken, context.Current
                    );
            }

            // 戻り値
            context.Root = root;
        }
Example #3
0
        /// <summary>
        /// 評価用メソッド.
        /// </summary>
        /// <param name="context">コンテキストオブジェクト.</param>
        public override void Interpret(EBNFContext context)
        {
            DebugLog(": OptionExpression.Interpret()");

            // 戻り値の準備
            StringBuilder       pattern = new StringBuilder();
            GeneratedExpression exp     = ExpressionFactory.CreateOption();

            // 最初のトークンをチェック
            Token <TokenType> token = context.Current;

            CheckTokenExists(token);
            CheckFirstToken(token);
            pattern.Append(token.Text);

            // 2 番目のトークンをチェック
            token = context.Next();
            CheckTokenExists(token);

            bool loop = true;

            while (loop)
            {
                DebugLog(": OptionExpression: (" + token.Text + ")");

                switch (token.Type)
                {
                case TokenType.String:
                case TokenType.Name:
                    Token <TokenType> nextToken = token.Next;
                    if (nextToken != null && nextToken.Type == TokenType.Or)
                    {
                        GeneratedExpression orExp = ParseOr(context);
                        exp.AddExpression(orExp);
                        pattern.Append(orExp.Name);
                        token = context.Current;
                        CheckTokenExists(token);
                    }
                    break;
                }
                if (token.IsLast)
                {
                    ThrowParseException(ErrorMessages.UnexpectedToken, token);
                    break;
                }

                switch (token.Type)
                {
                case TokenType.CloseBracket:
                    loop = false;
                    pattern.Append(token.Text);
                    token = context.Next();
                    break;

                case TokenType.String:
                    exp.AddExpression(
                        ParseTerminal(context)
                        );
                    pattern.Append(token.Text);
                    token = context.Next();
                    break;

                case TokenType.Name:
                    exp.AddExpression(
                        ParseNonterminal(context, token.Text)
                        );
                    pattern.Append(token.Text);
                    token = context.Next();
                    break;

                case TokenType.OpenBrace:
                    GeneratedExpression loopExp = ParseLoop(context);
                    exp.AddExpression(loopExp);
                    pattern.Append(loopExp.Name);
                    token = context.Current;
                    break;

                default:
                    ThrowParseException(ErrorMessages.UnexpectedToken, token);
                    break;
                }

                CheckTokenExists(token);
                if (token.IsLast)
                {
                    ThrowParseException(ErrorMessages.UnexpectedToken, token);
                    break;
                }
            }

            // 戻り値
            exp.Name = pattern.ToString();
            context.PushExpression(exp);
        }
Example #4
0
        /// <summary>
        /// 評価用メソッド.
        /// </summary>
        /// <param name="context">コンテキストオブジェクト.</param>
        public override void Interpret(EBNFContext context)
        {
            DebugLog(": RightExpression.Interpret()");

            // 戻り値の準備
            GeneratedExpression exp = ExpressionFactory.CreateField();

            // 最初のトークンをチェック
            Token <TokenType> token = context.Current;

            CheckTokenExists(token);
            CheckFirstToken(token);

            bool loop = true;

            while (loop)
            {
                DebugLog(": RightExpression: (" + token.Type + ")");

                switch (token.Type)
                {
                case TokenType.String:
                case TokenType.Name:
                    Token <TokenType> nextToken = token.Next;
                    if (nextToken != null && nextToken.Type == TokenType.Or)
                    {
                        GeneratedExpression orExp = ParseOr(context);
                        exp.AddExpression(orExp);
                        token = context.Current;
                        CheckTokenExists(token);
                    }
                    break;
                }
                if (token.IsLast)
                {
                    //ThrowParseException(ErrorMessages.UnexpectedToken, token);
                    break;
                }

                switch (token.Type)
                {
                case TokenType.String:
                    exp.AddExpression(
                        ParseTerminal(context)
                        );
                    token = context.Next();
                    break;

                case TokenType.Name:
                    exp.AddExpression(
                        ParseNonterminal(context, token.Text)
                        );
                    token = context.Next();
                    break;

                case TokenType.OpenParen:
                    exp.AddExpression(
                        ParseGroup(context)
                        );
                    token = context.Current;
                    break;

                case TokenType.OpenBrace:
                    exp.AddExpression(
                        ParseLoop(context)
                        );
                    token = context.Current;
                    break;

                case TokenType.OpenBracket:
                    exp.AddExpression(
                        ParseOption(context)
                        );
                    token = context.Current;
                    break;

                case TokenType.Comma:
                    CheckComma(token);
                    token = context.Next();
                    break;

                case TokenType.Semicolon:
                    loop = false;
                    break;

                default:
                    ThrowParseException(ErrorMessages.UnexpectedToken, token);
                    break;
                }

                CheckTokenExists(token);
                if (token.IsLast)
                {
                    break;
                }
            }

            // 戻り値
            context.PushExpression(exp);
        }