private void GenStmt(stmt stmt) { if (stmt is sequence) { sequence seq = (sequence)stmt; this.GenStmt(seq.first); this.GenStmt(seq.second); } else if (stmt is DeclareS) { // declare a local counting++; DeclareS declare = (DeclareS)stmt; this.symbolTable[declare.Ident] = il.DeclareLocal(TypeOfExpr(declare.Expr)); // set the initial value assign assign = new assign(); assign.Ident = declare.Ident; assign.Expr = declare.Expr; this.GenStmt(assign); } else if (stmt is assign) { counting++; assign assign = (assign)stmt; counters = 0; this.GenExpr(assign.Expr, this.TypeOfExpr(assign.Expr)); this.Store(assign.Ident, this.TypeOfExpr(assign.Expr)); } else if (stmt is display) { // the "display" statement is an alias for System.Console.WriteLine. // it uses the string case counting++; this.GenExpr(((display)stmt).Expr, typeof(string)); this.il.Emit(Emit.OpCodes.Call, typeof(System.Console).GetMethod("WriteLine", new System.Type[] { typeof(string) })); } else if (stmt is Just_Declare) { counting++; Just_Declare declare = (Just_Declare)stmt; this.symbolTable[declare.Ident] = this.il.DeclareLocal(typeof(int)); //this.Store(declare.Ident, typeof(int)); } else if (stmt is acquire) { counting++; this.il.Emit(Emit.OpCodes.Call, typeof(System.Console).GetMethod("ReadLine", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static, null, new System.Type[] { }, null)); this.il.Emit(Emit.OpCodes.Call, typeof(int).GetMethod("Parse", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static, null, new System.Type[] { typeof(string) }, null)); this.Store(((acquire)stmt).Ident, typeof(int)); // stores the identifier in stack } else { throw new System.Exception("don't know how to gen a " + stmt.GetType().Name); } }
private stmt ParseStmt() { stmt result; #region newline linecount(); #endregion if (index < tokens.Count - 1) { #region DISPLAY if (index != tokens.Count - 1 && tokens[index].ToString().Equals("display")) { // linecount(); // ////MessageBox.Show("i am in display"); display Display = new display(); index++; linecount(); Display.Expr = ParsExpr("blah"); if (Display.Expr is StringLiteral || Display.Expr is Variable) { if (Display.Expr is Variable) { //MessageBox.Show(tokens[index - 1].ToString()); if (!identifier.identity.Contains(tokens[index - 1].ToString())) { adderror("undeclared identifier"); linecount(); // index++; } else if (identifier.assignment[identifier.identity.IndexOf(tokens[index - 1].ToString())] == false) { adderror(tokens[index - 1].ToString() + " : unassigned"); linecount(); // index++; } } if (!tokens[index].Equals(scanner.opend.endline)) { adderror("Expected Endline Character"); index--; } //else //{ index++; linecount(); //} result = Display; // ////MessageBox.Show(tokens[index].ToString()); } else { result = null; adderror("expected Variable or Display Statement"); index++; linecount(); if (!tokens[index].Equals(scanner.opend.endline)) { adderror("Expected Endline Character"); index--; //index++; } } counts++; } #endregion #region For vs and cs and register and int else if (tokens[index].ToString().Equals("vs") || tokens[index].ToString().Equals("cs") || tokens[index].ToString().Equals("register") || tokens[index].ToString().Equals("int") || tokens[index].ToString().Equals("string")) { string dose = tokens[index].ToString(); index++; linecount(); DeclareS sources = new DeclareS(); if (!(index < tokens.Count && tokens[index] is string)) { adderror("expected variable name"); index++; linecount(); } else if (identifier.identity.Contains(tokens[index].ToString())) { adderror(tokens[index].ToString() + " : redefinition"); index++; linecount(); } else { sources.Ident = tokens[index].ToString(); } index++; linecount(); if ((index == tokens.Count) || (!(tokens[index].Equals((object)scanner.opend.equal)) && !(tokens[index].Equals(scanner.opend.endline)))) { //////MessageBox.Show(tokens[index].ToString()); adderror("Expected #/="); // index++; } #region var identifier if (tokens[index].Equals((object)scanner.opend.endline)) { Just_Declare classy = new Just_Declare(); classy.Ident = tokens[index - 1].ToString(); if (identifier.identity.Contains(tokens[index - 1].ToString())) { adderror(tokens[index - 1].ToString() + " : redefinition"); index++; linecount(); } identifier.identity.Add(classy.Ident.ToString()); identifier.assignment.Add(false); result = classy; index++; linecount(); } #endregion else { index++; linecount(); sources.Expr = ParsExpr("blah"); if (dose == "string") { //MessageBox.Show("hello world"); if (!(sources.Expr is StringLiteral)) { adderror("expected string type"); index++; sources = null; } else { //MessageBox.Show("lala"); identifier.identity.Add(sources.Ident.ToString()); identifier.assignment.Add(true); MessageBox.Show("haha"); //index++; MessageBox.Show(tokens[index].ToString()); } if (!tokens[index].Equals(scanner.opend.endline)) { //////MessageBox.Show(tokens[index].ToString()); adderror("Exepected Endline Character"); index--; } index++; linecount(); result = sources; } else { if (sources.Expr is StringLiteral) { adderror("expected variable or integer after '=' "); //index++; } else if (sources.Expr is Variable) { if (!identifier.identity.Contains(tokens[index - 1].ToString())) { //////MessageBox.Show(); adderror(tokens[index - 1].ToString() + " undeclared identifier"); // index++; } else if (identifier.assignment[identifier.identity.IndexOf(tokens[index - 1].ToString())] == false) { adderror(tokens[index - 1].ToString() + " : unassigned"); // index++; } } identifier.identity.Add(sources.Ident.ToString()); identifier.assignment.Add(true); if (!tokens[index].Equals(scanner.opend.endline)) { //////MessageBox.Show(tokens[index].ToString()); adderror("Exepected Endline Character"); index--; } index++; linecount(); result = sources; } } counts++; } #endregion #region for Acquire else if (tokens[index].ToString().Equals("acquire")) { index++; linecount(); acquire acquire = new acquire(); if (index < tokens.Count && tokens[index] is string) { acquire.Ident = tokens[index].ToString(); ////MessageBox.Show(tokens[index].ToString()); if (!identifier.identity.Contains(acquire.Ident.ToString())) { adderror("Expected declared Identifier"); //index++; } result = acquire; identifier.assignment[identifier.identity.IndexOf(tokens[index].ToString())] = true; index++; if (!tokens[index].Equals(scanner.opend.endline)) { adderror("Expected Endline Character"); index--; //index++; } linecount(); } else { result = null; adderror("Expected Identifier"); } index++; linecount(); counts++; } #endregion #region If and If Else else if (tokens[index].ToString().Equals("if")) { bool ife = false; index++; linecount(); ifS ifs = new ifS(); ifElse ifelse = new ifElse(); ifs.Cond = ParseCond(); if (ifs.Cond is IntLiteral || ifs.Cond is Something || ifs.Cond is Variable) { adderror("Expected Conditional Statement"); //index++; } //index++; if (index == tokens.Count || !(tokens[index].ToString().Equals("do"))) { adderror("Expected do"); index--; } index++; linecount(); ifs.Body = ParseStmt(); // ////MessageBox.Show(tokens[index].ToString() + " b4 else"); //index++; #region ifelse if (tokens[index].ToString().Equals("else")) { index++; linecount(); ifelse.ifEverything = ifs; if (index == tokens.Count || !(tokens[index].ToString().Equals("do"))) { adderror("Expected do"); index--; } index++; linecount(); ifelse.bodyelse = ParseStmt(); //index++; if (index == tokens.Count || !(tokens[index].ToString().Equals("endelse"))) { adderror("unterminated 'if else' body"); //index++; } ife = true; } #endregion else if (index == tokens.Count || !(tokens[index].ToString().Equals("endif"))) { result = null; adderror("unterminated 'if' body"); index++; } if (!ife) { index++; linecount(); if (index == tokens.Count || !(tokens[index].Equals((object)scanner.opend.endline))) { result = null; adderror("Expected endline character #"); index--; } else { result = ifs; } } else { index++; linecount(); if (index == tokens.Count || !(tokens[index].Equals((object)scanner.opend.endline))) { result = null; adderror("Expected endline character #"); index--; } else { result = ifelse; } } index++; linecount(); counts++; } #endregion #region While loop else if (tokens[index].ToString().Equals("while")) { index++; linecount(); whileLoop whilel = new whileLoop(); whilel.cond = ParseCond(); ////MessageBox.Show(tokens[index].ToString()); //index++; if (index == tokens.Count || !(tokens[index].ToString().Equals("do"))) { ////MessageBox.Show(tokens[index].ToString()); adderror("Expected do"); index--; } index++; linecount(); //////MessageBox.Show(tokens[index].ToString()); whilel.body = ParseStmt(); ////MessageBox.Show(tokens[index].ToString()); //index++; if (index == tokens.Count || !(tokens[index].ToString().Equals("endwhile"))) { adderror("unterminated 'while' loop body"); } index++; linecount(); if (index == tokens.Count || !(tokens[index].Equals((object)scanner.opend.endline))) { adderror("Expected endline #"); index--; } result = whilel; index++; linecount(); counts++; ////MessageBox.Show(tokens[index].ToString()+" in while"); } #endregion #region Assignment else if (tokens[index] is string) { assign assign = new assign(); if (!identifier.identity.Contains(tokens[index].ToString())) { adderror(tokens[index] + " undeclared identifier"); } assign.Ident = tokens[index].ToString(); index++; linecount(); if (tokens.Count == index || !(tokens[index].Equals((object)scanner.opend.equal))) { adderror("expected '='"); } index++; linecount(); assign.Expr = ParsExpr("blah"); if (assign.Expr is StringLiteral) { adderror("Expected integer/variable"); } else if (assign.Expr is Variable) { if (!identifier.identity.Contains(tokens[index - 1].ToString())) { adderror(tokens[index - 1] + " : undeclared identifier"); } else if (identifier.assignment[identifier.identity.IndexOf(tokens[index - 1].ToString())] == false) { adderror(tokens[index - 1].ToString() + " : unassigned"); } } result = assign; if (index < tokens.Count) { if (tokens[index].ToString().Equals("#")) { adderror("Expected EndLine Character"); index--; } } //index++; counts++; } #endregion #region Invalid Statement else { linecount(); adderror("parse error at token " + index + ": " + tokens[index]); result = ParseStmt(); } #endregion #region statement list //MessageBox.Show("b4 stmt_list"); if ((index < tokens.Count) && (!(tokens[index].ToString().Equals("end")))) { // index++; if (((!tokens[index].ToString().Equals("endwhile") && !tokens[index].ToString().Equals("endif"))) && (!tokens[index].ToString().Equals("endelse") && !tokens[index].ToString().Equals("else"))) { //MessageBox.Show("i m in stmt_list"); linecount(); //MessageBox.Show(tokens[index ].ToString()); sequence seq = new sequence(); seq.first = result; seq.second = ParseStmt(); result = seq; } } //} #endregion return(result); } else { return(null); } }