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) { // using (arg1, arg2, arg3) { } sourceCode += 5; if (!sourceCode.SeekToNext('(')) { sourceCode.Throw("Expected ("); } // Build up the arguments. Dictionary<string, List<Token>> items = new Dictionary<string, List<Token>>(); while (sourceCode.CurrentCode != ')') { string name = sourceCode.NextWord(); if (sourceCode.CurrentCode != '=') { sourceCode.Throw(String.Format("Unexpected character, {0}.", sourceCode.CurrentCode)); } // Otherwise... List<Token> code = engine.BuildTokens(ref sourceCode, ref script, new char[] {',', ')'}); items.Add(name, code); } if (!sourceCode.SeekToNext('{')) { sourceCode.Throw(String.Format("Unexpected character, {0}", sourceCode.NextCode)); } List<List<List<Token>>> codeBlock = engine.BuildLongTokens(ref sourceCode, ref script, new char[] {'}'}); return new UsingToken(items, codeBlock); }
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); }
public override Token Build(Token lastToken, ScriptEngine engine, Script script, ref SourceCode sourceCode) { List<List<List<Token>>> code = engine.BuildLongTokens(ref sourceCode, ref script, new[] {'}'}); return new CodeBlockToken(code); }
public override Token Build(Token lastToken, ScriptEngine engine, Script script, ref SourceCode sourceCode) { sourceCode += 8; // Skip past function // Pattern // function functionName(args) { code } string functionName = ""; var argumentNames = new List<string>(); // Build the name first. while (sourceCode.SpecialChar) { sourceCode++; } bool space = false; while (sourceCode.CurrentCode != '(') { if (sourceCode.CurrentCode == ' ') { space = true; } else { if (space) { sourceCode.Throw("Unexpected Whitespace"); } functionName += sourceCode.CurrentCode; } sourceCode++; } // Build up arguments now. sourceCode++; space = false; string arg = ""; while (sourceCode.CurrentCode != ')') { char c = sourceCode.CurrentCode; if (c == ',') { if (string.IsNullOrEmpty(arg)) { sourceCode.Throw("Expected an argument."); } else { argumentNames.Add(arg); space = false; arg = ""; } } else { if (char.IsWhiteSpace(c) && !string.IsNullOrEmpty(arg)) { space = true; } else { if (space) { sourceCode.Throw("Unexpected whitespace"); } else if (char.IsWhiteSpace(c)) { // Do nothing... } else { arg += sourceCode.CurrentCode; } } } sourceCode++; } if (string.IsNullOrEmpty(arg)) { sourceCode.Throw("Expected an argument."); } argumentNames.Add(arg); bool result = sourceCode.SeekToNext('{'); List<List<List<Token>>> code = engine.BuildLongTokens(ref sourceCode, ref script, new[] {'}'}); return new FunctionToken(functionName, argumentNames, code); }
public override void Build(ref SourceCode code, ref Script script, ScriptEngine engine, ConfigBuilder config) { string id = ""; code += _identifier.Length; if (code.Peek() == '{' && _requiresID) { throw new Exception("Script block requires an ID."); } if (code.Peek() != '{') { code.SeekToNext('"'); while (!(++code).EOF && code.CurrentCode != '"') { id += code.CurrentCode; } if (code.EOF) { code.Throw("Unexpected EOF"); } } code.SeekToNext('{'); var c = new Code(engine.BuildLongTokens(ref code, ref script, new[] {'}'}), new Script(engine) {UseEngineGlobals = false}); config.AddReturnElement(_identifier, new ScriptBlock {Code = c, Identifier = id}); }