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); }
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); }