/// <summary> /// Go to next Token without checking the type /// </summary> public void Next() { if (Program != null) { // If Fininshed don't search if (Finished()) return; CurrentToken = Program[ProgramPosition]; ProgramPosition++; return; } }
/// <summary> /// Reset Paser to inital state /// </summary> public void Reset() { this.CurrentToken = new Token(this, ""); this.ProgramPosition = 0; Next(); }
/// <summary> /// Instantiate a new BASIC Parser /// </summary> /// <param name="Program">Program to parse</param> /// <param name="CustomTokens">Custom Tokens</param> public CodeParser(String SourceCode, KeywordTokenConstructor[] CustomTokens) { // Found variable names VariableNames = new ArrayList(); // Keyword tokens to search for KeywordTokens = new ArrayList(); // Let, Print KeywordTokens.Add(new KeywordTokenConstructor("let", delegate(CodeParser Parser, String Contents) { return new LetToken(Parser, Contents); } )); KeywordTokens.Add(new KeywordTokenConstructor("print", delegate(CodeParser Parser, String Contents) { return new PrintToken(Parser, Contents); })); // If-Then-Else KeywordTokens.Add(new KeywordTokenConstructor("if", delegate(CodeParser Parser, String Contents) { return new IfToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("then", delegate(CodeParser Parser, String Contents) { return new ThenToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("else", delegate(CodeParser Parser, String Contents) { return new ElseToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("endif", delegate(CodeParser Parser, String Contents) { return new EndIfToken(Parser, Contents); })); // While-Wend KeywordTokens.Add(new KeywordTokenConstructor("while", delegate(CodeParser Parser, String Contents) { return new WhileToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("wend", delegate(CodeParser Parser, String Contents) { return new WendToken(Parser, Contents); })); // For-Next KeywordTokens.Add(new KeywordTokenConstructor("for", delegate(CodeParser Parser, String Contents) { return new ForToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("to", delegate(CodeParser Parser, String Contents) { return new ToToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("step", delegate(CodeParser Parser, String Contents) { return new StepToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("next", delegate(CodeParser Parser, String Contents) { return new NextToken(Parser, Contents); })); // Goto, Gosub, Return KeywordTokens.Add(new KeywordTokenConstructor("goto", delegate(CodeParser Parser, String Contents) { return new GotoToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("gosub", delegate(CodeParser Parser, String Contents) { return new GosubToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("return", delegate(CodeParser Parser, String Contents) { return new ReturnToken(Parser, Contents); })); // End, Rem KeywordTokens.Add(new KeywordTokenConstructor("end", delegate(CodeParser Parser, String Contents) { return new EndToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("rem", delegate(CodeParser Parser, String Contents) { return new RemToken(Parser, Contents); })); // Sleep //KeywordTokens.Add(new KeywordTokenConstructor("sleep", delegate(CodeParser Parser, String Contents) { return new SleepToken(Parser, Contents); })); // Numeric functions KeywordTokens.Add(new KeywordTokenConstructor("int", delegate(CodeParser Parser, String Contents) { return new IntToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("cint", delegate(CodeParser Parser, String Contents) { return new CIntToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("rnd", delegate(CodeParser Parser, String Contents) { return new RndToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("randomize", delegate(CodeParser Parser, String Contents) { return new RandomizeToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("timer", delegate(CodeParser Parser, String Contents) { return new TimerToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("now", delegate(CodeParser Parser, String Contents) { return new NowToken(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("strpos", delegate(CodeParser Parser, String Contents) { return new StrPosToken(Parser, Contents); })); // String Functions KeywordTokens.Add(new KeywordTokenConstructor("chr$", delegate(CodeParser Parser, String Contents) { return new Chr__Token(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("toupper$", delegate(CodeParser Parser, String Contents) { return new ToUpper__Token(Parser, Contents); })); KeywordTokens.Add(new KeywordTokenConstructor("tolower$", delegate(CodeParser Parser, String Contents) { return new ToLower__Token(Parser, Contents); })); // IO Functions // Add custom tokens to token array if (CustomTokens != null) { foreach (KeywordTokenConstructor T in CustomTokens) { KeywordTokens.Add(T); } } // Store Program this.SourceCode = SourceCode; this.SourceCodeLower = SourceCode.ToLower(); // Tokenize the current program, increases speed ArrayList GetTokenizedProgram = new ArrayList(); // Keep parsing until end of program while (true) { // Increase sourcecode position SourceCodePosition = SourceCodeNextPosition; // Check if we've reached the end of the program if (((SourceCodePosition >= SourceCode.Length) || (SourceCode[SourceCodePosition] == (char)0) || (typeof(EndOfInputToken).Equals(CurrentToken.GetType())))) break; // Skip Whitespace while (((SourceCode[SourceCodePosition] == ' ') || (SourceCode[SourceCodePosition] == '\t'))) { SourceCodePosition++; // Stop at the end of the program if (SourceCodePosition == SourceCode.Length) { CurrentToken = new EndOfInputToken(this, ""); GetTokenizedProgram.Add(CurrentToken); break; } } // Fetch and Store Token CurrentToken = FindNextToken(ref GetTokenizedProgram); GetTokenizedProgram.Add(CurrentToken); } // Store Tokenized Program GetTokenizedProgram.Add(new EndOfInputToken(this,"")); Program = (Token[]) GetTokenizedProgram.ToArray(typeof(Token)); Reset(); }