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);
        }
Example #2
0
        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);
        }