private void EmitVariableAssignment(VariableAssignmentStatementNode variableAssignment)
 {
     output.Append(variableAssignment.VariableIdentifier);
     output.Append('=');
     EmitExpression(variableAssignment.AssignedExpressionNode);
     output.Append(';');
 }
예제 #2
0
        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);
        }
예제 #3
0
        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.");
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
 private void GenerateVariableAssignemntCode(StringBuilder builder, VariableAssignmentStatementNode variableAssignment)
 {
     builder.Append($"{variableAssignment.Identifier.IdentifierName}=");
     GenerateExpressionCode(builder, variableAssignment.Expression);
     builder.Append(";");
 }