Ejemplo n.º 1
0
        /************************/
        /*** Public Functions ***/
        /************************/

        public void Add(ProgNode argument)
        {
            if (argument != null)
            {
                argList.Add(argument);
            }
        }
Ejemplo n.º 2
0
 public void Add(ProgNode node)
 {
     if (node != null)
     {
         nodeList.Add(node);
     }
 }
        public override void Visit(ProgNode node)
        {
            CSharpString.Append("using System;");
            PrettyPrintNewLine();
            CSharpString.Append("using System.Collections.Generic;");
            PrettyPrintNewLine();
            CSharpString.Append("using System.Linq;");
            PrettyPrintNewLine();
            CSharpString.Append("using System.Text;");
            PrettyPrintNewLine();

            CSharpString.Append("public class Program__");
            PrettyPrintNewLine();
            CSharpString.Append("{");
            IndentationLevel++;
            PrettyPrintNewLine();
            GenerateStandardFunctions();
            foreach (TopDclNode DclNode in node.TopDclNodes)
            {
                CSharpString.Append("public ");
                DclNode.Accept(this);
                PrettyPrintNewLine();
            }
            IndentationLevel--;
            PrettyPrintNewLine();
            CSharpString.Append("}");
        }
        public CodeGenVisitor(ProgNode node, IScope Scope)
        {
            this.Scope = Scope;

            ClassManager    = new ClassMgr(Scope);
            VariableManager = new ThreeAddressHandler();

            Code = new List <CodeLine>();

            VariableManager.PushVariableCounter();
            StepOne();
            VariableManager.PopVariableCounter();

            node.Accept(this);

            VariableManager.PushVariableCounter();

            Code.Add(new LabelCodeLine("start"));

            int size = ClassManager.GetClassSize("Main");

            Code.Add(new AllocateCodeLine(VariableManager.PeekVariableCounter(), size));
            Code.Add(new PushParamCodeLine(VariableManager.PeekVariableCounter()));
            Code.Add(new CallLblCodeLine(new LabelCodeLine("Main", "constructor")));
            Code.Add(new PopParamCodeLine(1));

            Code.Add(new PushParamCodeLine(VariableManager.PeekVariableCounter()));
            Code.Add(new CallLblCodeLine(new LabelCodeLine("Main", "main")));
            Code.Add(new PopParamCodeLine(1));

            VariableManager.PopVariableCounter();
        }
Ejemplo n.º 5
0
 public ProgNode Check(ProgNode node, List <string> errors, IScope scope)
 {
     this.errors = errors;
     this.scope  = scope;
     node.Accept(this);
     return(node);
 }
Ejemplo n.º 6
0
 public void Add(ProgNode node)
 {
     if (node != null)
     {
         arguments.Add(node);
     }
 }
Ejemplo n.º 7
0
        /**************************/
        /*** Override Functions ***/
        /**************************/

        public override ProgNode Interpret(Script script)
        {
            ProgNodeDeclare command = new ProgNodeDeclare();

            Token varName   = new Token();
            Token nextToken = new Token();

            while (!nextToken.IsEos())
            {
                ProgNode expression = null;

                varName   = script.GetToken();
                nextToken = script.GetToken();

                if (nextToken.IsAssign())
                {
                    expression = script.Expression();
                    nextToken  = expression.EndingToken;
                }

                command.Delcare(varName, Type, new ProgNodeValue(1), expression);
            }

            return(command);
        }
            /*******************/
            /*** Constructor ***/
            /*******************/

            public Declaration(string name, SymbolTableRecType type, ProgNode size, ProgNode initialize)
            {
                Name       = name;
                Type       = type;
                Size       = size;
                Initialize = initialize;
            }
Ejemplo n.º 9
0
        public override ProgNode Interpret(Script script)
        {
            ProgNode expression = script.Expression();

            ProgNode codeBlock = script.ReadCodeBlock();

            return(new ProgNodeWhile(expression, codeBlock));
        }
        /*******************/
        /*** Constructor ***/
        /*******************/

        public ProgNodeBinaryOper(ProgNode leftExp, ProgNode rightExp)
        {
            this.leftExp  = leftExp;
            this.rightExp = rightExp;
            this.boxing   = new int[NUMBER_OF_SCRIPT_TYPES, NUMBER_OF_SCRIPT_TYPES];

            InitBoxing();
        }
Ejemplo n.º 11
0
        public override ProgNode Interpret(Script script)
        {
            Token eos = script.GetToken();

            ProgNode codeBlock = script.ReadCodeBlock();

            return(codeBlock);
        }
Ejemplo n.º 12
0
 public override void Visit(ProgNode node)
 {
     foreach (TopDclNode DclNode in node.TopDclNodes)
     {
         DclNode.Accept(this);
         PrettyPrintNewLine();
     }
 }
        public void Visit(ProgNode node)
        {
            List <ClassNode> sorted = new List <ClassNode>();

            sorted.AddRange(node.classes);

            sorted.Sort((x, y) => (Scope.GetType(x.type.Text) <= Scope.GetType(y.type.Text) ? 1 : -1));

            foreach (var @class in sorted)
            {
                ClassManager.DefineClass(@class.type.Text);

                List <PropertyNode> properties = new List <PropertyNode>();
                List <MethodNode>   methods    = new List <MethodNode>();

                foreach (var feature in @class.features)
                {
                    if (feature is PropertyNode)
                    {
                        properties.Add(feature as PropertyNode);
                    }
                    else
                    {
                        methods.Add(feature as MethodNode);
                    }
                }

                foreach (var method in methods)
                {
                    List <string> params_type = new List <string>();
                    foreach (var x in method.paramsFormal)
                    {
                        params_type.Add(x.type.Text);
                    }

                    ClassManager.DefineMethod(@class.type.Text, method.id.text, params_type);
                }

                foreach (var property in properties)
                {
                    ClassManager.DefineProperty(@class.type.Text, property.formal.id.text, property.formal.type.Text);
                }
            }

            foreach (var @class in sorted)
            {
                @class.Accept(this);
            }
        }
Ejemplo n.º 14
0
        public ProgNode ReadCodeBlock()
        {
            ProgNodeExec codeBlock = new ProgNodeExec();

            ProgNode command = GetCommand();

            while ((command != null) && (!command.IsEndOfCodeBlock))
            {
                codeBlock.Add(command);

                command = GetCommand();
            }

            return(codeBlock);
        }
Ejemplo n.º 15
0
        /*******************/
        /*** Constructor ***/
        /*******************/

        public Script(Parser parser)
        {
            this.parser = parser;

            while (!parser.IsEof())
            {
                ProgNode node = GetCommand();

                if (!errorSwitch)
                {
                    ProgNodeContext context = new ProgNodeContext();

                    node.Evaluate(context);
                }
            }
        }
Ejemplo n.º 16
0
        private void PopOperStack(Stack <Token> operStack, Stack <ProgNode> varStack)
        {
            ProgNode node = null;

            ProgNode right = varStack.Pop();
            ProgNode left  = varStack.Pop();

            TokenType type = operStack.Pop().GetDataType();

            switch (type)
            {
            case TokenType.PLUS:
                node = new ProgNodePlus(left, right);
                break;

            case TokenType.MULTIPLY:
                node = new ProgNodeMultiply(left, right);
                break;

            case TokenType.MINUS:
                node = new ProgNodeMinus(left, right);
                break;

            case TokenType.DIVIDE:
                node = new ProgNodeDivide(left, right);
                break;

            case TokenType.POWER:
                node = new ProgNodePower(left, right);
                break;

            case TokenType.MODULUS:
                node = new ProgNodeMod(left, right);
                break;

            case TokenType.LT:
            case TokenType.LE:
            case TokenType.GT:
            case TokenType.GE:
            case TokenType.NE:
                node = new ProgNodeLogicalOper(type, left, right);
                break;
            }

            varStack.Push(node);
        }
        private static bool CheckSemantic(ProgNode program, Scope scope)
        {
            var errors = new List <string>();

            var programnode = new FirstSemanticVisit().Check(program, errors, scope);

            if (SemanticAlgorithm.ReportError(errors))
            {
                return(false);
            }
            programnode = new SemanticVisit().Check(programnode, errors, scope);
            if (SemanticAlgorithm.ReportError(errors))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 18
0
        public ProgNode Expression()
        {
            Stack <Token>    operStack = new Stack <Token>();
            Stack <ProgNode> varStack  = new Stack <ProgNode>();

            operStack.Push(new Token(TokenType.BOTTOM_EXP_STACK));

            Token token = parser.GetToken();

            while (!token.IsEoe())
            {
                if (token.IsOperator())
                {
                    PushOperOnStack(token, operStack, varStack);
                }
                else if (token.IsLeftParen())
                {
                    PushLeftParen(token, operStack);
                }
                else if (token.IsRightParen())
                {
                    PopLeftParen(operStack, varStack);
                }
                else
                {
                    PushVarStack(token, varStack);
                }

                token = parser.GetToken();
            }

            // Pop the operator stack until the bottom is reached
            //---------------------------------------------------
            while (!operStack.Peek().IsBottomOfOperStack())
            {
                PopOperStack(operStack, varStack);
            }

            ProgNode value = varStack.Peek();

            value.EndingToken = token;

            return(value);
        }
Ejemplo n.º 19
0
        private ArgList GetArgList()
        {
            ArgList argList = null;

            if (parser.IsSkipLeftBracket())
            {
                argList = new ArgList();

                if (!parser.IsSkipRightBracket())
                {
                    ProgNode argument = null;

                    do
                    {
                        argument = Expression();
                        argList.Add(argument);
                    } while (!argument.EndingToken.IsRightBacket());
                }
            }

            return(argList);
        }
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                return;
            }
            var input = new AntlrFileStream(args[0]);
            var lexer = new CoolLexer(input);

            var tokens = new CommonTokenStream(lexer);
            var parser = new CoolParser(tokens);

            var tree = parser.program();

            Context_to_AST astbuilder = new Context_to_AST();
            ProgNode       program    = astbuilder.VisitProgram(tree) as ProgNode;

            var scope = new Scope();

            Console.WriteLine(CheckSemantic(program, scope));
            Console.WriteLine("\n");

            var code_visitor = new CodeGenVisitor(program, scope);
            var code         = code_visitor.GetIntermediateCode();

            foreach (var line in code)
            {
                Console.WriteLine(line);
            }

            MIPSCodeGenerator generator = new MIPSCodeGenerator();
            var mips = generator.GenerateCode(code);

            Console.WriteLine(mips);

            File.WriteAllText("result.mips", mips);
        }
Ejemplo n.º 21
0
        public ProgNode GetCommand()
        {
            ProgNode node = null;

            string variable = parser.GetToken().GetString();
            string keyword  = variable.ToUpper();

            ProgCmd command = parser.GetProgCmd(keyword);

            if (command != null)
            {
                node = command.Interpret(this);
            }
            else
            {
                Token assignToken = parser.GetToken();

                ProgNode expression = Expression();

                node = new ProgNodeAssign(variable, expression);
            }

            return(node);
        }
Ejemplo n.º 22
0
        /************************/
        /*** Public Functions ***/
        /************************/

        public void Delcare(Token variable, SymbolTableRecType type, ProgNode size, ProgNode initialize)
        {
            string name = variable.GetString();

            variables.Add(new Declaration(name, type, size, initialize));
        }
Ejemplo n.º 23
0
        /*******************/
        /*** Constructor ***/
        /*******************/

        public ProgNodeDivide(ProgNode leftExp, ProgNode rightExp)
            : base(leftExp, rightExp)
        {
        }
Ejemplo n.º 24
0
 public ProgNodePower(ProgNode leftExp, ProgNode rightExp)
     : base(leftExp, rightExp)
 {
 }
Ejemplo n.º 25
0
 internal abstract void Visit(ProgNode node);
Ejemplo n.º 26
0
 public ProgNodeAssign(string variable, ProgNode expression)
 {
     this.variable   = variable;
     this.expression = expression;
 }
Ejemplo n.º 27
0
        /*******************/
        /*** Constructor ***/
        /*******************/

        public ProgNodeMinus(ProgNode leftExp, ProgNode rightExp)
            : base(leftExp, rightExp)
        {
        }
        /*******************/
        /*** Constructor ***/
        /*******************/

        public ProgNodeMultiply(ProgNode leftExp, ProgNode rightExp)
            : base(leftExp, rightExp)
        {
        }
Ejemplo n.º 29
0
        /*******************/
        /*** Constructor ***/
        /*******************/

        public ProgNodeLogicalOper(TokenType type, ProgNode leftExp, ProgNode rightExp)
            : base(leftExp, rightExp)
        {
            this.type = type;
        }
Ejemplo n.º 30
0
 public void Visit(ProgNode node)
 {
     //queda pasar los scope
     node.classes.ForEach(x => x.Accept(new SemanticVisit(errors, x.Scope)));
 }