private void EmitVariableAssignment(VariableAssignmentStatementNode variableAssignment) { output.Append(variableAssignment.VariableIdentifier); output.Append('='); EmitExpression(variableAssignment.AssignedExpressionNode); output.Append(';'); }
private bool BindInVariableAssignment(VariableAssignmentStatementNode variableAssignment, VariableIdentifierMap variableIdentifierMap) { TypeSymbolNode?assignedType = BindInExpression(variableAssignment.AssignedExpressionNode, variableIdentifierMap); if (assignedType == null) { return(false); } if (!variableIdentifierMap.TryGet(variableAssignment.VariableIdentifier, out VariableSymbolNode? variable)) { ErrorProvider.ReportError(ErrorCode.CantAssignUndeclaredVariable, Compilation, variableAssignment, $"Variable name: {variableAssignment.VariableIdentifier}"); return(false); } if (variable.IsReadOnly) { ErrorProvider.ReportError(ErrorCode.CantReAssignReadOnlyVariable, Compilation, variableAssignment); return(false); } if (!TypeIsCompatibleWith(assignedType, variable.TypeNode, possiblyOffendingNode: variableAssignment.AssignedExpressionNode, out ImplicitConversionSymbolNode? conversion)) { return(false); } variableAssignment.Bind(variable); if (conversion != null) { variableAssignment.AssignedExpressionNode.SpecifyImplicitConversion(conversion); } return(true); }
private void AnalyzeVariableAssignment(VariableAssignmentStatementNode variableAssignment) { Symbol variable = variableAssignment.Parent.LookupSymbol(variableAssignment.Identifier.IdentifierName); CobaltType expressionType = AnalyzeExpression(variableAssignment.Expression); if (variable.Type is VariableTypeSignature variableType) { if (variableType.CobaltType == expressionType) { variable.Initialized = true; } else { throw new CobaltTypeError($"Type mismatch between variable type of variable `{variableAssignment.Identifier.IdentifierName}` ({variableType.CobaltType}) and type of expression ({expressionType}).", variableAssignment.Expression.SourceLine); } } else { throw new CompilerException($"The type signature of identifier `{variable.Identifier}` is not a variable type signature."); } }
public StatementNode ParseVariableAssignmentStatement(List <Token> tokens) { if (tokens.Count <= 3 || tokens.ElementAt(0).Type != TokenType.Identifier || tokens.ElementAt(1).Type != TokenType.Colon || tokens.ElementAt(2).Type != TokenType.Equal) { throw new CobaltSyntaxError($"Ivalid variable assignment statement.", tokens.First().SourceLine, tokens.First().PositionOnLine); } // Parse identifier IdentifierNode identifier = ParseIdentifier(tokens.ElementAt(0)); // Parse expression ExpressionNode expression = ParseExpression(tokens.GetRange(3, tokens.Count - 3)); // Create and return output statement node VariableAssignmentStatementNode statement = new VariableAssignmentStatementNode(tokens.First().SourceLine); statement.Identifier = identifier; statement.Expression = expression; return(statement); }
private void GenerateVariableAssignemntCode(StringBuilder builder, VariableAssignmentStatementNode variableAssignment) { builder.Append($"{variableAssignment.Identifier.IdentifierName}="); GenerateExpressionCode(builder, variableAssignment.Expression); builder.Append(";"); }