Exemple #1
0
        public override void CheckSemantics(Scope scope, List <SemanticError> errors)
        {
            Operand.CheckSemantics(scope, errors);

            if (Operand.Type != Types.Int)
            {
                errors.Add(SemanticError.InvalidUseOfOperator(
                               "unary minus", Operand.Type.Equals(Types.Nil) ? "valued" : "integer", "operand", Operand));
            }
        }
Exemple #2
0
        public override void CheckSemantics(Scope scope, List <SemanticError> errors)
        {
            LeftOperand.CheckSemantics(scope, errors);
            RightOperand.CheckSemantics(scope, errors);

            if (errors.Any())
            {
                return;
            }

            if (!SupportType(LeftOperand.Type))
            {
                errors.Add(SemanticError.InvalidUseOfOperator("binary relational", "valid", "left", LeftOperand));
            }

            if (!SupportType(RightOperand.Type))
            {
                errors.Add(SemanticError.InvalidUseOfOperator("binary relational", "valid", "right", RightOperand));
            }

            if (RightOperand.Type != LeftOperand.Type)
            {
                errors.Add(new SemanticError
                {
                    Message = "Types of left and right operands of the binary relational operator do not match",
                    Node    = this
                });
            }

            if (LeftOperand.Type.Equals(Types.Nil) && RightOperand.Type.Equals(Types.Nil))
            {
                errors.Add(new SemanticError
                {
                    Message = $"Types of left and right operands of the binary relational operator can't be both '{Types.Nil}'",
                    Node    = this
                });
            }

            if (LeftOperand is ComparisonNode || RightOperand is ComparisonNode)
            {
                errors.Add(new SemanticError
                {
                    Message = "Comparison operators do not associate",
                    Node    = this
                });
            }
        }
Exemple #3
0
        public override void CheckSemantics(Scope scope, List <SemanticError> errors)
        {
            LeftOperand.CheckSemantics(scope, errors);
            RightOperand.CheckSemantics(scope, errors);

            if (LeftOperand.Type != Type)
            {
                errors.Add(SemanticError.InvalidUseOfOperator(
                               "binary logical", LeftOperand.Type.Equals(Types.Nil) ? "valued" : "integer", "left", LeftOperand));
            }

            if (RightOperand.Type != Type)
            {
                errors.Add(SemanticError.InvalidUseOfOperator(
                               "binary logical", RightOperand.Type.Equals(Types.Nil) ? "valued" : "integer", "right", RightOperand));
            }
        }