private double expr2() { double R; if (fToken >= ExpToken.tkINV && (fToken < ExpToken.tkMUL || (fToken >= ExpToken.tkADD && fToken < ExpToken.tkLT))) { ExpToken oldt = fToken; lex(); R = expr2(); switch (oldt) { case ExpToken.tkINV: R = ~trunc(R); break; case ExpToken.tkNOT: R = bool2float(trunc(R) <= 0); break; case ExpToken.tkSUB: R = (-R); break; } } else { R = expr1(); } return(R); }
private double expr6() { double R = expr5(); while (true) { if (fToken < ExpToken.tkOR || fToken > ExpToken.tkAND) { break; } ExpToken oldt = fToken; lex(); double V = expr5(); switch (oldt) { case ExpToken.tkOR: R = trunc(R) | trunc(V); break; case ExpToken.tkXOR: R = trunc(R) ^ trunc(V); break; case ExpToken.tkAND: R = trunc(R) & trunc(V); break; } } return(R); }
private double expr4() { double R = expr3(); while (true) { if (fToken < ExpToken.tkADD || fToken > ExpToken.tkSUB) { break; } ExpToken oldt = fToken; lex(); double V = expr3(); switch (oldt) { case ExpToken.tkADD: R = (R + V); break; case ExpToken.tkSUB: R = (R - V); break; } } return(R); }
private void checkToken(ExpToken expected) { if (fToken != expected) { throw new CalculateException("Syntax error"); } }
private double expr5() { double R = expr4(); while (true) { if (fToken < ExpToken.tkLT || fToken > ExpToken.tkGT) { break; } ExpToken oldt = fToken; lex(); double V = expr4(); switch (oldt) { case ExpToken.tkLT: R = bool2float(R < V); break; case ExpToken.tkLE: R = bool2float(R <= V); break; case ExpToken.tkEQ: R = bool2float(R == V); break; case ExpToken.tkNE: R = bool2float(R != V); break; case ExpToken.tkGE: R = bool2float(R >= V); break; case ExpToken.tkGT: R = bool2float(R > V); break; } } return(R); }
/// <summary> /// Convert this <c>PowerCurve</c> to a <c>Graphmatic.Interaction.Equation</c> object representing the same curve. /// </summary> public override Equation ToEquation() { Expression expression = new Expression(null); expression.Add(new VariableToken(DependentVariable)); expression.Add(new SymbolicToken(SymbolicToken.SymbolicType.Equals)); expression.AddRange(ValueToTokenSequence(Scale)); ExpToken exp = new ExpToken(); expression.Add(new VariableToken(IndependentVariable)); exp.Power.AddRange(ValueToTokenSequence(Power)); expression.Add(exp); Equation equation = new Equation(expression) { Name = this.ToString() }; equation.Parse(); return(equation); }
private double expr3() { double R = expr2(); while (true) { if (fToken < ExpToken.tkMUL || fToken > ExpToken.tkPER) { break; } ExpToken oldt = fToken; lex(); double V = expr2(); switch (oldt) { case ExpToken.tkMUL: R = (R * V); break; case ExpToken.tkDIV: R = (R / V); break; case ExpToken.tkMOD: R = trunc(R) % trunc(V); break; case ExpToken.tkPER: R = ((R / V) * 100.0); break; } } return(R); }
private void lex() { Token tok = fTokenizer.CurrentToken; switch (tok.Kind) { case TokenKind.Number: fToken = ExpToken.tkNUMBER; fValue = SysUtils.ParseFloat(tok.Value, double.NaN); break; case TokenKind.Symbol: { switch (tok.Value[0]) { case '!': fToken = ExpToken.tkNOT; tok = fTokenizer.Next(); if (tok.Value[0] == '=') { fToken = ExpToken.tkNE; } else { return; } break; case '%': fToken = ExpToken.tkMOD; tok = fTokenizer.Next(); if (tok.Value[0] == '%') { fToken = ExpToken.tkPER; } else { return; } break; case '&': fToken = ExpToken.tkAND; break; case '(': fToken = ExpToken.tkLBRACE; break; case ')': fToken = ExpToken.tkRBRACE; break; case '*': fToken = ExpToken.tkMUL; tok = fTokenizer.Next(); if (tok.Value[0] == '*') { fToken = ExpToken.tkPOW; } else { return; } break; case '+': fToken = ExpToken.tkADD; break; case '-': fToken = ExpToken.tkSUB; break; case '/': fToken = ExpToken.tkDIV; break; case ';': fToken = ExpToken.tkSEMICOLON; break; case '<': fToken = ExpToken.tkLT; tok = fTokenizer.Next(); if (tok.Value[0] == '=') { fToken = ExpToken.tkLE; } else { return; } break; case '=': fToken = ExpToken.tkASSIGN; tok = fTokenizer.Next(); if (tok.Value[0] == '=') { fToken = ExpToken.tkEQ; } else { return; } break; case '>': fToken = ExpToken.tkGT; tok = fTokenizer.Next(); if (tok.Value[0] == '=') { fToken = ExpToken.tkGE; } else { return; } break; case '^': fToken = ExpToken.tkXOR; break; case '|': fToken = ExpToken.tkOR; break; case '~': fToken = ExpToken.tkINV; break; default: fToken = ExpToken.tkERROR; break; } } break; case TokenKind.Word: case TokenKind.Ident: fIdent = tok.Value; fToken = ExpToken.tkIDENT; break; case TokenKind.HexNumber: try { fToken = ExpToken.tkNUMBER; fValue = Convert.ToInt32(tok.Value, 16); } catch { fToken = ExpToken.tkERROR; } break; case TokenKind.BinNumber: try { fToken = ExpToken.tkNUMBER; fValue = Convert.ToInt32(tok.Value.Substring(2), 2); } catch { fToken = ExpToken.tkERROR; } break; case TokenKind.EOF: fToken = ExpToken.tkEOF; break; default: fToken = ExpToken.tkERROR; break; } fTokenizer.Next(); }
/// <summary> /// Initializes the handlers for the buttons on the form that add the appropriate event handlers /// and keyboard shortcut handlers for all of the buttons on the form. This uses the /// <see cref="CreateTokenButton"/> method to create the event handlers. /// </summary> private void InitializeButtons() { #region Digits CreateTokenButton(button0, () => new DigitToken(0), "0 key", Keys.D0); CreateTokenButton(button1, () => new DigitToken(1), "1 key", Keys.D1); CreateTokenButton(button2, () => new DigitToken(2), "2 key", Keys.D2); CreateTokenButton(button3, () => new DigitToken(3), "3 key", Keys.D3); CreateTokenButton(button4, () => new DigitToken(4), "4 key", Keys.D4); CreateTokenButton(button5, () => new DigitToken(5), "5 key", Keys.D5); CreateTokenButton(button6, () => new DigitToken(6), "6 key", Keys.D6); CreateTokenButton(button7, () => new DigitToken(7), "7 key", Keys.D7); CreateTokenButton(button8, () => new DigitToken(8), "8 key", Keys.D8); CreateTokenButton(button9, () => new DigitToken(9), "9 key", Keys.D9); CreateTokenButton(buttonDecimalPoint, () => new SymbolicToken(SymbolicToken.SymbolicType.DecimalPoint), ". key", Keys.OemPeriod); #endregion #region Basic Operations CreateTokenButton(buttonAdd, () => new OperationToken(OperationToken.OperationType.Add), "Plus Key", Keys.Oemplus, Keys.Shift); CreateTokenButton(buttonSubtract, () => new OperationToken(OperationToken.OperationType.Subtract), "Minus Key", Keys.OemMinus); CreateTokenButton(buttonMultiply, () => new OperationToken(OperationToken.OperationType.Multiply), "Shift-8 (*)", Keys.D8, Keys.Shift); CreateTokenButton(buttonDivide, () => new OperationToken(OperationToken.OperationType.Divide), "Backslash", Keys.Oem5); #endregion #region Roots CreateTokenButton(buttonRoot, () => new RootToken(), "Ctrl-Shift-R", Keys.R, Keys.Control | Keys.Shift); CreateTokenButton(buttonSqrt, () => { var token = new RootToken(); token.Power.Add(new DigitToken(2)); return(token); }, "Ctrl-R", Keys.R, Keys.Control); #endregion #region Trig CreateTokenButton(buttonSin, () => new FunctionToken("sin")); CreateTokenButton(buttonCos, () => new FunctionToken("cos")); CreateTokenButton(buttonTan, () => new FunctionToken("tan")); CreateTokenButton(buttonArcsin, () => new FunctionToken("sin`")); CreateTokenButton(buttonArccos, () => new FunctionToken("cos`")); CreateTokenButton(buttonArctan, () => new FunctionToken("tan`")); #endregion #region Logs CreateTokenButton(buttonLogN, () => new LogToken(), "Ctrl-L", Keys.L, Keys.Control); CreateTokenButton(buttonLogE, () => { var token = new LogToken(); token.Base.Add(new ConstantToken(ConstantToken.ConstantType.E)); return(token); }, "Ctrl-Shift-L", Keys.L, Keys.Shift | Keys.Control); CreateTokenButton(buttonLog10, () => { var token = new LogToken(); token.Base.Add(new DigitToken(1)); token.Base.Add(new DigitToken(0)); return(token); }); #endregion #region Exponents CreateTokenButton(buttonExp, () => new ExpToken(), "Shift-6 (^)", Keys.D6, Keys.Shift); CreateTokenButton(buttonSquare, () => { var token = new ExpToken(); token.Power.Add(new DigitToken(2)); return(token); }, "Alt-2", Keys.D2, Keys.Alt); CreateTokenButton(buttonCube, () => { var token = new ExpToken(); token.Power.Add(new DigitToken(3)); return(token); }, "Alt-3", Keys.D3, Keys.Alt); CreateTokenButton(buttonReciprocate, () => { var token = new ExpToken(); token.Power.Add(new OperationToken(OperationToken.OperationType.Subtract)); token.Power.Add(new DigitToken(1)); return(token); }, "Alt-Minus", Keys.OemMinus, Keys.Alt); #endregion #region Constants CreateTokenButton(buttonPi, () => new ConstantToken(ConstantToken.ConstantType.Pi), "P", Keys.P); CreateTokenButton(buttonE, () => new ConstantToken(ConstantToken.ConstantType.E), "E", Keys.E); #endregion #region Misc CreateTokenButton(buttonFraction, () => new FractionToken(), "Forward-slash", Keys.OemQuestion); CreateTokenButton(buttonAbsolute, () => new AbsoluteToken(), "|", Keys.Oem5, Keys.Shift); CreateTokenButton(buttonBracket, () => new FunctionToken(""), "(", Keys.D9, Keys.Shift); // CreateExpressionButton(buttonComma, () => new SymbolicToken(SymbolicToken.SymbolicType.Comma), ",", Keys.Oemcomma); CreateTokenButton(buttonPercent, () => new SymbolicToken(SymbolicToken.SymbolicType.Percent), "%", Keys.D5, Keys.Shift); CreateTokenButton(buttonSymbolicExp, () => new SymbolicToken(SymbolicToken.SymbolicType.Exp10), "Ctrl-E", Keys.E, Keys.Control); #endregion CreateTokenButton(buttonXVariable, () => new VariableToken('x'), "X", Keys.X); CreateTokenButton(buttonYVariable, () => new VariableToken('y'), "Y", Keys.Y); CreateTokenButton(buttonCustomVariable, () => { // creates an EnterVariable dialog to allow the user to enter any variable // character they want (that isn't 'x' or 'y') char customVariable = CreateVariableDialog.EnterVariable(); if (customVariable != '\0') { return(new VariableToken(customVariable)); } else { return(null); } }, "Hash", Keys.Oem7); CreateTokenButton(buttonEquals, () => new SymbolicToken(SymbolicToken.SymbolicType.Equals), "Equals", Keys.Oemplus); }