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"); } }
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); }