private TranslatorRetval TranslateLine(string line, bool requireLineNumber)
        {
            TokenParser parser = new TokenParser {
                InputString = line
            };
            TranslatorRetval retval = new TranslatorRetval();

            parser.SkipWhiteSpace();
            Token token = parser.GetToken();

            while (token != null)
            {
                parser.SkipWhiteSpace();

                if (requireLineNumber)
                {
                    if (token.TokenName != TokenParser.Tokens.LINENUMBER)
                    {
                        retval.HasErrors    = true;
                        retval.ErrorMessage = "Missing Line Number!";
                        return(retval);
                    }

                    Output = Output + "ln" + token.TokenValue + " nop" + _crLf;

                    parser.SkipWhiteSpace();
                    token = parser.GetToken();
                    parser.SkipWhiteSpace();
                }

                if (token.TokenName == TokenParser.Tokens.CLS)
                {
                    Output = Output + " call funcCLS" + _crLf;

                    AddFunction(Functions.FuncCls);
                }

                if (token.TokenName == TokenParser.Tokens.BREAK)
                {
                    Output = Output + " brk" + _crLf;
                }

                if (token.TokenName == TokenParser.Tokens.PRINT || token.TokenName == TokenParser.Tokens.PRINTSTR)
                {
                    parser.SkipWhiteSpace();

                    string exp = parser.GetStringExpression();
                }

                parser.SkipWhiteSpace();
                token = parser.GetToken();
                parser.SkipWhiteSpace();
            }

            return(retval);
        }
        public TranslatorRetval Translate(string program)
        {
            int lineNumber          = 1;
            TranslatorRetval retval = new TranslatorRetval();

            program = program + _crLf;
            _functions.Clear();

            AddFunction(Functions.FuncInit);
            StartInitCode();

            string[] lines = program.Replace('\r', '\n').Replace("\n\n", "\n").Split('\n');

            Output = Output + "TheBasicStart nop" + _crLf;

            foreach (string line in lines)
            {
                if (string.IsNullOrEmpty(line) || string.IsNullOrEmpty(line.Trim()))
                {
                    lineNumber++;
                    continue;
                }
                TranslatorRetval lineRetval = TranslateLine(line, true);
                if (lineRetval.HasErrors)
                {
                    retval.HasErrors       = true;
                    retval.ErrorLineNumber = lineNumber;
                    retval.ErrorMessage    = retval.ErrorMessage;

                    return(retval);
                }

                lineNumber++;
            }

            Output = Output + " jmp TheBasicEnd" + _crLf;
            Output = Output + _functions.Aggregate("", (current, ss) => current + Routines.GetRoutine(ss));
            Output = Output + "TheBasicEnd end TheBasicStart";
            return(retval);
        }