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(); } }