private void SemanticCheck(AssignStatement ast, CompilerContext context) { var valType = expressionTyper.TypeExpression(ast.Value, context); var varExists = context.VariableExists(ast.VariableName); //ast.CompilerScope = context.CurrentScope; if (varExists) { var varType = context.GetVariableType(ast.VariableName); if (varType != valType) { throw new TypingException($"bad assignment : {valType} expecting {varType}"); } } else { var creation = context.SetVariableType(ast.VariableName, valType); ast.IsVariableCreation = creation; ast.CompilerScope = context.CurrentScope; } }
public WhileType TypeExpression(Expression expr, CompilerContext context) { if (expr is BoolConstant b) { return(TypeExpression(b, context)); } if (expr is IntegerConstant i) { return(TypeExpression(i, context)); } if (expr is StringConstant s) { return(TypeExpression(s, context)); } if (expr is BinaryOperation binary) { return(TypeExpression(binary, context)); } if (expr is Neg neg) { return(TypeExpression(neg, context)); } if (expr is Not not) { return(TypeExpression(not, context)); } if (expr is Variable variable) { var varType = context.GetVariableType(variable.Name); if (varType == WhileType.NONE) { throw new TypingException($" variable {variable.Name} {variable.Position} is not intialized"); } variable.CompilerScope = context.CurrentScope; return(varType); } throw new SignatureException($"unknow expression type ({expr.GetType().Name})"); }