public static (string, List <Error>) GenerateCode(ASG.Program program) { var context = new Context { StringBuilder = new StringBuilder(), IndentCount = 0, Errors = new List <Error>() }; Write(context, Header); StartNewLine(context, deltaIndentCount: 1); { int i = 0; foreach (var function in program.Functions) { if (function.Body == null) { continue; } if (i > 0) { StartNewLine(context); } WriteFunction(context, function); i++; } } StartNewLine(context, deltaIndentCount: -1); Write(context, Footer); return(context.StringBuilder.ToString(), context.Errors); }
public static ASG.Program CreateFibonacciProgram() { var program = new ASG.Program(); var fibFunction = new Function { Name = "Fib", Parameters = new List <Variable> { new Variable { Name = "n", Type = BuiltInTypes.Int32 } }, ReturnType = BuiltInTypes.Int32 }; fibFunction.Body = new List <IStatement> { new IfStatement { Condition = new EqualityOperator { Left = new VariableExpression { Variable = fibFunction.Parameters[0] }, Right = new IntegerLiteral { Value = 0 } }, Body = new List <IStatement> { new ReturnStatement { Value = new IntegerLiteral { Value = 0 } } }, }, new IfStatement { Condition = new EqualityOperator { Left = new VariableExpression { Variable = fibFunction.Parameters[0] }, Right = new IntegerLiteral { Value = 1 } }, Body = new List <IStatement> { new ReturnStatement { Value = new IntegerLiteral { Value = 1 } } }, }, new ReturnStatement { Value = new AdditionOperator { Left = new FunctionCall { Function = fibFunction, Arguments = new List <IExpression> { new SubtractionOperator { Left = new VariableExpression { Variable = fibFunction.Parameters[0] }, Right = new IntegerLiteral { Value = 1 } } } }, Right = new FunctionCall { Function = fibFunction, Arguments = new List <IExpression> { new SubtractionOperator { Left = new VariableExpression { Variable = fibFunction.Parameters[0] }, Right = new IntegerLiteral { Value = 2 } } } } } } }; program.Functions.Add(fibFunction); var fibVariable = new Variable { Name = "fib", Type = BuiltInTypes.Int32 }; var mainFunction = new Function { Name = "Main", Parameters = new List <Variable>(), ReturnType = BuiltInTypes.Unit, Body = new List <IStatement> { new VariableDeclaration { Variable = fibVariable, InitialValue = new FunctionCall { Function = fibFunction, Arguments = new List <IExpression> { new IntegerLiteral { Value = 8 } } } }, new FunctionCall { Function = BuiltInFunctions.WriteLineToConsole, Arguments = new List <IExpression> { new StringLiteral { Value = "Hello, world!" } } }, new FunctionCall { Function = BuiltInFunctions.WriteLineToConsole, Arguments = new List <IExpression> { new FunctionCall { Function = BuiltInFunctions.Int32ToString, Arguments = new List <IExpression> { new VariableExpression { Variable = fibVariable } } } } } } }; program.Functions.Add(mainFunction); return(program); }