Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 private void checkToken(ExpToken expected)
 {
     if (fToken != expected)
     {
         throw new CalculateException("Syntax error");
     }
 }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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();
        }
Esempio n. 9
0
        /// <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);
        }