public void Compile(string expression, int stringCounter, int loopCounter)
        {
            _hasLabel = false;
            ExpressionParserOutput output = new ExpressionParserOutput
            {
                StringCounter = stringCounter,
                LoopCounter   = loopCounter
            };

            Output = output;
            TokenParser parser = new TokenParser {
                InputString = expression
            };

            SkipWhiteSpace(parser);

            _token = parser.GetToken();
            SkipWhiteSpace(parser);
            Expression(parser);

            Output.Output = " push y" + Environment.NewLine + Output.Output + " pop y" + Environment.NewLine;

            //if (!_hasLabel)
            //{
            //    try
            //    {
            //        var native = new NativeExpressionParser();
            //        Output.Output = " push y" + Environment.NewLine + " ldx #" + native.Compile(expression) +
            //                        Environment.NewLine + " pop y" + Environment.NewLine;
            //    }
            //    catch
            //    {
            //        Output.Output = " push y" + Environment.NewLine + Output.Output + " pop y" + Environment.NewLine;
            //    }
            //}
            //else
            //{
            //    Output.Output = " push y" + Environment.NewLine + Output.Output + " pop y" + Environment.NewLine;
            //}
        }
        public void Compile(string expression, int stringCounter, int loopCounter)
        {
            var parser = new TokenParser();

            ExpressionParserOutput output = new ExpressionParserOutput
            {
                StringCounter = stringCounter,
                LoopCounter   = loopCounter
            };

            Output = output;

            parser.InputString = expression;

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

            Output.Output = Output.Output + " push y" + Environment.NewLine;
            Output.Output = Output.Output + " call allocatememory" + Environment.NewLine;
            Output.Output = Output.Output + " push x" + Environment.NewLine;
            Output.Output = Output.Output + " tfr x,y" + Environment.NewLine;

            while (token != null && token.TokenName != TokenParser.Tokens.NEWLINE)
            {
                SkipWhiteSpace(parser);

                if (token.TokenName == TokenParser.Tokens.PLUS)
                {
                    token = parser.GetToken();
                    continue;
                }

                if (token.TokenName == TokenParser.Tokens.STRING)
                {
                    if (token.TokenValue == "\"\"")
                    {
                        Output.InitCode = Output.InitCode + "st" + Output.StringCounter + " chr 0" + Environment.NewLine;
                    }
                    else
                    {
                        Output.InitCode = Output.InitCode + "st" + Output.StringCounter + " str " + token.TokenValue +
                                          Environment.NewLine;
                        Output.InitCode = Output.InitCode + " chr 0" + Environment.NewLine;
                    }

                    Output.Output = Output.Output + " ldx #st" + Output.StringCounter + Environment.NewLine;
                    Output.Output = Output.Output + " call copystring" + Environment.NewLine;

                    Output.StringCounter++;

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

                if (token.TokenName == TokenParser.Tokens.STRINGLABEL)
                {
                    SkipWhiteSpace(parser);
                    string varName = token.TokenValue.ToUpper().Replace("$", "");

                    if (parser.Peek() != null && parser.Peek().TokenPeek.TokenName == TokenParser.Tokens.LPAREN)
                    {
                        parser.GetToken();
                        string exp = GetNumericExpression(parser, true);

                        Output.Output = Output.Output + " push y" + Environment.NewLine;
                        Output.Output = Output.Output + ParseNumericExpression(exp).Output;
                        Output.Output = Output.Output + " tfr x,d" + Environment.NewLine;
                        Output.Output = Output.Output + " tfr b,a" + Environment.NewLine;
                        Output.Output = Output.Output + " ldx #varStrArray" + varName + Environment.NewLine;
                        Output.Output = Output.Output + " call ArrayIndexString" + Environment.NewLine;
                        Output.Output = Output.Output + " pop y" + Environment.NewLine;
                        Output.Output = Output.Output + " call copystring" + Environment.NewLine;

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


                    Output.Output = Output.Output + " ldx #varStr" + varName + Environment.NewLine;
                    Output.Output = Output.Output + " call copystring" + Environment.NewLine;

                    if (!Variables.ContainsKey("varStr" + varName))
                    {
                        Variables.Add("varStr" + varName, "varStr" + varName + " rmb 250" + Environment.NewLine);
                    }

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

                if (token.TokenName == TokenParser.Tokens.LTRIM || token.TokenName == TokenParser.Tokens.RTRIM)
                {
                    string exp = GetStringExpression(parser);

                    ExpressionParserOutput o = ParseStringExpression(exp);
                    SkipWhiteSpace(parser);

                    Output.Output = Output.Output + o.Output;
                    Output.Output = token.TokenName == TokenParser.Tokens.LTRIM
                        ? Output.Output + " call funcLTRIM" + Environment.NewLine
                        : Output.Output + " call funcRTRIM" + Environment.NewLine;
                    Output.Output = Output.Output + " call copystring" + Environment.NewLine;
                    Output.Output = Output.Output + " call freememory" + Environment.NewLine;

                    if (token.TokenName == TokenParser.Tokens.LTRIM)
                    {
                        if (!Output.Functions.Contains(Functions.FuncLtrim))
                        {
                            Output.Functions.Add(Functions.FuncLtrim);
                        }
                    }
                    else
                    {
                        if (!Output.Functions.Contains(Functions.FuncRtrim))
                        {
                            Output.Functions.Add(Functions.FuncRtrim);
                        }
                    }

                    SkipWhiteSpace(parser);
                    // Should be a right parenthesis
                    parser.GetToken();
                    SkipWhiteSpace(parser);
                    token = parser.GetToken();
                    SkipWhiteSpace(parser);
                    continue;
                }

                if (token.TokenName == TokenParser.Tokens.UCASE)
                {
                    string exp = GetStringExpression(parser);

                    ExpressionParserOutput o = ParseStringExpression(exp);
                    SkipWhiteSpace(parser);

                    Output.Output = Output.Output + o.Output;
                    Output.Output = Output.Output + " call funcUCASE" + Environment.NewLine;
                    Output.Output = Output.Output + " call copystring" + Environment.NewLine;
                    Output.Output = Output.Output + " call freememory" + Environment.NewLine;

                    if (!Output.Functions.Contains(Functions.FuncUcase))
                    {
                        Output.Functions.Add(Functions.FuncUcase);
                    }

                    SkipWhiteSpace(parser);
                    // Should be a right parenthesis
                    parser.GetToken();
                    SkipWhiteSpace(parser);
                    token = parser.GetToken();
                    SkipWhiteSpace(parser);
                    continue;
                }

                if (token.TokenName == TokenParser.Tokens.LCASE)
                {
                    string exp = GetStringExpression(parser);

                    ExpressionParserOutput o = ParseStringExpression(exp);
                    SkipWhiteSpace(parser);

                    Output.Output = Output.Output + o.Output;
                    Output.Output = Output.Output + " call funcLCASE" + Environment.NewLine;
                    Output.Output = Output.Output + " call copystring" + Environment.NewLine;
                    Output.Output = Output.Output + " call freememory" + Environment.NewLine;

                    if (!Output.Functions.Contains(Functions.FuncLcase))
                    {
                        Output.Functions.Add(Functions.FuncLcase);
                    }

                    SkipWhiteSpace(parser);
                    // Should be a right parenthesis
                    parser.GetToken();
                    SkipWhiteSpace(parser);
                    token = parser.GetToken();
                    SkipWhiteSpace(parser);
                    continue;
                }

                if (token.TokenName == TokenParser.Tokens.STR)
                {
                    string exp = GetNumericExpression(parser, true);

                    ExpressionParserOutput expOutput = ParseNumericExpression(exp);

                    Output.Output = Output.Output + expOutput.Output;
                    Output.Output = Output.Output + " call funcSTR" + Environment.NewLine;
                    Output.Output = Output.Output + " call copystring" + Environment.NewLine;
                    Output.Output = Output.Output + " call freememory" + Environment.NewLine;

                    if (!Output.Functions.Contains(Functions.FuncStr))
                    {
                        Output.Functions.Add(Functions.FuncStr);
                    }

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

                if (token.TokenName == TokenParser.Tokens.CHR)
                {
                    string exp = GetNumericExpression(parser, true);

                    ExpressionParserOutput expOutput = ParseNumericExpression(exp);

                    Output.Output = Output.Output + expOutput.Output;
                    Output.Output = Output.Output + " tfr x,d" + Environment.NewLine;
                    Output.Output = Output.Output + " stb ,y+" + Environment.NewLine;
                    Output.Output = Output.Output + " sta ,y" + Environment.NewLine;

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

                if (token.TokenName == TokenParser.Tokens.INPUT)
                {
                    SkipWhiteSpace(parser);
                    // should be '('
                    parser.GetToken();

                    if (!Output.Functions.Contains(Functions.FuncInput))
                    {
                        Output.Functions.Add(Functions.FuncInput);
                    }
                    if (!Output.Functions.Contains(Functions.FuncPrint))
                    {
                        Output.Functions.Add(Functions.FuncPrint);
                    }

                    SkipWhiteSpace(parser);
                    // should be ')'
                    parser.GetToken();
                    SkipWhiteSpace(parser);

                    Output.Output = Output.Output + " call funcINPUT" + Environment.NewLine;
                    Output.Output = Output.Output + " call copystring" + Environment.NewLine;
                    Output.Output = Output.Output + " call freememory" + Environment.NewLine;

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

                if (token.TokenName == TokenParser.Tokens.MID)
                {
                    string exp = GetStringExpression(parser);

                    ExpressionParserOutput o = ParseStringExpression(exp);
                    SkipWhiteSpace(parser);
                    var midVar = o.Output;

                    // Should be a comma
                    parser.GetToken();
                    SkipWhiteSpace(parser);

                    exp = GetNumericExpression(parser, false);
                    o   = ParseNumericExpression(exp);
                    var midStart = o.Output;
                    SkipWhiteSpace(parser);

                    // Should be a comma
                    parser.GetToken();
                    SkipWhiteSpace(parser);

                    exp = GetNumericExpression(parser, false);
                    o   = ParseNumericExpression(exp);
                    var midLength = o.Output;
                    SkipWhiteSpace(parser);

                    string midcode = "";

                    midcode = midcode + midVar;
                    midcode = midcode + " push x" + Environment.NewLine;
                    midcode = midcode + midLength;
                    midcode = midcode + " push x" + Environment.NewLine;
                    midcode = midcode + midStart;
                    midcode = midcode + " call funcMID" + Environment.NewLine;
                    midcode = midcode + " call copystring" + Environment.NewLine;
                    midcode = midcode + " call freememory" + Environment.NewLine;

                    Output.Output = Output.Output + midcode;

                    if (!Output.Functions.Contains(Functions.FuncMid))
                    {
                        Output.Functions.Add(Functions.FuncMid);
                    }

                    SkipWhiteSpace(parser);
                    // Should be a right parenthesis
                    parser.GetToken();
                    SkipWhiteSpace(parser);
                    token = parser.GetToken();
                    SkipWhiteSpace(parser);
                    continue;
                }
            }

            Output.Output = Output.Output + " pop x" + Environment.NewLine;
            Output.Output = Output.Output + " pop y" + Environment.NewLine;
        }
        public void Compile(string expression, int stringCounter, int loopCounter, int boolCounter)
        {
            ExpressionParserOutput output = new ExpressionParserOutput
            {
                StringCounter = stringCounter,
                LoopCounter   = loopCounter,
                BoolCounter   = boolCounter
            };

            var chains = new List <BoolExpressionChain>();
            int id     = 1;

            Output = output;
            TokenParser parser = new TokenParser {
                InputString = expression
            };

            TokenParser.Tokens connOp;

            do
            {
                string leftExpression  = "";
                string rightExpression = "";
                Token  token;
                while (parser.Peek() != null && parser.Peek().TokenPeek != null &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.LESSTHAN &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.LESSTHANOREQUAL &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.GREATERTHAN &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.GREATERTHENOREQUAL &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.NOTEQUAL &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.EQUAL)
                {
                    token          = parser.GetToken();
                    leftExpression = leftExpression + token.TokenValue;
                }
                leftExpression = leftExpression.Trim();

                token = parser.GetToken();
                var equalityToken = token.TokenName;

                while (parser.Peek() != null && parser.Peek().TokenPeek != null &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.OR &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.AND &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.LESSTHAN &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.LESSTHANOREQUAL &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.GREATERTHAN &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.GREATERTHENOREQUAL &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.NOTEQUAL &&
                       parser.Peek().TokenPeek.TokenName != TokenParser.Tokens.EQUAL)
                {
                    token           = parser.GetToken();
                    rightExpression = rightExpression + token.TokenValue;
                }
                rightExpression = rightExpression.Trim();

                IExpressionParser eParser;
                string            pre = "";
                if (!IsString(leftExpression, rightExpression))
                {
                    eParser = new NumericExpressionParser();
                }
                else
                {
                    eParser = new StringExpressionParser();
                }

                eParser.Variables = Variables;
                eParser.Compile(leftExpression, Output.StringCounter, Output.LoopCounter);

                Output.StringCounter = eParser.Output.StringCounter;
                Output.LoopCounter   = eParser.Output.LoopCounter;

                Output.InitCode = Output.InitCode + eParser.Output.InitCode;

                foreach (var f in eParser.Output.Functions)
                {
                    AddFunction(f);
                }

                foreach (KeyValuePair <string, string> kvp in eParser.Variables)
                {
                    if (!Variables.ContainsKey(kvp.Key))
                    {
                        Variables.Add(kvp.Key, kvp.Value);
                    }
                }

                string leftOutput = pre + eParser.Output.Output;

                pre = "";

                if (!IsString(leftExpression, rightExpression))
                {
                    eParser = new NumericExpressionParser();
                }
                else
                {
                    eParser = new StringExpressionParser();
                }

                eParser.Variables = Variables;
                eParser.Compile(rightExpression, Output.StringCounter, Output.LoopCounter);

                Output.StringCounter = eParser.Output.StringCounter;
                Output.LoopCounter   = eParser.Output.LoopCounter;

                Output.InitCode = Output.InitCode + eParser.Output.InitCode;

                foreach (var f in eParser.Output.Functions)
                {
                    AddFunction(f);
                }

                foreach (KeyValuePair <string, string> kvp in eParser.Variables)
                {
                    if (!Variables.ContainsKey(kvp.Key))
                    {
                        Variables.Add(kvp.Key, kvp.Value);
                    }
                }

                string rightOutput = pre + eParser.Output.Output;

                SkipWhiteSpace(parser);

                connOp = TokenParser.Tokens.UNDEFINED;

                if (parser.Peek() != null && parser.Peek().TokenPeek != null &&
                    parser.Peek().TokenPeek.TokenName == TokenParser.Tokens.AND)
                {
                    connOp = TokenParser.Tokens.AND;
                }
                if (parser.Peek() != null && parser.Peek().TokenPeek != null &&
                    parser.Peek().TokenPeek.TokenName == TokenParser.Tokens.OR)
                {
                    connOp = TokenParser.Tokens.OR;
                }

                chains.Add(new BoolExpressionChain
                {
                    Id = id,
                    ConnectionOperator = connOp,
                    Expression         = new BoolExpression
                    {
                        EquityOperator      = equalityToken,
                        LeftSideCode        = leftOutput,
                        RightSideCode       = rightOutput,
                        LeftSideExpression  = leftExpression,
                        RightSideExpression = rightExpression,
                        IsString            = IsString(leftExpression, rightExpression)
                    }
                });
                id++;

                if (connOp != TokenParser.Tokens.UNDEFINED)
                {
                    parser.GetToken();
                }
            } while (connOp != TokenParser.Tokens.UNDEFINED);

            //if (!leftExpression.Contains('$') && !rightExpression.Contains('$'))
            //{
            //    Output.Output = DoCompare(leftOutput, rightOutput, equalityToken);
            //}
            string output2 = "";

            foreach (BoolExpressionChain chain in chains.OrderBy(z => z.Id))
            {
                if (chain.ConnectionOperator == TokenParser.Tokens.AND || chain.ConnectionOperator == TokenParser.Tokens.UNDEFINED)
                {
                    output2 = output2 + DoCompare(chain.Expression);
                    output2 = output2 + " cmpx #0" + Environment.NewLine;
                    output2 = output2 + " jeq boolexit" + Output.BoolCounter + Environment.NewLine;
                }
                else if (chain.ConnectionOperator == TokenParser.Tokens.OR)
                {
                    output2 = output2 + DoCompare(chain.Expression);
                    output2 = output2 + " cmpx #1" + Environment.NewLine;
                    output2 = output2 + " jeq boolexitor" + Output.BoolCounter + Environment.NewLine;
                }
            }
            output2 = output2 + "boolexitor" + Output.BoolCounter + " ldx #1" + Environment.NewLine;
            output2 = output2 + " jmp booltrue" + Output.BoolCounter + Environment.NewLine;
            output2 = output2 + "boolexit" + output.BoolCounter + " ldx #0" + Environment.NewLine;
            output2 = output2 + "booltrue" + output.BoolCounter + " nop" + Environment.NewLine;

            Output.Output = output2;
            Output.BoolCounter++;
        }
        public void Compile(string expression, int stringCounter, int loopCounter)
        {
            var parser = new TokenParser();

            ExpressionParserOutput output = new ExpressionParserOutput
            {
                StringCounter = stringCounter,
                LoopCounter   = loopCounter
            };

            Output = output;

            parser.InputString = expression;

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

            while (token != null && token.TokenName != TokenParser.Tokens.NEWLINE)
            {
                SkipWhiteSpace(parser);
                if (token.TokenName == TokenParser.Tokens.STRING)
                {
                    if (token.TokenValue == "\"\"")
                    {
                        Output.InitCode = Output.InitCode + "st" + Output.StringCounter + " chr 0" + Environment.NewLine;
                    }
                    else
                    {
                        Output.InitCode = Output.InitCode + "st" + Output.StringCounter + " str " + token.TokenValue +
                                          Environment.NewLine;
                        Output.InitCode = Output.InitCode + " chr 0" + Environment.NewLine;
                    }

                    Output.Output = Output.Output + " ldx #st" + Output.StringCounter + Environment.NewLine;
                    Output.Output = Output.Output + "loop" + Output.LoopCounter + " lda ,x+" + Environment.NewLine;
                    Output.Output = Output.Output + " cmpa #0" + Environment.NewLine;
                    Output.Output = Output.Output + " jeq exitLoop" + Output.LoopCounter + Environment.NewLine;
                    Output.Output = Output.Output + " sta ,y+" + Environment.NewLine;
                    Output.Output = Output.Output + " jmp loop" + Output.LoopCounter + Environment.NewLine;
                    Output.Output = Output.Output + "exitLoop" + Output.LoopCounter + " sta ,y" + Environment.NewLine;
                    Output.LoopCounter++;
                    Output.StringCounter++;
                }
                if (token.TokenName == TokenParser.Tokens.PLUS)
                {
                    //token = parser.GetToken();
                    //continue;
                }
                if (token.TokenName == TokenParser.Tokens.STRINGLABEL)
                {
                    string varName = token.TokenValue.Replace("$", "").ToUpper();
                    SkipWhiteSpace(parser);

                    if (parser.Peek() != null && parser.Peek().TokenPeek != null &&
                        parser.Peek().TokenPeek.TokenName == TokenParser.Tokens.LPAREN)
                    {
                        parser.GetToken();
                        SkipWhiteSpace(parser);
                        string exp = GetNumericExpression(parser);

                        var nc = new NumericExpressionParser {
                            Variables = Variables
                        };
                        nc.Compile(exp, Output.StringCounter, Output.LoopCounter);

                        Output.StringCounter = nc.Output.StringCounter;
                        Output.LoopCounter   = nc.Output.LoopCounter;

                        foreach (var f in nc.Output.Functions)
                        {
                            AddFunction(f);
                        }
                        string ndxCode = nc.Output.Output;

                        Output.Output = Output.Output + ndxCode;
                        Output.Output = Output.Output + " tfr x,d" + Environment.NewLine;
                        Output.Output = Output.Output + " tfr b,a" + Environment.NewLine;
                        Output.Output = Output.Output + " ldx #varStrArray" + varName + Environment.NewLine;
                        Output.Output = Output.Output + " call ArrayIndexString" + Environment.NewLine;
                        Output.Output = Output.Output + "loop" + Output.LoopCounter + " lda ,x+" + Environment.NewLine;
                        Output.Output = Output.Output + " cmpa #0" + Environment.NewLine;
                        Output.Output = Output.Output + " jeq exitLoop" + Output.LoopCounter + Environment.NewLine;
                        Output.Output = Output.Output + " sta ,y+" + Environment.NewLine;
                        Output.Output = Output.Output + " jmp loop" + Output.LoopCounter + Environment.NewLine;
                        Output.Output = Output.Output + "exitLoop" + Output.LoopCounter + " sta ,y" +
                                        Environment.NewLine;
                        Output.LoopCounter++;
                    }
                    else
                    {
                        Output.Output = Output.Output + " ldx #varStr" + varName + Environment.NewLine;
                        Output.Output = Output.Output + "loop" + Output.LoopCounter + " lda ,x+" + Environment.NewLine;
                        Output.Output = Output.Output + " cmpa #0" + Environment.NewLine;
                        Output.Output = Output.Output + " jeq exitLoop" + Output.LoopCounter + Environment.NewLine;
                        Output.Output = Output.Output + " sta ,y+" + Environment.NewLine;
                        Output.Output = Output.Output + " jmp loop" + Output.LoopCounter + Environment.NewLine;
                        Output.Output = Output.Output + "exitLoop" + Output.LoopCounter + " sta ,y" +
                                        Environment.NewLine;
                        Output.LoopCounter++;
                    }
                }

                if (token.TokenName == TokenParser.Tokens.UCASE)
                {
                    string exp = GetStringExpression(parser);

                    ExpressionParserOutput o = ParseStringExpression(exp);

                    AddFunction(Functions.FuncUcase);

                    Output.Output = Output.Output + " push y" + Environment.NewLine;
                    Output.Output = Output.Output + o.Output;
                    Output.Output = Output.Output + " pop y" + Environment.NewLine;
                    Output.Output = Output.Output + " call funcUCASE" + Environment.NewLine;
                }
                if (token.TokenName == TokenParser.Tokens.LCASE)
                {
                    string exp = GetStringExpression(parser);

                    ExpressionParserOutput o = ParseStringExpression(exp);

                    AddFunction(Functions.FuncLcase);

                    Output.Output = Output.Output + " push y" + Environment.NewLine;
                    Output.Output = Output.Output + o.Output;
                    Output.Output = Output.Output + " pop y" + Environment.NewLine;
                    Output.Output = Output.Output + " call funcLCASE" + Environment.NewLine;
                }
                if (token.TokenName == TokenParser.Tokens.INPUT)
                {
                    SkipWhiteSpace(parser);
                    // Should be a left parenthesis
                    parser.GetToken();
                    // Should be a right parenthesis
                    parser.GetToken();

                    Output.Output = Output.Output + " call funcINPUT" + Environment.NewLine;

                    Output.Output = Output.Output + " ldx #InputBuffer" + Environment.NewLine;
                    Output.Output = Output.Output + "loop" + Output.LoopCounter + " lda ,x+" + Environment.NewLine;
                    Output.Output = Output.Output + " cmpa #0" + Environment.NewLine;
                    Output.Output = Output.Output + " jeq exitLoop" + Output.LoopCounter + Environment.NewLine;
                    Output.Output = Output.Output + " sta ,y+" + Environment.NewLine;
                    Output.Output = Output.Output + " jmp loop" + Output.LoopCounter + Environment.NewLine;
                    Output.Output = Output.Output + "exitLoop" + Output.LoopCounter + " sta ,y" + Environment.NewLine;
                    Output.LoopCounter++;

                    AddFunction(Functions.FuncInput);
                    AddFunction(Functions.FuncPrint);
                }
                if (token.TokenName == TokenParser.Tokens.CHR)
                {
                    SkipWhiteSpace(parser);
                    // Should be a left parenthesis
                    parser.GetToken();
                    string exp = GetNumericExpression(parser);
                    ExpressionParserOutput o = ParseNumericExpression(exp);
                    SkipWhiteSpace(parser);

                    // Should be a right parenthesis
                    parser.GetToken();
                    SkipWhiteSpace(parser);

                    Output.Output = Output.Output + o.Output;
                    Output.Output = Output.Output + " tfr x,d" + Environment.NewLine;
                    Output.Output = Output.Output + " stb ,y+" + Environment.NewLine;
                    Output.Output = Output.Output + " sta ,y" + Environment.NewLine;
                }
                if (token.TokenName == TokenParser.Tokens.MID)
                {
                    string exp = GetStringExpression(parser);

                    ExpressionParserOutput o = ParseStringExpression(exp);
                    SkipWhiteSpace(parser);

                    // Should be a comma
                    parser.GetToken();
                    SkipWhiteSpace(parser);

                    Output.Output = Output.Output + " push y" + Environment.NewLine;
                    Output.Output = Output.Output + o.Output;
                    Output.Output = Output.Output + " pop y" + Environment.NewLine;

                    exp = GetNumericExpression(parser);
                    o   = ParseNumericExpression(exp);
                    SkipWhiteSpace(parser);

                    // Should be a comma
                    parser.GetToken();
                    SkipWhiteSpace(parser);

                    Output.Output = Output.Output + "" + Environment.NewLine;
                    Output.Output = Output.Output + o.Output;
                    Output.Output = Output.Output + " tfr x,d" + Environment.NewLine;
                    Output.Output = Output.Output + " push d" + Environment.NewLine;

                    exp = GetNumericExpression(parser);
                    o   = ParseNumericExpression(exp);
                    SkipWhiteSpace(parser);

                    Output.Output = Output.Output + o.Output;
                    Output.Output = Output.Output + " pop d" + Environment.NewLine;

                    Output.Output = Output.Output + " call funcMID" + Environment.NewLine;

                    AddFunction(Functions.FuncMid);
                }
                token = parser.GetToken();
            }
        }