123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- 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;
- }
- }
- }
|