Пример #1
0
        static void Test1()
        {
            Compiler      c     = new Compiler();
            List <string> lVars = new List <string>();

            lVars.Add("var int x;");
            List <VarDeclaration> vars = c.ParseVarDeclarations(lVars);

            string       s          = "let x = 5;";
            List <Token> lTokens    = c.Tokenize(s, 0);
            LetStatement assignment = c.ParseStatement(lTokens);

            if (assignment.ToString() != s)
            {
                Console.WriteLine("BUGBUG");
            }


            List <LetStatement> l = new List <LetStatement>();

            l.Add(assignment);
            List <string> lAssembly = c.GenerateCode(l, vars);
            CPUEmulator   cpu       = new CPUEmulator();

            InitLCL(lAssembly);
            cpu.Code = lAssembly;
            cpu.Run(1000, false);
            if (cpu.M[20] != 5)
            {
                Console.WriteLine("BUGBUG");
            }
        }
Пример #2
0
        public List <LetStatement> SimplifyExpressions(LetStatement s, List <VarDeclaration> lVars)
        {
            List <LetStatement> letStatements = new List <LetStatement>();

            //LetStatement temp = s;
            //add here code to simply expressins in a statement.
            //add var declarations for artificial variables.


            if (s.Value is NumericExpression || s.Value is VariableExpression)
            {
                letStatements.Add(s);
            }
            else if (s.Value is BinaryOperationExpression)
            {
                if (((BinaryOperationExpression)s.Value).Operand1 is BinaryOperationExpression)
                {
                    VarDeclaration var_dec = new VarDeclaration("int", "_" + (lVars.Count + 1));
                    lVars.Add(var_dec);
                    LetStatement left_let_statement = new LetStatement();
                    left_let_statement.Variable = var_dec.Name;
                    left_let_statement.Value    = ((BinaryOperationExpression)s.Value).Operand1;

                    VariableExpression _var = new VariableExpression();
                    _var.Name = var_dec.Name;
                    ((BinaryOperationExpression)s.Value).Operand1 = _var;
                    letStatements.AddRange(SimplifyExpressions(left_let_statement, lVars));
                }


                if (((BinaryOperationExpression)s.Value).Operand2 is BinaryOperationExpression)
                {
                    VarDeclaration var_dec = new VarDeclaration("int", "_" + (lVars.Count + 1));
                    lVars.Add(var_dec);
                    LetStatement left_let_statement = new LetStatement();
                    left_let_statement.Variable = var_dec.Name;
                    left_let_statement.Value    = ((BinaryOperationExpression)s.Value).Operand2;



                    VariableExpression _var = new VariableExpression();
                    _var.Name = var_dec.Name;
                    ((BinaryOperationExpression)s.Value).Operand2 = _var;
                    letStatements.AddRange(SimplifyExpressions(left_let_statement, lVars));
                }
                Console.WriteLine("" + s.ToString());
                letStatements.Add(s);
            }
            return(letStatements);
        }