public void IntExp(IntExp e) { switch (e.Value) { case 0: il.Emit(OpCodes.Ldc_I4_0); break; case 1: il.Emit(OpCodes.Ldc_I4_1); break; case 2: il.Emit(OpCodes.Ldc_I4_2); break; case 3: il.Emit(OpCodes.Ldc_I4_3); break; case 4: il.Emit(OpCodes.Ldc_I4_4); break; case 5: il.Emit(OpCodes.Ldc_I4_5); break; case 6: il.Emit(OpCodes.Ldc_I4_6); break; case 7: il.Emit(OpCodes.Ldc_I4_7); break; case 8: il.Emit(OpCodes.Ldc_I4_8); break; default: if (e.Value > -128 && e.Value < 127) { il.Emit(OpCodes.Ldc_I4_S, (byte)e.Value); } else if (e.Value > Int32.MinValue && e.Value < Int32.MaxValue) { il.Emit(OpCodes.Ldc_I4, (int)e.Value); } else { il.Emit(OpCodes.Ldc_I8, e.Value); } break; } }
Exp MatchExp() { AlphaToken at; Object o1; switch (((Token)tokens.Peek()).Type) { case TokenType.NIL: tokens.Dequeue(); return(new StringExp(String.Empty)); //NIL is represented as an empty string case TokenType.NUMBER: return(new IntExp(((NumberToken)tokens.Dequeue()).Value)); case TokenType.STRING: return(new StringExp(((StringToken)tokens.Dequeue()).Value)); case TokenType.ALPHA: at = (AlphaToken)tokens.Dequeue(); if (DoVars != null && DoVars.Count != 0) { o1 = DoVars[at.Name]; if (o1 != null) { return(new DoVarExp(at.Name, (int)o1)); } } if (CurrentVarScope != null && CurrentVarScope.Count != 0) { o1 = CurrentVarScope[at.Name]; if (o1 != null) { return(new VarExp(at.Name, (int)o1)); } } o1 = GlobalVars[at.Name]; if (o1 != null) { return(new GlobalVarExp(at.Name)); } Console.WriteLine("Error 6: Undefined Symbol " + at.Name); return(null); case TokenType.LPAREN: MatchToken(TokenType.LPAREN); Exp e1, e2, e3; Exp [] ea; //ListExp el1, el2, el3; Token o; switch (((Token)tokens.Peek()).Type) { case TokenType.PLUS: case TokenType.MINUS: case TokenType.MUL: case TokenType.DIVIDE: o = (Token)tokens.Dequeue(); e1 = MatchExp(); e2 = MatchExp(); MatchToken(TokenType.RPAREN); return(new BinopExp(e1, o, e2)); case TokenType.LT: case TokenType.GT: case TokenType.EQ: case TokenType.LE: case TokenType.GE: o = (Token)tokens.Dequeue(); e1 = MatchExp(); e2 = MatchExp(); MatchToken(TokenType.RPAREN); return(new CompareExp(e1, o, e2)); case TokenType.CDR: tokens.Dequeue(); e1 = MatchExp(); MatchToken(TokenType.RPAREN); ea = new Exp[1]; ea[0] = e1; return(new CallExp("LispRuntime", "Cdr", ea, typeof(CList))); case TokenType.CAR: tokens.Dequeue(); e1 = MatchExp(); MatchToken(TokenType.RPAREN); return(new CarExp(e1)); case TokenType.CONS: tokens.Dequeue(); e1 = MatchExp(); e2 = MatchExp(); MatchToken(TokenType.RPAREN); ea = new Exp[2]; ea[0] = e1; ea[1] = e2; return(new CallExp("LispRuntime", "Cons", ea, typeof(CList))); case TokenType.SUBST: tokens.Dequeue(); e1 = MatchExp(); e2 = MatchExp(); e3 = MatchExp(); MatchToken(TokenType.RPAREN); ea = new Exp[3]; ea[0] = e1; ea[1] = e2; ea[2] = e3; return(new CallExp("LispRuntime", "Subst", ea, typeof(CList))); case TokenType.NULL: tokens.Dequeue(); e1 = MatchExp(); MatchToken(TokenType.RPAREN); ea = new Exp[1]; ea[0] = e1; return(new CallExp("LispRuntime", "IsNull", ea, typeof(bool))); case TokenType.ATOM: tokens.Dequeue(); e1 = MatchExp(); MatchToken(TokenType.RPAREN); ea = new Exp[1]; ea[0] = e1; return(new CallExp("LispRuntime", "IsAtom", ea, typeof(bool))); case TokenType.IF: tokens.Dequeue(); e1 = MatchExp(); e2 = MatchExp(); e3 = MatchExp(); MatchToken(TokenType.RPAREN); return(new IfExp(e1, e2, e3)); case TokenType.DO: tokens.Dequeue(); MatchToken(TokenType.LPAREN); ExpList el1, el2; if (CurrentVarScope == null) { Console.WriteLine("Error 13: Do must be present in a Function"); success = false; return(null); } el1 = MatchDoExpList(); MatchToken(TokenType.RPAREN); //MatchToken(TokenType.LPAREN); el2 = MatchDoCondList(); MatchToken(TokenType.RPAREN); return(new DoExp(el1, el2)); case TokenType.SETQ: tokens.Dequeue(); AlphaToken t1 = (AlphaToken)MatchToken(TokenType.ALPHA); if (((Token)tokens.Peek()).Type == TokenType.NUMBER) { e1 = new IntExp(((NumberToken)tokens.Dequeue()).Value); } else { e1 = MatchExp(); } GlobalVars.Add(t1.Name, typeof(int)); MatchToken(TokenType.RPAREN); return(new GlobalVarDef(t1.Name, e1)); case TokenType.DEFUN: ArrayList param = new ArrayList(); int count = 0; if (CurrentVarScope != null) { Console.WriteLine("Error 12: Nested Functions Not Allowed"); success = false; return(null); } CurrentVarScope = new Hashtable(); DoVars = new Hashtable(); DoVarsCount = 0; tokens.Dequeue(); AlphaToken t = (AlphaToken)MatchToken(TokenType.ALPHA); MatchToken(TokenType.LPAREN); while (((Token)tokens.Peek()).Type == TokenType.ALPHA) { param.Add(((AlphaToken)tokens.Dequeue()).Name); CurrentVarScope.Add(param[count], count++); } MatchToken(TokenType.RPAREN); //CurrentVarScope = param; Functions.Add(t.Name, count); e1 = MatchExp(); CurrentVarScope = null; MatchToken(TokenType.RPAREN); return(new FunctionDef(t.Name, param, e1)); case TokenType.ALPHA: at = (AlphaToken)tokens.Dequeue(); int iparams; if (Functions == null || Functions.Count == 0) { Console.WriteLine("Error 6: Undefined Symbol " + at.Name); return(null); } else { o1 = Functions[at.Name]; if (o1 == null) { Console.WriteLine("Error 6: Undefined Symbol " + at.Name); return(null); } else { iparams = (int)o1; } } Exp [] eparams = new Exp[iparams]; for (int i = 0; i < iparams; i++) { eparams[i] = MatchExp(); } MatchToken(TokenType.RPAREN); return(new CallExp(null, at.Name, eparams)); default: o = null; Console.WriteLine("Error 1"); success = false; return(null); } default: Console.WriteLine("Error 7: Unexpected Token"); tokens.Dequeue(); success = false; return(null); } }
public void IntExp(IntExp e) { e.ExpType = typeof(int); }