public override object VisitFunctionVariableDeclarationStatement([NotNull] ClepsParser.FunctionVariableDeclarationStatementContext context) { IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName); ClepsType variableType = Visit(context.typename()) as ClepsType; string variableName = Visit(context.variable()) as string; VariableManager variableManager = VariableManagers.Last(); if (!variableManager.IsVariableNameAvailable(variableName)) { string errorMessage = String.Format("Variable {0} is already defined", variableName); Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage)); //Use a different variable name to avoid stopping the compilation variableName = variableManager.GetAvailableVariableName(variableName); } ClepsVariable variable = new ClepsVariable(variableName, variableType); IValue value = null; if (context.rightHandExpression() != null) { value = Visit(context.rightHandExpression()) as IValue; if (variable.VariableType != value.ExpressionType) { throw new NotImplementedException("Assignment for non identical types not supported yet"); } } IValueRegister variableRegister = methodRegister.CreateNewVariable(variable, value); variableManager.AddLocalVariable(variable, variableRegister); return(variable); }
public override object VisitFunctionAssignment_Ex([NotNull] ClepsParser.FunctionAssignmentContext context) { VariableManager variableManager = new VariableManager(); VariableManagers.Add(variableManager); ClepsType returnType = VoidType.GetVoidType(); if (context.FunctionReturnType != null) { returnType = Visit(context.FunctionReturnType) as ClepsType; } List <ClepsType> parameterTypes = context._FunctionParameterTypes.Select(t => Visit(context.FunctionReturnType) as ClepsType).ToList(); FunctionClepsType functionType = new FunctionClepsType(parameterTypes, returnType); IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName); var formalParameterNames = context._FormalParameters.Select(p => Visit(p) as string).ToList(); methodRegister.SetFormalParameterNames(formalParameterNames); formalParameterNames.Zip(parameterTypes, (name, clepsType) => new ClepsVariable(name, clepsType)) .ToList().ForEach(variable => { variableManager.AddLocalVariable(variable, methodRegister.GetFormalParameterRegister(variable.VariableName)); }); Visit(context.statementBlock()); VariableManagers.RemoveAt(VariableManagers.Count - 1); return(functionType); }
public override object VisitNativeStatement([NotNull] ClepsParser.NativeStatementContext context) { IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName); var startIndex = context.NativeOpen.StopIndex + 1; var endIndex = context.NativeClose.StartIndex - 1; var length = endIndex - startIndex + 1; var nativeCode = System.IO.File.ReadAllText(FileName).Substring(startIndex, length) + "\n"; methodRegister.AddNativeCode(nativeCode); return(true); }
public override object VisitFunctionCallStatement([NotNull] ClepsParser.FunctionCallStatementContext context) { IValue expressionValue = Visit(context.rightHandExpression()) as IValue; bool isMembersAccessible = !expressionValue.ExpressionType.IsStaticType; IValue ret = doFunctionCall(context.functionCall(), expressionValue.ExpressionType, isMembersAccessible, true /* allowVoidReturn */); IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName); methodRegister.CreateFunctionCallStatement(ret); return(ret); }
public override object VisitIfStatement([NotNull] ClepsParser.IfStatementContext context) { IValue conditionValue = Visit(context.rightHandExpression()) as IValue; IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName); methodRegister.CreateIfStatementBlock(conditionValue); Visit(context.statementBlock()); methodRegister.CloseBlock(); return(conditionValue); }
private void CreateAssignment(IValueRegister register, ClepsParser.RightHandExpressionContext rightHandExpression) { IValue value = Visit(rightHandExpression) as IValue; if (register.ExpressionType == value.ExpressionType && register.ExpressionType == CompilerConstants.ClepsByteType) { IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName); methodRegister.CreateAssignment(register, value); } else { throw new NotImplementedException("assignment for non byte types not supported yet"); } }
public override object VisitFunctionReturnStatement_Ex([NotNull] ClepsParser.FunctionReturnStatementContext context) { IValue returnValue = null; if (context.rightHandExpression() != null) { returnValue = Visit(context.rightHandExpression()) as IValue; } var currFunctionType = CurrMemberType as FunctionClepsType; if (currFunctionType.ReturnType != returnValue.ExpressionType) { string errorMessage = String.Format("Expected return of {0}. Returning type {1} instead.", currFunctionType.ReturnType.GetClepsTypeString(), returnValue.ExpressionType.GetClepsTypeString()); Status.AddError(new CompilerError(FileName, context.rightHandExpression().Start.Line, context.rightHandExpression().Start.Column, errorMessage)); } IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName); methodRegister.CreateReturnStatement(returnValue); return(returnValue); }