コード例 #1
0
        private void ProcessConceptLeaf()
        {
            _lastIsOperator = null;

            var value = NameHelper.CreateName(_currToken.Content);

            var kindOfName = value.KindOfName;

            switch (kindOfName)
            {
            case KindOfName.Concept:
            case KindOfName.Channel:
            case KindOfName.Entity:
            {
                var node = new ConstValueAstExpression();
                node.Value = value;

                var intermediateNode = new IntermediateAstNode(node);

                AstNodesLinker.SetNode(intermediateNode, _nodePoint);

                _state = State.GotName;
            }
            break;

            default:
                throw new ArgumentOutOfRangeException(nameof(kindOfName), kindOfName, null);
            }
        }
コード例 #2
0
        private void ProcessStringToken()
        {
            _lastIsOperator = null;

            var node  = new ConstValueAstExpression();
            var value = new StringValue(_currToken.Content);

            node.Value = value;

            var intermediateNode = new IntermediateAstNode(node);

            AstNodesLinker.SetNode(intermediateNode, _nodePoint);
        }
コード例 #3
0
        private void ProcessNumberToken()
        {
            _context.Recovery(_currToken);
            var parser = new NumberParser(_context);

            parser.Run();

            var node = new ConstValueAstExpression();

            node.Value = parser.Result;

            var intermediateNode = new IntermediateAstNode(node);

            AstNodesLinker.SetNode(intermediateNode, _nodePoint);
        }
コード例 #4
0
        private void ProcessChannel()
        {
            _lastIsOperator = null;

            var name = NameHelper.CreateName(_currToken.Content);

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

            var node = new ConstValueAstExpression();
            node.Value = name;

            var intermediateNode = new IntermediateAstNode(node);

            AstNodesLinker.SetNode(intermediateNode, _nodePoint);
        }
コード例 #5
0
        private void ProcessNullToken()
        {
            _context.Recovery(_currToken);

            var parser = new NullParser(_context);

            parser.Run();

#if DEBUG
            //Log($"parser.Result = {parser.Result}");
#endif

            var node = new ConstValueAstExpression();
            node.Value = parser.Result;

            var intermediateNode = new IntermediateAstNode(node);

            AstNodesLinker.SetNode(intermediateNode, _nodePoint);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        private void ProcessLogicalQueryOperator()
        {
            _lastIsOperator = null;

            //_context.Recovery(_currToken);
            var parser = new LogicalQueryOperationParser(_context);

            parser.Run();

            var resultItem = parser.Result;

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

            var node = new UnaryOperatorAstExpression();
            node.KindOfOperator = KindOfOperator.CallLogicalQuery;

            var priority = OperatorsHelper.GetPriority(node.KindOfOperator);

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

            var intermediateNode = new IntermediateAstNode(node, KindOfIntermediateAstNode.UnaryOperator, priority);

            AstNodesLinker.SetNode(intermediateNode, _nodePoint);

            var valueNode = new ConstValueAstExpression();
            valueNode.Value = resultItem;

            var valueIntermediateNode = new IntermediateAstNode(valueNode);

            AstNodesLinker.SetNode(valueIntermediateNode, _nodePoint);

            _state = State.GotCallLogicalQueryOperator;
        }
コード例 #8
0
        private AstExpression ConvertValueExprToNameExpr(AstExpression expression)
        {
#if DEBUG
            //Log($"expression = {expression}");
#endif

            var kind = expression.Kind;

            switch (kind)
            {
            case KindOfAstExpression.ConstValue:
                return(expression);

            case KindOfAstExpression.Var:
            {
                var node = new ConstValueAstExpression();
                node.Value = expression.AsVarAstExpression.Name;
                return(node);
            }

            default:
                throw new ArgumentOutOfRangeException(nameof(kind), kind, null);
            }
        }
コード例 #9
0
        /// <inheritdoc/>
        protected override void OnRun()
        {
#if DEBUG
            //Log($"_currToken = {_currToken}");
            //Log($"Result = {Result}");
            //Log($"_state = {_state}");
#endif

            switch (_state)
            {
            case State.Init:
                switch (_currToken.TokenKind)
                {
                case TokenKind.EntityCondition:
                {
                    var name = NameHelper.CreateName(_currToken.Content);

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

                    Result.Name = name;

                    _state = State.GotName;
                }
                break;

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

            case State.GotName:
                switch (_currToken.TokenKind)
                {
                case TokenKind.OpenSquareBracket:
                    Result.KindOfEntityConditionAstExpression = KindOfEntityConditionAstExpression.Waypoint;
                    _state = State.WaitForFirstCoordinate;
                    break;

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

            case State.WaitForFirstCoordinate:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Number:
                {
                    _context.Recovery(_currToken);
                    var parser = new NumberParser(_context);
                    parser.Run();

                    var node = new ConstValueAstExpression();
                    node.Value = parser.Result;

                    Result.FirstCoordinate = node;

                    _state = State.GotFirstCoordinate;
                }
                break;

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

            case State.GotFirstCoordinate:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Comma:
                    _state = State.WaitForSecondCoordinate;
                    break;

                case TokenKind.CloseSquareBracket:
                    if (Result.KindOfEntityConditionAstExpression == KindOfEntityConditionAstExpression.Waypoint)
                    {
                        Exit();
                        break;
                    }
                    throw new UnexpectedTokenException(_currToken);

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

            case State.WaitForSecondCoordinate:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Number:
                {
                    _context.Recovery(_currToken);
                    var parser = new NumberParser(_context);
                    parser.Run();

                    var node = new ConstValueAstExpression();
                    node.Value = parser.Result;

                    Result.SecondCoordinate = node;

                    _state = State.GotSecondCoordinate;
                }
                break;

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

            case State.GotSecondCoordinate:
                switch (_currToken.TokenKind)
                {
                case TokenKind.CloseSquareBracket:
                    if (Result.KindOfEntityConditionAstExpression == KindOfEntityConditionAstExpression.Waypoint)
                    {
                        Exit();
                        break;
                    }
                    throw new UnexpectedTokenException(_currToken);

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

            default:
                throw new ArgumentOutOfRangeException(nameof(_state), _state, null);
            }
        }
コード例 #10
0
        /// <inheritdoc/>
        protected override void OnRun()
        {
#if DEBUG
            //Log($"Result = {Result}");
            //Log($"_state = {_state}");
            //Log($"_currToken = {_currToken}");
#endif

            switch (_state)
            {
            case State.Init:
                switch (_currToken.TokenKind)
                {
                case TokenKind.OpenRoundBracket:
                    _state = State.WaitForMainParameter;
                    break;

                case TokenKind.AsyncMarker:
                    if (Result.IsAsync)
                    {
                        throw new UnexpectedTokenException(_currToken);
                    }
                    Result.IsAsync = true;
                    break;

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

            case State.WaitForMainParameter:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Identifier:
                case TokenKind.Word:
                {
                    _currentParameter = new CallingParameter();
                    Result.Parameters.Add(_currentParameter);

                    var value = NameHelper.CreateName(_currToken.Content);

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

                    _currentParameter.Value = node;
                    _state = State.GotPositionedMainParameter;
                }
                break;

                case TokenKind.Number:
                {
                    _currentParameter = new CallingParameter();
                    Result.Parameters.Add(_currentParameter);

                    _context.Recovery(_currToken);

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

                    var node = new ConstValueAstExpression();
                    node.Value = parser.Result;

                    _currentParameter.Value = node;
                    _state = State.GotPositionedMainParameter;
                }
                break;

                case TokenKind.String:
                {
                    _currentParameter = new CallingParameter();
                    Result.Parameters.Add(_currentParameter);

                    var node = new ConstValueAstExpression();
                    node.Value = new StringValue(_currToken.Content);

                    _currentParameter.Value = node;
                    _state = State.GotPositionedMainParameter;
                }
                break;

                case TokenKind.Var:
                {
                    _currentParameter = new CallingParameter();
                    Result.Parameters.Add(_currentParameter);

                    var value = NameHelper.CreateName(_currToken.Content);

                    var node = new VarAstExpression();
                    node.Name = value;

                    _currentParameter.Value = node;

                    _state = State.GotPositionedMainParameter;
                }
                break;

                case TokenKind.CloseRoundBracket:
                    Exit();
                    break;

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

            case State.GotPositionedMainParameter:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Colon:
                    if (_currentParameter.Value != null)
                    {
                        _currentParameter.Name  = ConvertValueExprToNameExpr(_currentParameter.Value);
                        _currentParameter.Value = null;
                    }

                    _state = State.WaitForValueOfNamedMainParameter;
                    break;

                case TokenKind.CloseRoundBracket:
                    Exit();
                    break;

                case TokenKind.Comma:
                    _state = State.GotComma;
                    break;

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

            case State.WaitForValueOfNamedMainParameter:
                switch (_currToken.TokenKind)
                {
                case TokenKind.EntityCondition:
                {
                    _context.Recovery(_currToken);

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

                    _currentParameter.Value = parser.Result;

                    _state = State.GotValueOfNamedMainParameter;
                }
                break;

                case TokenKind.Number:
                {
                    _context.Recovery(_currToken);

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

                    var node = new ConstValueAstExpression();
                    node.Value = parser.Result;

                    _currentParameter.Value = node;

                    _state = State.GotValueOfNamedMainParameter;
                }
                break;

                case TokenKind.String:
                {
                    var node = new ConstValueAstExpression();
                    node.Value = new StringValue(_currToken.Content);

                    _currentParameter.Value = node;

                    _state = State.GotValueOfNamedMainParameter;
                }
                break;

                case TokenKind.Word:
                case TokenKind.Identifier:
                {
                    var value = NameHelper.CreateName(_currToken.Content);

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

                    _currentParameter.Value = node;

                    _state = State.GotValueOfNamedMainParameter;
                }
                break;

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

            case State.GotValueOfNamedMainParameter:
                switch (_currToken.TokenKind)
                {
                case TokenKind.CloseRoundBracket:
                    Exit();
                    break;

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

            case State.GotComma:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Number:
                case TokenKind.Word:
                case TokenKind.EntityCondition:
                case TokenKind.Var:
                case TokenKind.String:
                    _context.Recovery(_currToken);
                    _state = State.WaitForMainParameter;
                    break;

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

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