public override SemanticCheckResult VisitAssignment(ASTAssingmentNode Assingment) { Assingment.SemanticCheckResult.Ensure(!Types.IsSelf(Assingment.Id.Name), new Lazy <Error>(() => new Error($"Not allowed to assign {Assingment.Id.Name}.", ErrorKind.SemanticError, Assingment.Id.Token.Line, Assingment.Id.Token.Column))); var expresult = Assingment.Expresion.Accept(this); var idResult = Assingment.Id.Accept(this); Assingment.SemanticCheckResult.Ensure(idResult); Assingment.SemanticCheckResult.Ensure(expresult, expresult.Type.IsIt(idResult.Type), new Lazy <Error>(() => new Error($"Type {expresult.Type} is not subtype of {idResult.Type}.", ErrorKind.TypeError, Assingment.AssigmentToken.Line, Assingment.AssigmentToken.Column))); Assingment.SemanticCheckResult.EnsureReturnType(expresult.Type); return(Assingment.SemanticCheckResult); }
public override ASTNode VisitAssignment([NotNull] SuperCOOLParser.AssignmentContext context) { var result = new ASTAssingmentNode(); ASTExpressionNode exp = (ASTExpressionNode)context.expression().Accept(this); AssignSymbolTable(exp); ASTIdNode id = new ASTIdNode() { Token = context.OBJECTID().Symbol }; AssignSymbolTable(id); result.Id = id; result.Expresion = exp; result.AssigmentToken = context.ASSIGNMENT().Symbol; return(result); }
public ASTCILNode VisitAssignment(ASTAssingmentNode Assigment) { Assigment.SymbolTable.IsDefObject(Assigment.Id.Name, out var symbolInfo); var exp = (ASTCILExpressionNode)Assigment.Expresion.Accept(this); if (symbolInfo.Type == Types.Object && (Assigment.Expresion.SemanticCheckResult.Type == compilationUnit.TypeEnvironment.Bool || Assigment.Expresion.SemanticCheckResult.Type == compilationUnit.TypeEnvironment.Int)) { return(symbolInfo.Kind == ObjectKind.Atribute ? (ASTCILNode) new ASTCILSetAttributeNode(symbolInfo, new ASTCILBoxingNode(exp, Assigment.Expresion.SemanticCheckResult.Type)) : new ASTCILAssignmentNode(symbolInfo, new ASTCILBoxingNode(exp, Assigment.Expresion.SemanticCheckResult.Type))); } return(symbolInfo.Kind == ObjectKind.Atribute ? (ASTCILNode) new ASTCILSetAttributeNode(symbolInfo, exp) : new ASTCILAssignmentNode(symbolInfo, exp)); }
public virtual T VisitAssignment(ASTAssingmentNode Assigment) { Assigment.Id.Accept(this); Assigment.Expresion.Accept(this); return(default(T)); }