namespace NTERA.Interpreter { public partial class Interpreter { private void If() { bool result = Expr().BinOp(new Value(0), Token.Equal).Real == 1; Match(Token.Then); GetNextToken(); if (result) { int i = ifcounter; while (true) { if (lastToken == Token.If) { i++; } else if (lastToken == Token.Else) { if (i == ifcounter) { GetNextToken(); return; } } else if (lastToken == Token.EndIf) { if(i == ifcounter) { GetNextToken(); return; } i--; } GetNextToken(); } } } private void Else() { int i = ifcounter; while (true) { if (lastToken == Token.If) { i++; } else if (lastToken == Token.EndIf) { if(i == ifcounter) { GetNextToken(); return; } i--; } GetNextToken (); } } private void End() { exit = true; } private void Let() { if (lastToken != Token.Equal) { Match(Token.Identifer); GetNextToken(); Match(Token.Equal); } string id = lex.Identifer; GetNextToken(); SetVar(id, Expr()); } private void For() { Match(Token.Identifer); string var = lex.Identifer; GetNextToken(); Match(Token.Equal); GetNextToken(); Value v = Expr(); if (loops.ContainsKey(var)) { loops[var] = lineMarker; } else { SetVar(var, v); loops.Add(var, lineMarker); } Match(Token.To); GetNextToken(); v = Expr(); if (vars[var].BinOp(v, Token.More).Real == 1) { while (true) { while (!(GetNextToken() == Token.Identifer && prevToken == Token.Next)) ; if (lex.Identifer == var) { loops.Remove(var); GetNextToken(); Match(Token.NewLine); break; } } } } private void Next() { Match(Token.Identifer); string var = lex.Identifer; vars[var] = vars[var].BinOp(new Value(1), Token.Plus); lex.GoTo(new Marker(loops[var].Pointer - 1, loops[var].Line, loops[var].Column - 1)); lastToken = Token.NewLine; } } }