コード例 #1
0
        public override object VisitAssignmentExpression([NotNull] DoshikParser.AssignmentExpressionContext context)
        {
            SetWholeExpression(context);
            VisitChildren(context);
            _compilationContext.SetParsingAntlrContext(context);

            var node = new AssignmentExpressionNode(context);

            Sequence.Sequence.Add(node);

            node.Left  = Sequence.FindExpressionByAntlrContext(context.left);
            node.Right = Sequence.FindExpressionByAntlrContext(context.right);

            if ([email protected] == DoshikParser.ASSIGN)
            {
                node.Operator = AssignmentExpressionNode.OperatorOption.Assign;
            }
            else if ([email protected] == DoshikParser.ADD_ASSIGN)
            {
                node.Operator = AssignmentExpressionNode.OperatorOption.PlusAssign;
            }
            else if ([email protected] == DoshikParser.SUB_ASSIGN)
            {
                node.Operator = AssignmentExpressionNode.OperatorOption.MinusAssign;
            }
            else if ([email protected] == DoshikParser.MUL_ASSIGN)
            {
                node.Operator = AssignmentExpressionNode.OperatorOption.MultiplyAssign;
            }
            else if ([email protected] == DoshikParser.DIV_ASSIGN)
            {
                node.Operator = AssignmentExpressionNode.OperatorOption.DivideAssign;
            }
            else if ([email protected] == DoshikParser.MOD_ASSIGN)
            {
                node.Operator = AssignmentExpressionNode.OperatorOption.ModAssign;
            }
            else
            {
                throw new System.NotImplementedException();
            }

            return(null);
        }
コード例 #2
0
        private IExpression HandleAssignmentExpressionNode(AssignmentExpressionNode node)
        {
            var result = new AssignmentExpression();

            result.Operator = node.Operator;

            // ToDo: не помню почему тут void разрешен, но вроде просто для того чтобы отсрочить првоерку на следующий этап (а по сути тут не может быть void)
            result.Left = FindExpressionByExpressionNode(node.Left, true).ReturnOutputSlot;
            result.Left.InputSideExpression = result;
            result.InputSlots.Add(result.Left);

            result.Right = FindExpressionByExpressionNode(node.Right, false).ReturnOutputSlot;
            result.Right.InputSideExpression = result;
            result.InputSlots.Add(result.Right);

            // Определяем выходное значение
            result.ReturnOutputSlot = new ExpressionSlot(_compilationContext.TypeLibrary.FindVoid(), result);

            return(result);
        }