private void CodeRead(ReadStatement readStatement, List<LocalVariable> locals, List<GlobalVariable> globals, FuncParam[] parameters, ILGenerator il) { il.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine", new Type[0])); il.Emit(OpCodes.Call, typeof(Convert).GetMethod("ToInt32", new Type[]{typeof(string)})); var vname = GetVariableName(readStatement); if (locals.Any(x => x.Name == vname)) { var loc = locals.First(x => x.Name == vname); il.Emit(OpCodes.Stloc, loc.Info); } else if (globals.Any(x => x.Name == vname)) { var glo = globals.First(x => x.Name == vname); il.Emit(OpCodes.Stsfld, glo.FieldInfo); } else { var par = parameters.First(x => x.Name == vname); il.Emit(OpCodes.Starg_S, (byte)par.Index); } }
private Statement Smth() { Statement st = null; if (_la == Terminals.Id || _la == Terminals.Num || _la == Terminals.LPar || _la == Terminals.Minus || _la == Terminals.Inv) { st = Expr(); Expect(Terminals.Semicolon); } else if (_la == Terminals.Return) { Get(); var r = Expr(); Expect(Terminals.Semicolon); st = new ReturnStatement(r); } else if (_la == Terminals.Read) { Get(); var v = Expect(Terminals.Id) as Id; Expect(Terminals.Semicolon); st = new ReadStatement(v); } else if (_la == Terminals.Write) { Get(); var r = Expr(); Expect(Terminals.Semicolon); st = new WriteStatement(r); } else if (_la == Terminals.Writeln) { Get(); Expect(Terminals.Semicolon); st = new WritelnStatement(); } else if (_la == Terminals.Break) { Get(); Expect(Terminals.Semicolon); st = new BreakStatement(); } else if (_la == Terminals.If) { Get(); Expect(Terminals.LPar); var c = Expr(); Expect(Terminals.RPar); var t = Smth(); Expect(Terminals.Else); var f = Smth(); st = new IfStatement(c, t, f); } else if (_la == Terminals.While) { Get(); Expect(Terminals.LPar); var c = Expr(); Expect(Terminals.RPar); var s = Smth(); st = new WhileStatement(c, s); } else if (_la == Terminals.Start) { st = Block(); } else SynErr(37); return st; }