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

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

            CheckTokenExists(token);
            CheckTokenType(token, TokenType.String);

            // ", ' を取り除く
            string pattern = token.Text;

            if (pattern[0] == '"')
            {
                pattern = pattern.Trim('"');
            }
            else if (pattern[0] == '\'')
            {
                pattern = pattern.Trim('\'');
            }

            // トークンのバターンを登録する
            context.AddTokenizerPattern(pattern, pattern);

            // 戻り値
            GeneratedExpression exp = ExpressionFactory.CreateTerminal(pattern);

            context.PushExpression(exp);
            //GeneratedExpression = ExpressionFactory.CreateTerminal(pattern);
        }
Exemplo n.º 2
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;
        }
Exemplo n.º 3
0
        /// <summary>
        /// 評価用メソッド.
        /// </summary>
        /// <param name="context">コンテキストオブジェクト.</param>
        public override void Interpret(EBNFContext context)
        {
            DebugLog(": FieldExpression.Interpret()");

            // 名前
            Token <TokenType> token = context.Current;

            CheckTokenExists(token);
            CheckTokenType(token, TokenType.Name);
            if (token.Text == string.Empty)
            {
                ThrowParseException(
                    ErrorMessages.UnexpectedToken, token
                    );
            }
            string name = token.Text;

            // イコール
            token = context.Next();
            CheckTokenExists(token);
            CheckTokenType(token, TokenType.Equal);

            // 式の右辺
            token = context.Next();
            CheckTokenExists(token);
            GeneratedExpression exp = ParseRight(context);

            exp.Name = name;

            // セミコロン
            token = context.Current;
            CheckTokenExists(token);
            CheckTokenType(token, TokenType.Semicolon);

            // 次に進めておく
            token = context.Next();
            //CheckTokenExists(token);

            // 戻り値
            context.PushExpression(exp);
            //GeneratedExpression = exp.GeneratedExpression;
        }
Exemplo n.º 4
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;
        }
Exemplo n.º 5
0
 /// <summary>
 /// コンストラクタ.
 /// </summary>
 /// <param name="tokenizer">生成された Tokenizer.</param>
 /// <param name="fields">生成された Expression のリスト.</param>
 /// <param name="expession">生成されたパーサのルート.</param>
 public GeneratedParser(Tokenizer <TokenType> tokenizer, Dictionary <string, GeneratedExpression> fields, GeneratedExpression expession)
 {
     this.tokenizer = tokenizer;
     this.fields    = fields;
     this.expession = expession;
 }
Exemplo n.º 6
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);
        }
Exemplo n.º 7
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);
        }
Exemplo n.º 8
0
 /// <summary>
 /// Expression の処理内で戻り値をプッシュする.
 /// </summary>
 /// <param name="expression"></param>
 public void PushExpression(GeneratedExpression expression)
 {
     ExpressionStack.Push(expression);
 }