示例#1
0
文件: Parser.cs 项目: Punk-Sky/PunkOS
        /// <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;
            }
        }
示例#2
0
文件: Parser.cs 项目: Punk-Sky/PunkOS
 /// <summary>
 /// Reset Paser to inital state
 /// </summary>
 public void Reset()
 {
     this.CurrentToken = new Token(this, "");
     this.ProgramPosition = 0;
     Next();
 }
示例#3
0
文件: Parser.cs 项目: Punk-Sky/PunkOS
        /// <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();
        }