public override Token Build(Token lastToken, ScriptEngine engine, Script script, ref SourceCode sourceCode) { // if (condition) { ... } [else [if (condition) { ... }] { ... }] var ifStatement = new Statement(); sourceCode.SeekToNext('('); ifStatement.Condition = engine.BuildTokensAdvanced(ref sourceCode, ref script, new[] {')'}); sourceCode++; sourceCode.SeekToNext('{'); ifStatement.Code = engine.BuildLongTokens(ref sourceCode, ref script, new[] {'}'}); sourceCode++; var elseIfStatements = new List<Statement>(); Statement elseStatement = null; while ((++sourceCode).Peek() == 'e') { bool isElseIf = false; sourceCode.SeekToNext('e'); sourceCode += 4; var s = new Statement(); if (sourceCode.Peek() == 'i') { isElseIf = true; // Get the condition; sourceCode.SeekToNext('i'); sourceCode++; sourceCode.SeekToNext('('); s.Condition = engine.BuildTokensAdvanced(ref sourceCode, ref script, new[] {')'}); sourceCode++; } sourceCode.SeekToNext('{'); s.Code = engine.BuildLongTokens(ref sourceCode, ref script, new[] {'}'}); sourceCode++; if (isElseIf) { elseIfStatements.Add(s); } else { elseStatement = s; } } return new IfToken(ifStatement, elseIfStatements, elseStatement); }
public override Token Build(Token lastToken, ScriptEngine engine, Script script, ref SourceCode sourceCode) { while ((++sourceCode).SpecialChar) { } if (sourceCode.Peek() != '{') { sourceCode.Throw(String.Format("Error parsing a 'do' statement, expected a '{' but got '{0}' instead.", sourceCode.Peek())); } List<List<List<Token>>> code = engine.BuildLongTokens(ref sourceCode, ref script, new[] {'}'}); if (!sourceCode.SeekToNext("while")) { sourceCode.Throw("Error parsing a 'do' statement, was expecting a 'while' after the { } block."); } if (!sourceCode.SeekToNext('(')) { sourceCode.Throw("Error parsing a 'do' statement, was expecting a '(' after 'while'."); } List<List<Token>> exitCondition = engine.BuildTokensAdvanced(ref sourceCode, ref script, new[] {')'}); return new DoWhileToken(code, exitCondition); }
public override Token Build(Token lastToken, ScriptEngine engine, Script script, ref SourceCode sourceCode) { // while (condition) { /* Code */ } sourceCode += 4; // The +1 comes from below. while ((++sourceCode).SpecialChar) { } if (sourceCode.CurrentCode != '(') { sourceCode.Throw("Error parsing a 'while' statement, was epexting a '(' after 'while'."); } List<List<Token>> exitCondition = engine.BuildTokensAdvanced(ref sourceCode, ref script, new[] {')'}); if (!sourceCode.SeekToNext('{')) { sourceCode.Throw(String.Format("Unexpected char: '{0}'", sourceCode.CurrentCode)); } List<List<List<Token>>> code = engine.BuildLongTokens(ref sourceCode, ref script, new[] {'}'}); return new WhileLoopToken(exitCondition, code); }
public override Token Build(Token lastToken, ScriptEngine engine, Script script, ref SourceCode sourceCode) { // for (init; condition; increment) { /* Code */ } sourceCode += 3; // Skip past the "for". while (char.IsWhiteSpace(sourceCode.CurrentCode)) { sourceCode++; // Offset until we reach a non-whitespace character. } if (sourceCode.CurrentCode != '(') { throw new Exception("Error parsing a 'for' statement, was expecting a '(' after 'for'"); } // Otherwise, moving along! List<List<Token>> forInit = engine.BuildTokensAdvanced(ref sourceCode, ref script, new[] {';'}); sourceCode++; // We can then build the exitCondition List<List<Token>> endCondition = engine.BuildTokensAdvanced(ref sourceCode, ref script, new[] {';'}); sourceCode++; // And then the increment condition. List<List<Token>> incrementStatement = engine.BuildTokensAdvanced(ref sourceCode, ref script, new[] {';', ')'}); if (!sourceCode.SeekToNext('{')) { throw new Exception("Unexpected char: " + sourceCode.CurrentCode); } List<List<List<Token>>> code = engine.BuildLongTokens(ref sourceCode, ref script, new[] {'}'}); sourceCode++; return new ForLoopToken(forInit, endCondition, incrementStatement, code); }