private void ProcessRuleOrFact()
        {
            _context.Recovery(_currToken);

            var parser = new LogicalQueryParser(_context);

            parser.Run();

            var ruleInstanceItem = parser.Result;

#if DEBUG
            //Log($"ruleInstanceItem = {ruleInstanceItem}");
#endif

            var value = new RuleInstanceValue(ruleInstanceItem);
            var node  = new ConstValueAstExpression();
            node.Value = value;

            var intermediateNode = new IntermediateAstNode(node);

            AstNodesLinker.SetNode(intermediateNode, _nodePoint);
        }
Beispiel #2
0
        /// <inheritdoc/>
        protected override void OnRun()
        {
#if DEBUG
            //Log($"_currToken = {_currToken}");
            //Log($"_state = {_state}");
#endif

            switch (_state)
            {
            case State.Init:
                switch (_currToken.TokenKind)
                {
                case TokenKind.QuestionMark:
                    Result.KindOfLogicalQueryOperation = KindOfLogicalQueryOperation.Select;
                    _state = State.GotKindOfLogicalQueryOperation;
                    break;

                case TokenKind.Word:
                    switch (_currToken.KeyWordTokenKind)
                    {
                    case KeyWordTokenKind.Select:
                        Result.KindOfLogicalQueryOperation = KindOfLogicalQueryOperation.Select;
                        _state = State.GotKindOfLogicalQueryOperation;
                        break;

                    case KeyWordTokenKind.Insert:
                        Result.KindOfLogicalQueryOperation = KindOfLogicalQueryOperation.Insert;
                        _state = State.GotKindOfLogicalQueryOperation;
                        break;

                    default:
                        throw new UnexpectedTokenException(_currToken);
                    }
                    break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            case State.GotKindOfLogicalQueryOperation:
                switch (_currToken.TokenKind)
                {
                case TokenKind.OpenFactBracket:
                {
                    _context.Recovery(_currToken);

                    var parser = new LogicalQueryParser(_context);
                    parser.Run();

                    var ruleInstanceItem = parser.Result;

#if DEBUG
                    //Log($"ruleInstanceItem = {ruleInstanceItem}");
#endif

                    var value = new RuleInstanceValue(ruleInstanceItem);

                    Result.Target = value;

                    _state = State.GotTarget;
                }
                break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            case State.GotTarget:
                switch (_currToken.TokenKind)
                {
                case TokenKind.LeftRightStream:
                case TokenKind.Semicolon:
                    _context.Recovery(_currToken);

                    Exit();
                    break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(_state), _state, null);
            }
        }