All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mariuszgromada.math.mxparser.Expression Maven / Gradle / Ivy

Go to download

mXparser is a super easy, rich, fast and highly flexible math expression parser library (parser and evaluator of mathematical expressions / formulas provided as plain text / string). Software delivers easy to use API for JAVA, Android and C# .NET/MONO (Common Language Specification compliant: F#, Visual Basic, C++/CLI). *** If you find the software useful donation is something you might consider: https://mathparser.org/donate/ *** Scalar Scientific Calculator, Charts and Scripts, Scalar Lite: https://play.google.com/store/apps/details?id=org.mathparser.scalar.lite *** Scalar Pro: https://play.google.com/store/apps/details?id=org.mathparser.scalar.pro *** ScalarMath.org: https://scalarmath.org/ *** MathSpace.pl: https://mathspace.pl/ ***

There is a newer version: 6.1.0
Show newest version
/*
 * @(#)Expression.java        4.4.3    2022-05-28
 *
 * MathParser.org-mXparser DUAL LICENSE AGREEMENT as of date 2022-05-22
 * The most up-to-date license is available at the below link:
 * - https://mathparser.org/mxparser-license
 *
 * AUTHOR: Copyright 2010 - 2022 Mariusz Gromada - All rights reserved
 * PUBLISHER: INFIMA - https://payhip.com/infima
 *
 * SOFTWARE means source code and/or binary form and/or documentation.
 * PRODUCT: MathParser.org-mXparser SOFTWARE
 * LICENSE: DUAL LICENSE AGREEMENT
 *
 * BY INSTALLING, COPYING, OR OTHERWISE USING THE PRODUCT, YOU AGREE TO BE
 * BOUND BY ALL OF THE TERMS AND CONDITIONS OF THE DUAL LICENSE AGREEMENT.
 *
 * AUTHOR & PUBLISHER provide the PRODUCT under the DUAL LICENSE AGREEMENT
 * model designed to meet the needs of both non-commercial use as well as
 * commercial use.
 *
 * NON-COMMERCIAL USE means any use or activity where a fee is not charged
 * and the purpose is not the sale of a good or service, and the use or
 * activity is not intended to produce a profit. NON-COMMERCIAL USE examples:
 *
 * 1. Free Open-Source Software ("FOSS").
 * 2. Non-commercial use in research, scholarly and education.
 *
 * COMMERCIAL USE means any use or activity where a fee is charged or the
 * purpose is the sale of a good or service, or the use or activity is
 * intended to produce a profit. COMMERCIAL USE examples:
 *
 * 1. OEMs (Original Equipment Manufacturers).
 * 2. ISVs (Independent Software Vendors).
 * 3. VARs (Value Added Resellers).
 * 4. Other distributors that combine and distribute commercially licensed
 *    software.
 *
 * IN CASE YOU WANT TO USE THE PRODUCT COMMERCIALLY, YOU MUST PURCHASE THE
 * APPROPRIATE LICENSE FROM "INFIMA" ONLINE STORE, STORE ADDRESS:
 *
 * 1. https://mathparser.org/order-commercial-license
 * 2. https://payhip.com/infima
 *
 * NON-COMMERCIAL LICENSE
 *
 * Redistribution and use of the PRODUCT in source and/or binary forms,
 * with or without modification, are permitted provided that the following
 * conditions are met:
 *
 * 1. Redistributions of source code must retain unmodified content of the
 *    entire MathParser.org-mXparser DUAL LICENSE AGREEMENT, including
 *    definition of NON-COMMERCIAL USE, definition of COMMERCIAL USE,
 *    NON-COMMERCIAL LICENSE conditions, COMMERCIAL LICENSE conditions, and
 *    the following DISCLAIMER.
 * 2. Redistributions in binary form must reproduce the entire content of
 *    MathParser.org-mXparser DUAL LICENSE AGREEMENT in the documentation
 *    and/or other materials provided with the distribution, including
 *    definition of NON-COMMERCIAL USE, definition of COMMERCIAL USE,
 *    NON-COMMERCIAL LICENSE conditions, COMMERCIAL LICENSE conditions, and
 *    the following DISCLAIMER.
 *
 * COMMERCIAL LICENSE
 *
 *  1. Before purchasing a commercial license, AUTHOR & PUBLISHER allow you
 *     to download, install and use up to three copies of the PRODUCT to
 *     perform integration tests, confirm the quality of the PRODUCT and
 *     its suitability. The testing period should be limited to fourteen
 *     days. Tests should be performed under the conditions of test
 *     environments. The purpose of the tests must not be to generate profit.
 *  2. Provided that you purchased a license from "INFIMA" online store
 *     (store address: https://mathparser.org/order-commercial-license or
 *     https://payhip.com/infima), and you comply with all below terms and
 *     conditions, and you have acknowledged and understood the following
 *     DISCLAIMER, AUTHOR & PUBLISHER grant you a nonexclusive license
 *     including the following rights:
 *  3. The license has been granted only to you, i.e., the person or entity
 *     that made the purchase, who is identified and confirmed by the data
 *     provided during the purchase.
 *  4. In case you purchased a license in the "ONE-TIME PURCHASE" model,
 *     the license has been granted only for the PRODUCT version specified
 *     in the purchase. The upgrade policy gives you additional rights and
 *     is described in the dedicated section below.
 *  5. In case you purchased a license in the "SUBSCRIPTION" model, you can
 *     install and use any version of the PRODUCT, but only during the
 *     subscription validity period.
 *  6. In case you purchased a "SINGLE LICENSE" you can install and use the
 *     PRODUCT from one workstation.
 *  7. Additional copies of the PRODUCT can be installed and used from more
 *     than one workstation; however, this number is limited to the number
 *     of workstations purchased as per order.
 *  8. In case you purchased a "SITE LICENSE ", the PRODUCT can be installed
 *     and used from all workstations located at your premises.
 *  9. You may incorporate the unmodified PRODUCT into your own products
 *     and software.
 * 10. If you purchased a license with the "SOURCE CODE" option, you may
 *     modify the PRODUCT's source code and incorporate the modified source
 *     code into your own products and/or software.
 * 11. Provided that the license validity period has not expired, you may
 *     distribute your product and/or software with the incorporated
 *     PRODUCT royalty-free.
 * 12. You may make copies of the PRODUCT for backup and archival purposes.
 * 13. AUTHOR & PUBLISHER reserve all rights not expressly granted to you
 *     in this agreement.
 *
 * ADDITIONAL CLARIFICATION ON WORKSTATION
 *
 * A workstation is a device, a remote device, or a virtual device, used by
 * you, your employees, or other entities to whom you have commissioned the
 * tasks. For example, the number of workstations may refer to the number
 * of software developers, engineers, architects, scientists, and other
 * professionals who use the PRODUCT on your behalf. The number of
 * workstations is not the number of copies of your end-product that you
 * distribute to your end-users.
 *
 * By purchasing the COMMERCIAL LICENSE, you only pay for the number of
 * workstations, while the number of copies of your final product
 * (delivered to your end-users) is not limited.
 *
 * UPGRADE POLICY
 *
 * The PRODUCT is versioned according to the following convention:
 *
 *    [MAJOR].[MINOR].[PATCH]
 *
 * 1. COMMERCIAL LICENSE holders can install and use the updated version
 *    for bug fixes free of charge, i.e. if you have purchased a license
 *    for the [MAJOR].[MINOR] version (e.g.: 5.0), you can freely install
 *    all the various releases specified in the [PATCH] version (e.g.: 5.0.2).
 *    The license terms remain unchanged after the update.
 * 2. COMMERCIAL LICENSE holders for [MAJOR].[MINOR] version (e.g.: 5.0)
 *    can install and use the updated version [MAJOR].[MINOR + 1] free of
 *    charge, i.e., plus one release in the [MINOR] range (e.g.: 5.1). The
 *    license terms remain unchanged after the update.
 * 3. COMMERCIAL LICENSE holders who wish to upgrade their version, but are
 *    not eligible for the free upgrade, can claim a discount when
 *    purchasing the upgrade. For this purpose, please contact us via e-mail.
 *
 * DISCLAIMER
 *
 * THIS PRODUCT IS PROVIDED BY AUTHOR & PUBLISHER "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL AUTHOR OR PUBLISHER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS PRODUCT, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * THE VIEWS AND CONCLUSIONS CONTAINED IN THE PRODUCT AND DOCUMENTATION ARE
 * THOSE OF THE AUTHORS AND SHOULD NOT BE INTERPRETED AS REPRESENTING
 * OFFICIAL POLICIES, EITHER EXPRESSED OR IMPLIED, OF AUTHOR OR PUBLISHER.
 *
 * CONTACT
 *
 * - e-mail: [email protected]
 * - website: https://mathparser.org
 * - source code: https://github.com/mariuszgromada/MathParser.org-mXparser
 * - online store: https://mathparser.org/order-commercial-license
 * - online store: https://payhip.com/infima
 */
package org.mariuszgromada.math.mxparser;

import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.ArrayList;
import java.util.Stack;

import org.mariuszgromada.math.mxparser.mathcollection.AstronomicalConstants;
import org.mariuszgromada.math.mxparser.mathcollection.BinaryRelations;
import org.mariuszgromada.math.mxparser.mathcollection.BooleanAlgebra;
import org.mariuszgromada.math.mxparser.mathcollection.MathConstants;
import org.mariuszgromada.math.mxparser.mathcollection.MathFunctions;
import org.mariuszgromada.math.mxparser.mathcollection.NumberTheory;
import org.mariuszgromada.math.mxparser.mathcollection.PhysicalConstants;
import org.mariuszgromada.math.mxparser.mathcollection.Calculus;
import org.mariuszgromada.math.mxparser.mathcollection.ProbabilityDistributions;
import org.mariuszgromada.math.mxparser.mathcollection.SpecialFunctions;
import org.mariuszgromada.math.mxparser.mathcollection.Statistics;
import org.mariuszgromada.math.mxparser.mathcollection.Units;
import org.mariuszgromada.math.mxparser.parsertokens.BinaryRelation;
import org.mariuszgromada.math.mxparser.parsertokens.BitwiseOperator;
import org.mariuszgromada.math.mxparser.parsertokens.BooleanOperator;
import org.mariuszgromada.math.mxparser.parsertokens.CalculusOperator;
import org.mariuszgromada.math.mxparser.parsertokens.ConstantValue;
import org.mariuszgromada.math.mxparser.parsertokens.Function1Arg;
import org.mariuszgromada.math.mxparser.parsertokens.Function2Arg;
import org.mariuszgromada.math.mxparser.parsertokens.Function3Arg;
import org.mariuszgromada.math.mxparser.parsertokens.FunctionVariadic;
import org.mariuszgromada.math.mxparser.parsertokens.KeyWord;
import org.mariuszgromada.math.mxparser.parsertokens.Operator;
import org.mariuszgromada.math.mxparser.parsertokens.ParserSymbol;
import org.mariuszgromada.math.mxparser.parsertokens.RandomVariable;
import org.mariuszgromada.math.mxparser.parsertokens.Token;
import org.mariuszgromada.math.mxparser.parsertokens.Unit;
import org.mariuszgromada.math.mxparser.syntaxchecker.SyntaxChecker;
/**
 * Expression - base class for real expressions definition.
 *
 * Examples:
 * 
    *
  • '1+2' *
  • 'sin(x)+1' *
  • 'asin(3*x)^10-log(4,8)' *
  • in general 'f(x1,x2,...,xn)' where x1,...,xn are real * arguments *
*

* Class provides easy way to define multivariate arithmetic expression. * * * @author Mariusz Gromada
* [email protected]
* MathSpace.pl
* MathParser.org - mXparser project page
* mXparser on GitHub
* mXparser on SourceForge
* mXparser on Bitbucket
* mXparser on CodePlex
* Janet Sudoku - project web page
* Janet Sudoku on GitHub
* Janet Sudoku on CodePlex
* Janet Sudoku on SourceForge
* Janet Sudoku on BitBucket
* Scalar Free
* Scalar Pro
* ScalarMath.org
* * @version 4.4.0 * * @see Argument * @see RecursiveArgument * @see Constant * @see Function */ public class Expression extends PrimitiveElement { /** * Expression type id */ public static final int TYPE_ID = 100; public static final String TYPE_DESC = "User defined expression"; /** * FOUND / NOT_FOUND * used for matching purposes */ static final int NOT_FOUND = mXparser.NOT_FOUND; static final int FOUND = mXparser.FOUND; /** * Marker for internal processing */ static final boolean INTERNAL = true; /** * For verbose mode purposes */ private static final boolean WITH_EXP_STR = true; private static final boolean NO_EXP_STR = false; /** * Status of the Expression syntax */ public static final boolean NO_SYNTAX_ERRORS = true; public static final boolean SYNTAX_ERROR_OR_STATUS_UNKNOWN = false; /** * Expression string (for example: "sin(x)+cos(y)") */ String expressionString; private String description; /** * List of arguments * * @see Argument * @see RecursiveArgument */ List argumentsList; /** * List of user defined functions * * @see Function */ List functionsList; /** * List of user defined constants * * @see Constant */ List constantsList; /** * List of key words known by the parser */ private List keyWordsList; /** * List of expression tokens (words). * Token class defines all needed * attributes for recognizing the structure of * arithmetic expression. This is the key result when * initial parsing is finished (tokenizeExpressionString() - method). * Token keeps information about: * - token type (for example: function, operator, argument, number, etc...) * - token identifier within given type (sin, cos, operaotr, etc...) * - token value (if token is a number) * - token level - key information regarding sequence (order) of further parsing */ private List initialTokens; /** * the initialTokens list keeps unchanged information about * found tokens. * * While parsing the tokensList is used. The tokensList is the same * as initialTokens list at the beginning of the calculation process. * Each math operation changes tokens list - it means that * tokens are parameters when performing math operation * and the result is also presented as token (usually as a number token) * At the end of the calculation the tokensList should contain only one * element - the result of all calculations. */ private List tokensList; /** * List of related expressions, for example when * user defined function is used in the expression * or dependent argument was defined. Modification of * function expression calls the method expression modified * flag method to all related expressions. * * Related expression usually are used for * - dependent arguments * - recursive arguments * - user functions */ List relatedExpressionsList; /** * Keeps computing time */ private double computingTime; /** * if true then new tokenizing is required * (the initialTokens list needs to be updated) */ private boolean expressionWasModified; /** * If recursive mode is on the recursive calls are permitted. * It means there will be no null pointer exceptions * due to expression, and functions cloning. */ boolean recursiveMode; /** * Verbose mode prints processing info * calls System.out.print* methods */ private boolean verboseMode; /** * Internal parameter for calculus expressions * to avoid decrease in accuracy. */ boolean disableRounding; static final boolean DISABLE_ROUNDING = true; static final boolean KEEP_ROUNDING_SETTINGS = false; /** * Status of the expression syntax * * Please referet to the: * - NO_SYNTAX_ERRORS * - SYNTAX_ERROR_OR_STATUS_UNKNOWN */ private boolean syntaxStatus; /** * Message after checking the syntax */ private String errorMessage; /** * Flag used internally to mark started recursion * call on the current object, necessary to * avoid infinite loops while recursive syntax * checking (i.e. f -> g and g -> f) * or marking modified flags on the expressions * related to this expression. * * @see setExpressionModifiedFlag() * @see checkSyntax() */ private boolean recursionCallPending; /** * Internal counter to avoid infinite loops while calculating * expression defined in the way shown by below examples * * Argument x = new Argument("x = 2*y"); * Argument y = new Argument("y = 2*x"); * x.addDefinitions(y); * y.addDefinitions(x); * * Function f = new Function("f(x) = 2*g(x)"); * Function g = new Function("g(x) = 2*f(x)"); * f.addDefinitions(g); * g.addDefinitions(f); */ private int recursionCallsCounter; /** * Internal indicator for tokenization process * if true, then keywords such as constants * functions etc.. will not be recognized * during tokenization */ private boolean parserKeyWordsOnly; /** * Indicator whether expression was * automatically built for user defined * functions purpose * * @see Function */ boolean UDFExpression = false; /** * List of parameters provided by the user at run-time * * @see Function */ List UDFVariadicParamsAtRunTime; /** * Internal indicator for calculation process * Expression.Calculate() method * It show whether to build again tokens list * if clone - build again * if not clone - build only at the beginning * * Indicator helps to solve the problem with * above definitions * * Function f = new Function("f(x) = 2*g(x)"); * Function g = new Function("g(x) = 2*f(x)"); * f.addDefinitions(g); * g.addDefinitions(f); */ private boolean internalClone; /** * mXparser options changeset * used in checkSyntax() method */ private int optionsChangesetNumber = -1; /*================================================= * * Related expressions handling * *================================================= */ /** * Adds related expression * The same expression could be added more than once * For example when * * @param expression the expression */ void addRelatedExpression(Expression expression) { if (expression != null && expression != this) { if (!relatedExpressionsList.contains(expression)) relatedExpressionsList.add(expression); } } /** * Removes related expression * * @param expression the expression */ void removeRelatedExpression(Expression expression) { relatedExpressionsList.remove(expression); } /** * Prints related expression list */ void showRelatedExpressions() { mXparser.consolePrintln(); mXparser.consolePrintln(this.description + " = " + this.expressionString + ":"); for (Expression e : relatedExpressionsList) mXparser.consolePrintln("-> " + e.description + " = " + e.expressionString); } /** * Method return error message after * calling checkSyntax() method or * calculate(). * * @return Error message as string. */ public String getErrorMessage() { return errorMessage; } /** * Gets syntax status of the expression. * * @return true if there are no syntax errors, * false when syntax error was found or * syntax status is unknown */ public boolean getSyntaxStatus() { return this.syntaxStatus; } /** * Package level method for passing * information about errors identified * on the constructors level * * @param syntaxStatus Syntax status * @param errorMessage Error message * * @see Function */ void setSyntaxStatus(boolean syntaxStatus, String errorMessage) { this.syntaxStatus = syntaxStatus; this.errorMessage = errorMessage; this.expressionWasModified = false; } /** * Sets expression status to modified * Calls setExpressionModifiedFlag() method * to all related expressions. */ void setExpressionModifiedFlag() { if (recursionCallPending == false) { recursionCallPending = true; recursionCallsCounter = 0; internalClone = false; expressionWasModified = true; syntaxStatus = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = "Syntax status unknown."; for (Expression e : relatedExpressionsList) e.setExpressionModifiedFlag(); recursionCallPending = false; } } /** * Common variables while expression initializing */ private void expressionInternalVarsInit() { description = ""; errorMessage = ""; computingTime = 0; recursionCallPending = false; recursionCallsCounter = 0; internalClone = false; parserKeyWordsOnly = false; disableRounding = KEEP_ROUNDING_SETTINGS; } /** * Common elements while expression initializing */ private void expressionInit() { /* * New lists */ argumentsList = new ArrayList(); functionsList = new ArrayList(); constantsList = new ArrayList(); relatedExpressionsList = new ArrayList(); /* * Empty description * Silent mode * No recursive mode */ setSilentMode(); disableRecursiveMode(); expressionInternalVarsInit(); } /*================================================= * * Constructors * *================================================= */ /** * Default constructor - empty expression * * @param elements Optional elements list (variadic - comma separated) of types: Argument, Constant, Function * * @see PrimitiveElement */ public Expression(PrimitiveElement...elements) { super(Expression.TYPE_ID); expressionString = ""; expressionInit(); setExpressionModifiedFlag(); addDefinitions(elements); } /** * Constructor - creates new expression from expression string. * * @param expressionString definition of the expression * @param elements Optional elements list (variadic - comma separated) of types: Argument, Constant, Function * * @see PrimitiveElement * */ public Expression(String expressionString, PrimitiveElement...elements) { super(Expression.TYPE_ID); expressionInit(); this.expressionString = new String(expressionString); setExpressionModifiedFlag(); addDefinitions(elements); } /** * Constructor - creates new expression from expression string. * @param expressionString definition of the expression * @param parserKeyWordsOnly if true then all keywords such as functions, * constants, arguments will not be recognized. */ Expression(String expressionString, boolean parserKeyWordsOnly) { super(Expression.TYPE_ID); expressionInit(); this.expressionString = new String(expressionString); setExpressionModifiedFlag(); this.parserKeyWordsOnly = parserKeyWordsOnly; } /** * Package level constructor - creates new expression from subexpression * (sublist of the tokens list), arguments list, functions list and * constants list (used by the internal calculus operations, etc...). * * @param expressionString the expression string * @param initialTokens the tokens list (starting point - no tokenizing, * no syntax checking) * @param argumentsList the arguments list * @param functionsList the functions list * @param constantsList the constants list */ Expression(String expressionString, List initialTokens, List argumentsList, List functionsList, List constantsList, boolean disableUlpRounding, boolean UDFExpression, List UDFVariadicParamsAtRunTime) { super(Expression.TYPE_ID); this.expressionString = expressionString; this.initialTokens = initialTokens; this.argumentsList = argumentsList; this.functionsList = functionsList; this.constantsList = constantsList; relatedExpressionsList = new ArrayList(); expressionWasModified = false; syntaxStatus = NO_SYNTAX_ERRORS; description = "_internal_"; errorMessage = ""; computingTime = 0; recursionCallPending = false; recursionCallsCounter = 0; internalClone = false; parserKeyWordsOnly = false; this.UDFExpression = UDFExpression; this.UDFVariadicParamsAtRunTime = UDFVariadicParamsAtRunTime; this.disableRounding = disableUlpRounding; setSilentMode(); disableRecursiveMode(); } /** * Package level constructor - creates new expression from expression string, * arguments list, functions list and constants list (used by the * RecursiveArgument class). * * No related expressions at the beginning. * * @param expressionString the expression string * @param argumentsList the arguments list * @param functionsList the functions list * @param constantsList the constants list * @param internal the marker for internal processing * * @see Argument * @see RecursiveArgument * @see Function * @see Constant */ Expression(String expressionString, List argumentsList, List functionsList, List constantsList ,boolean internal, boolean UDFExpression, List UDFVariadicParamsAtRunTime) { super(Expression.TYPE_ID); this.expressionString = new String(expressionString); expressionInternalVarsInit(); setSilentMode(); disableRecursiveMode(); this.argumentsList = argumentsList; this.functionsList = functionsList; this.constantsList = constantsList; this.UDFExpression = UDFExpression; this.UDFVariadicParamsAtRunTime = UDFVariadicParamsAtRunTime; relatedExpressionsList = new ArrayList(); setExpressionModifiedFlag(); } /** * Private constructor - expression cloning. * * @param expression the base expression */ private Expression(Expression expression) { super(Expression.TYPE_ID); expressionString = new String(expression.expressionString); description = new String(expression.description); argumentsList = expression.argumentsList; functionsList = expression.functionsList; constantsList = expression.constantsList; keyWordsList = expression.keyWordsList; relatedExpressionsList = expression.relatedExpressionsList; computingTime = 0; expressionWasModified = expression.expressionWasModified; recursiveMode = expression.recursiveMode; verboseMode = expression.verboseMode; syntaxStatus = expression.syntaxStatus; errorMessage = new String(expression.errorMessage); recursionCallPending = expression.recursionCallPending; recursionCallsCounter = expression.recursionCallsCounter; parserKeyWordsOnly = expression.parserKeyWordsOnly; disableRounding = expression.disableRounding; UDFExpression = expression.UDFExpression; UDFVariadicParamsAtRunTime = expression.UDFVariadicParamsAtRunTime; internalClone = true; } /** * Sets (modifies expression) expression string. * * @param expressionString the expression string */ public void setExpressionString(String expressionString) { this.expressionString = expressionString; setExpressionModifiedFlag(); } /** * Returns expression string * * @return Expression string definition. */ public String getExpressionString() { return expressionString; } /** * Clears expression string */ public void clearExpressionString() { this.expressionString = ""; setExpressionModifiedFlag(); } /** * Sets expression description. * * @param description the description string */ public void setDescription(String description) { this.description = description; } /** * Gets expression description. * * @return String description. */ public String getDescription() { return description; } /** * Clears expression description */ public void clearDescription() { this.description = ""; } /** * Enables verbose mode. */ public void setVerboseMode() { verboseMode = true; } /** * Disables verbose mode (default silent mode). */ public void setSilentMode() { verboseMode = false; } /** * Returns verbose mode status. * * @return true if verbose mode is on, * otherwise returns false. */ public boolean getVerboseMode() { return verboseMode; } /** * Sets recursive mode */ void setRecursiveMode() { recursiveMode = true; } /** * Disables recursive mode */ void disableRecursiveMode() { recursiveMode = false; } /** * Gets recursive mode status * * @return true if recursive mode is enabled, * otherwise returns false. */ public boolean getRecursiveMode() { return recursiveMode; } /** * Gets computing time. * * @return computing time in seconds. */ public double getComputingTime() { return computingTime; } /** * Adds user defined elements (such as: Arguments, Constants, Functions) * to the expressions. * * @param elements Elements list (variadic), where Argument, Constant, Function * extend the same class PrimitiveElement * * @see PrimitiveElement */ public void addDefinitions(PrimitiveElement... elements) { for (PrimitiveElement e : elements) { if (e != null) { int elementTypeId = e.getMyTypeId(); if (elementTypeId == Argument.TYPE_ID) addArguments((Argument)e); else if (elementTypeId == Constant.TYPE_ID) addConstants((Constant)e); else if (elementTypeId == Function.TYPE_ID) addFunctions((Function)e); else if (elementTypeId == RecursiveArgument.TYPE_ID_RECURSIVE) addArguments((Argument)e); } } } /** * Removes user defined elements (such as: Arguments, Constants, Functions) * to the expressions. * * @param elements Elements list (variadic), where Argument, Constant, Function * extend the same class PrimitiveElement * * @see PrimitiveElement */ public void removeDefinitions(PrimitiveElement... elements) { for (PrimitiveElement e : elements) { if (e != null) { int elementTypeId = e.getMyTypeId(); if (elementTypeId == Argument.TYPE_ID) removeArguments((Argument)e); else if (elementTypeId == Constant.TYPE_ID) removeConstants((Constant)e); else if (elementTypeId == Function.TYPE_ID) removeFunctions((Function)e); else if (elementTypeId == RecursiveArgument.TYPE_ID_RECURSIVE) removeArguments((Argument)e); } } } /*================================================= * * Arguments handling API * *================================================= */ /** * Adds arguments (variadic) to the expression definition. * * @param arguments the arguments list * (comma separated list) * @see Argument * @see RecursiveArgument */ public void addArguments(Argument... arguments) { for (Argument arg : arguments) { if (arg != null) { argumentsList.add(arg); if (arg.getArgumentBodyType() == Argument.BODY_RUNTIME) arg.addRelatedExpression(this); } } setExpressionModifiedFlag(); } /** * Enables to define the arguments (associated with * the expression) based on the given arguments names. * * @param argumentsNames the arguments names (variadic) * comma separated list * * @see Argument * @see RecursiveArgument */ public void defineArguments(String... argumentsNames) { for (String argName : argumentsNames) { Argument arg = new Argument(argName); arg.addRelatedExpression(this); argumentsList.add(arg); } setExpressionModifiedFlag(); } /** * Enables to define the argument (associated with the expression) * based on the argument name and the argument value. * * @param argumentName the argument name * @param argumentValue the the argument value * * @see Argument * @see RecursiveArgument */ public void defineArgument(String argumentName, double argumentValue) { Argument arg = new Argument(argumentName, argumentValue); arg.addRelatedExpression(this); argumentsList.add(arg); setExpressionModifiedFlag(); } /** * Gets argument index from the expression. * * @param argumentName the argument name * * @return The argument index if the argument name was found, * otherwise returns Argument.NOT_FOUND * * @see Argument * @see RecursiveArgument */ public int getArgumentIndex(String argumentName) { int argumentsNumber = argumentsList.size(); if (argumentsNumber > 0) { int argumentIndex = 0; int searchResult = NOT_FOUND; while ((argumentIndex < argumentsNumber)&&(searchResult == NOT_FOUND)) { if (argumentsList.get(argumentIndex).getArgumentName().equals(argumentName)) searchResult = FOUND; else argumentIndex++; } if (searchResult == FOUND) return argumentIndex; else return NOT_FOUND; } else return NOT_FOUND; } /** * Gets argument from the expression. * * * @param argumentName the argument name * * @return The argument if the argument name was found, * otherwise returns null. * * @see Argument * @see RecursiveArgument */ public Argument getArgument(String argumentName) { int argumentIndex = getArgumentIndex(argumentName); if (argumentIndex == NOT_FOUND) return null; else return argumentsList.get(argumentIndex); } /** * Gets argument from the expression. * * @param argumentIndex the argument index * * @return Argument if the argument index is between 0 and * the last available argument index (getArgumentsNumber()-1), * otherwise returns null. * * @see Argument * @see RecursiveArgument */ public Argument getArgument(int argumentIndex) { if ( (argumentIndex < 0) || (argumentIndex >= argumentsList.size()) ) return null; else return argumentsList.get(argumentIndex); } /** * Gets number of arguments associated with the expression. * * @return The number of arguments (int >= 0) * * @see Argument * @see RecursiveArgument */ public int getArgumentsNumber() { return argumentsList.size(); } /** * Sets argument value. * * @param argumentName the argument name * @param argumentValue the argument value */ public void setArgumentValue(String argumentName, double argumentValue) { int argumentIndex = getArgumentIndex(argumentName); if (argumentIndex != NOT_FOUND) argumentsList.get(argumentIndex).setArgumentValue(argumentValue); } /** * Gets argument vale. * * @param argumentName the argument name * * @return Argument value if argument name was found, * otherwise return Double.NaN. */ public double getArgumentValue(String argumentName) { int argumentIndex = getArgumentIndex(argumentName); if (argumentIndex != NOT_FOUND) return argumentsList.get(argumentIndex).getArgumentValue(); else return Double.NaN; } /** * Removes first occurrences of the arguments * associated with the expression. * * @param argumentsNames the arguments names * (variadic parameters) comma separated * list * * @see Argument * @see RecursiveArgument */ public void removeArguments(String... argumentsNames) { for (String argumentName : argumentsNames) { int argumentIndex = getArgumentIndex(argumentName); if (argumentIndex != NOT_FOUND) { Argument arg = argumentsList.get(argumentIndex); arg.removeRelatedExpression(this); argumentsList.remove(argumentIndex); } } setExpressionModifiedFlag(); } /** * Removes first occurrences of the arguments * associated with the expression. * * @param arguments the arguments (variadic parameters) * comma separated list * * @see Argument * @see RecursiveArgument */ public void removeArguments(Argument... arguments) { for (Argument argument : arguments) { if (argument != null) { argumentsList.remove(argument); argument.removeRelatedExpression(this); } } setExpressionModifiedFlag(); } /** * Removes all arguments associated with the expression. * * @see Argument * @see RecursiveArgument */ public void removeAllArguments() { for (Argument arg : argumentsList) arg.removeRelatedExpression(this); argumentsList.clear(); setExpressionModifiedFlag(); } /*================================================= * * Constants handling API * *================================================= */ /** * Adds constants (variadic parameters) to the expression definition. * * @param constants the constants * (comma separated list) * * @see Constant */ public void addConstants(Constant... constants) { for (Constant constant : constants) { if (constant != null) { constantsList.add(constant); constant.addRelatedExpression(this); } } setExpressionModifiedFlag(); } /** * Adds constants to the expression definition. * * @param constantsList the list of constants * * @see Constant */ public void addConstants( List constantsList) { this.constantsList.addAll( constantsList ); for (Constant c : constantsList) c.addRelatedExpression(this); setExpressionModifiedFlag(); } /** * Enables to define the constant (associated with * the expression) based on the constant name and * constant value. * * @param constantName the constant name * @param constantValue the constant value * * @see Constant */ public void defineConstant(String constantName, double constantValue) { Constant c = new Constant(constantName, constantValue); c.addRelatedExpression(this); constantsList.add(c); setExpressionModifiedFlag(); } /** * Gets constant index associated with the expression. * * @param constantName the constant name * * @return Constant index if constant name was found, * otherwise return Constant.NOT_FOUND. * * @see Constant */ public int getConstantIndex(String constantName) { int constantsNumber = constantsList.size(); if (constantsNumber > 0) { int constantIndex = 0; int searchResult = NOT_FOUND; while ((constantIndex < constantsNumber)&&(searchResult == NOT_FOUND)) { if (constantsList.get(constantIndex).getConstantName().equals(constantName)) searchResult = FOUND; else constantIndex++; } if (searchResult == FOUND) return constantIndex; else return NOT_FOUND; } else return NOT_FOUND; } /** * Gets constant associated with the expression. * * @param constantName the constant name * * @return Constant if constant name was found, * otherwise return null. * * @see Constant */ public Constant getConstant(String constantName) { int constantIndex = getConstantIndex(constantName); if (constantIndex == NOT_FOUND) return null; else return constantsList.get(constantIndex); } /** * Gets constant associated with the expression. * * @param constantIndex the constant index * * @return Constant if the constantIndex is between * 0 and the last available constant index * (getConstantsNumber() - 1), * otherwise it returns null. * * @see Constant */ public Constant getConstant(int constantIndex) { if ( (constantIndex < 0) || (constantIndex >= constantsList.size()) ) return null; else return constantsList.get(constantIndex); } /** * Gets number of constants associated with the expression. * * @return number of constants (int >= 0) * * @see Constant */ public int getConstantsNumber() { return constantsList.size(); } /** * Removes first occurrences of the constants * associated with the expression. * * @param constantsNames the constants names (variadic parameters) * comma separated list * * @see Constant */ public void removeConstants(String... constantsNames) { for (String constantName : constantsNames) { int constantIndex = getConstantIndex(constantName); if (constantIndex != NOT_FOUND) { Constant c = constantsList.get(constantIndex); c.removeRelatedExpression(this); constantsList.remove( constantIndex ); } } setExpressionModifiedFlag(); } /** * Removes first occurrences of the constants * associated with the expression * * @param constants the constants (variadic parameters) * comma separated list * * @see Constant */ public void removeConstants(Constant... constants) { for (Constant constant : constants) { if (constant != null) { constantsList.remove(constant); constant.removeRelatedExpression(this); setExpressionModifiedFlag(); } } } /** * Removes all constants * associated with the expression * * @see Constant */ public void removeAllConstants() { for (Constant c : constantsList) c.removeRelatedExpression(this); constantsList.clear(); setExpressionModifiedFlag(); } /*================================================= * * Functions handling API * *================================================= */ /** * Adds functions (variadic parameters) to the expression definition. * * @param functions the functions * (variadic parameters) comma separated list * * @see Function */ public void addFunctions(Function... functions) { for (Function f : functions) { if (f != null) { functionsList.add(f); if (f.getFunctionBodyType() == Function.BODY_RUNTIME) f.addRelatedExpression(this); } } setExpressionModifiedFlag(); } /** * Enables to define the function (associated with * the expression) based on the function name, * function expression string and arguments names (variadic parameters). * * @param functionName the function name * @param functionExpressionString the expression string * @param argumentsNames the function arguments names * (variadic parameters) * comma separated list * * @see Function */ public void defineFunction(String functionName, String functionExpressionString, String... argumentsNames) { Function f = new Function(functionName, functionExpressionString, argumentsNames); functionsList.add(f); f.addRelatedExpression(this); setExpressionModifiedFlag(); } /** * Gets index of function associated with the expression. * * @param functionName the function name * * @return Function index if function name was found, * otherwise returns Function.NOT_FOUND * * @see Function */ public int getFunctionIndex(String functionName) { int functionsNumber = functionsList.size(); if (functionsNumber > 0) { int functionIndex = 0; int searchResult = NOT_FOUND; while ((functionIndex < functionsNumber) && (searchResult == NOT_FOUND)) { if (functionsList.get(functionIndex).getFunctionName(). equals(functionName)) searchResult = FOUND; else functionIndex++; } if (searchResult == FOUND) return functionIndex; else return NOT_FOUND; } else return NOT_FOUND; } /** * Gets function associated with the expression. * * @param functionName the function name * * @return Function if function name was found, * otherwise returns null. * * @see Function */ public Function getFunction(String functionName) { int functionIndex = getFunctionIndex(functionName); if (functionIndex == NOT_FOUND) return null; else return functionsList.get(functionIndex); } /** * Gets function associated with the expression. * * @param functionIndex the function index * * @return Function if function index is between 0 and * the last available function index (getFunctionsNumber()-1), * otherwise returns null. * * @see Function */ public Function getFunction(int functionIndex) { if ( (functionIndex < 0) || (functionIndex >= functionsList.size()) ) return null; else return functionsList.get(functionIndex); } /** * Gets number of functions associated with the expression. * * @return number of functions (int >= 0) * * @see Function */ public int getFunctionsNumber() { return functionsList.size(); } /** * Removes first occurrences of the functions * associated with the expression. * * @param functionsNames the functions names (variadic parameters) * comma separated list * * @see Function */ public void removeFunctions(String... functionsNames) { for (String functionName : functionsNames) { int functionIndex = getFunctionIndex(functionName); if (functionIndex != NOT_FOUND) { Function f = functionsList.get(functionIndex); f.removeRelatedExpression(this); functionsList.remove(f); } } setExpressionModifiedFlag(); } /** * Removes first occurrences of the functions * associated with the expression. * * @param functions the functions (variadic parameters) * comma separated list. * * @see Function */ public void removeFunctions(Function... functions) { for (Function function : functions) { if (function != null) { function.removeRelatedExpression(this); functionsList.remove(function); } } setExpressionModifiedFlag(); } /** * Removes all functions * associated with the expression. * * @see Function */ public void removeAllFunctions() { for (Function f : functionsList) f.removeRelatedExpression(this); functionsList.clear(); setExpressionModifiedFlag(); } /*================================================= * * Common methods (supporting calculations) * *================================================= */ /** * Sets given token to the number type / value. * Method should be called only by the SetDecreaseRemove like methods * * @param pos the position on which token * should be updated to the given number * @param number the number * @param ulpRound If true, then if {@link mXparser#ulpRounding} = true * intelligent ULP rounding is applied. */ private void setToNumber(int pos, double number, boolean ulpRound) { Token token = tokensList.get(pos); if ( (mXparser.ulpRounding) && (disableRounding == false) ){ if (ulpRound) { if ( (Double.isNaN(number) ) || (Double.isInfinite(number)) ) token.tokenValue = number; else { int precision = MathFunctions.ulpDecimalDigitsBefore(number); if (precision >= 0) token.tokenValue = MathFunctions.round(number, precision); else token.tokenValue = number; } } else { token.tokenValue = number; } } else { token.tokenValue = number; } token.tokenTypeId = ParserSymbol.NUMBER_TYPE_ID; token.tokenId = ParserSymbol.NUMBER_ID; token.keyWord = ParserSymbol.NUMBER_STR; } private void setToNumber(int pos, double number) { setToNumber(pos, number, false); } /** * SetDecreaseRemove for 1 arg functions * * SetDecreaseRemove like methods are called by the methods * calculating values of the unary operation, binary relations * and functions. * * 3 things are done by this type of methods * 1) Set token type to number type / value * 2) Decrease level of the token * 3) Remove no longer needed tokens * * For example: * * Expression string: 1+cos(0) * will be tokened as follows: * * idx : 0 1 2 3 4 5 * token : 1 + cos ( 0 ) * level : 0 0 1 2 2 2 * * Partitions with the highest level will be handled first. * In the case presented above, it means, that the parenthesis will be removed * * idx : 0 1 2 3 * token : 1 + cos 0 * level : 0 0 1 2 * * Next step is to calculate cos(0) = 1 * * SetDecreaseRemove like methods * * 1) Set cos token to 1 (pos=2, result=1): * idx : 0 1 2 3 * token : 1 + 1 0 * level : 0 0 1 2 * * 2) Decrease level (pos=2): * idx : 0 1 2 3 * token : 1 + 1 0 * level : 0 0 0 2 * * 3) Remove no longer needed tokens (pos+1=3): * idx : 0 1 2 * token : 1 + 1 * level : 0 0 0 * * @param pos the position on which token * should be updated to the given number * @param result the number * @param ulpRound If true, then if {@link mXparser#ulpRounding} = true * intelligent ULP rounding is applied. */ private void f1SetDecreaseRemove(int pos, double result, boolean ulpRound) { setToNumber(pos, result, ulpRound); tokensList.get(pos).tokenLevel--; tokensList.remove(pos+1); } private void f1SetDecreaseRemove(int pos, double result) { f1SetDecreaseRemove(pos, result, false); } /** * SetDecreaseRemove for 2-args functions * * For detailed specification refer to the * f1SetDecreaseRemove() * * @param pos the position on which token * should be updated to the given number * @param result the number * @param ulpRound If true, then if {@link mXparser#ulpRounding} = true * intelligent ULP rounding is applied. */ private void f2SetDecreaseRemove(int pos, double result, boolean ulpRound) { setToNumber(pos, result, ulpRound); tokensList.get(pos).tokenLevel--; tokensList.remove(pos+2); tokensList.remove(pos+1); } private void f2SetDecreaseRemove(int pos, double result) { f2SetDecreaseRemove(pos, result, false); } /** * SetDecreaseRemove for 3-args functions * * For detailed specification refer to the * f1SetDecreaseRemove() * * @param pos the position on which token * should be updated to the given number * @param result the number * @param ulpRound If true, then if {@link mXparser#ulpRounding} = true * intelligent ULP rounding is applied. */ private void f3SetDecreaseRemove(int pos, double result, boolean ulpRound) { setToNumber(pos, result, ulpRound); tokensList.get(pos).tokenLevel--; tokensList.remove(pos+3); tokensList.remove(pos+2); tokensList.remove(pos+1); } private void f3SetDecreaseRemove(int pos, double result) { f3SetDecreaseRemove(pos, result, false); } /** * SetDecreaseRemove for operators * * For detailed specification refer to the * f1SetDecreaseRemove() * * @param pos the position on which token * should be updated to the given number * @param result the number * @param ulpRound If true, then if {@link mXparser#ulpRounding} = true * intelligent ULP rounding is applied. */ private void opSetDecreaseRemove(int pos, double result, boolean ulpRound) { setToNumber(pos, result, ulpRound); tokensList.remove(pos+1); tokensList.remove(pos-1); } private void opSetDecreaseRemove(int pos, double result) { opSetDecreaseRemove(pos, result, false); } /** * SetDecreaseRemove for calculus operators. * * For detailed specification refer to the * f1SetDecreaseRemove() * * @param pos the position on which token * should be updated to the given number * @param result the number * @param ulpRound If true, then if {@link mXparser#ulpRounding} = true * intelligent ULP rounding is applied. */ private void calcSetDecreaseRemove(int pos, double result, boolean ulpRound) { setToNumber(pos, result, ulpRound); tokensList.get(pos).tokenLevel--; /* * left parenthesis position */ int lPos = pos+1; /* * Evaluate right parenthesis position */ int rPos = lPos+1; while ( !( ( tokensList.get(rPos).tokenTypeId == ParserSymbol.TYPE_ID ) && ( tokensList.get(rPos).tokenId == ParserSymbol.RIGHT_PARENTHESES_ID ) && ( tokensList.get(rPos).tokenLevel == tokensList.get(lPos).tokenLevel) ) ) rPos++; for (int p = rPos; p >= lPos; p--) tokensList.remove(p); } private void calcSetDecreaseRemove(int pos, double result) { calcSetDecreaseRemove(pos, result, false); } /** * SetDecreaseRemove for special functions. * * For detailed specification refer to the * f1SetDecreaseRemove() * * @param pos the position on which token * should be updated to the given number * @param result the number * @param length the special function range * @param ulpRound If true, then if {@link mXparser#ulpRounding} = true * intelligent ULP rounding is applied. */ private void variadicSetDecreaseRemove(int pos, double value, int length, boolean ulpRound) { setToNumber(pos, value, ulpRound); tokensList.get(pos).tokenLevel--; for (int p = pos + length; p > pos; p--) tokensList.remove(p); } private void variadicSetDecreaseRemove(int pos, double value, int length) { variadicSetDecreaseRemove(pos, value, length, false); } /** * If set remove method for the if function. * * @param pos the position * @param ifCondition the result of if condition * @param ulpRound If true, then if {@link mXparser#ulpRounding} = true * intelligent ULP rounding is applied. */ private void ifSetRemove(int pos, double ifCondition, boolean ulpRound) { /* * left parethesis position */ int lPos = pos+1; int ifLevel = tokensList.get(lPos).tokenLevel; /* * Evaluate 1 comma position on the same level */ int c1Pos = lPos+1; while ( !( ( tokensList.get(c1Pos).tokenTypeId == ParserSymbol.TYPE_ID ) && ( tokensList.get(c1Pos).tokenId == ParserSymbol.COMMA_ID ) && ( tokensList.get(c1Pos).tokenLevel == ifLevel) ) ) c1Pos++; /* * Evaluate 2 comma position on the same level */ int c2Pos = c1Pos+1; while ( !( ( tokensList.get(c2Pos).tokenTypeId == ParserSymbol.TYPE_ID ) && ( tokensList.get(c2Pos).tokenId == ParserSymbol.COMMA_ID ) && ( tokensList.get(c2Pos).tokenLevel == ifLevel) ) ) c2Pos++; /* * Evaluate right parenthesis position */ int rPos = c2Pos+1; while ( !( ( tokensList.get(rPos).tokenTypeId == ParserSymbol.TYPE_ID ) && ( tokensList.get(rPos).tokenId == ParserSymbol.RIGHT_PARENTHESES_ID ) && ( tokensList.get(rPos).tokenLevel == ifLevel) ) ) rPos++; if ( !Double.isNaN(ifCondition) ) { if (ifCondition != 0) { setToNumber(c2Pos+1, Double.NaN); tokensList.get(c2Pos+1).tokenLevel = ifLevel; removeTokens(c2Pos+2, rPos-1); } else { setToNumber(c1Pos+1, Double.NaN); tokensList.get(c1Pos+1).tokenLevel = ifLevel; removeTokens(c1Pos+2, c2Pos-1); } } else { setToNumber(c1Pos+1, Double.NaN); setToNumber(c2Pos+1, Double.NaN); tokensList.get(c1Pos+1).tokenLevel = ifLevel; tokensList.get(c2Pos+1).tokenLevel = ifLevel; removeTokens(c2Pos+2, rPos-1); removeTokens(c1Pos+2, c2Pos-1); } setToNumber(lPos+1, ifCondition, ulpRound); tokensList.get(lPos+1).tokenLevel = ifLevel; removeTokens(lPos+2, c1Pos-1); tokensList.get(pos).tokenId = Function3Arg.IF_ID; } private void removeTokens(int from, int to) { if (from < to) { for (int p = to; p >= from; p--) tokensList.remove(p); } else if (from == to) tokensList.remove(from); } private void ifSetRemove(int pos, double ifCondition) { ifSetRemove(pos, ifCondition, false); } /** * Creates string tokens list from the subexpression. * * @param startPos start position (index) * @param endPos end position (index) * * @return tokens list representing requested subexpression. */ private List createInitialTokens(int startPos, int endPos, List tokensList) { List tokens = new ArrayList(); Token t; for (int p = startPos; p<= endPos; p++) { t = tokensList.get(p).clone(); tokens.add(t); } return tokens; } /** * Return number of functions parameters. * * @param pos the function position */ private int getParametersNumber(int pos) { int lPpos = pos+1; if (lPpos == initialTokens.size()) return -1; if ( (initialTokens.get(lPpos).tokenTypeId == ParserSymbol.TYPE_ID) && (initialTokens.get(lPpos).tokenId == ParserSymbol.LEFT_PARENTHESES_ID) ) { int tokenLevel = initialTokens.get(lPpos).tokenLevel; /* * Evaluate right parenthesis position */ int endPos = lPpos+1; while ( !( ( initialTokens.get(endPos).tokenTypeId == ParserSymbol.TYPE_ID ) && ( initialTokens.get(endPos).tokenId == ParserSymbol.RIGHT_PARENTHESES_ID ) && ( initialTokens.get(endPos).tokenLevel == tokenLevel) ) ) endPos++; if (endPos == lPpos + 1) return 0; /* * Evaluate number of parameters by * counting number of ',' between parenthesis */ int numberOfCommas = 0; for (int p = lPpos; p < endPos; p++) { Token token = initialTokens.get(p); if ( (token.tokenTypeId == ParserSymbol.TYPE_ID) && (token.tokenId == ParserSymbol.COMMA_ID) && (token.tokenLevel == tokenLevel) ) numberOfCommas++; } return numberOfCommas + 1; } else { return -1; } } /** * Returns list of the functions parameters. * * @param pos the function position * @param tokensList the tokens list * * @return the list of function parameters * * @see FunctionParameter */ private List getFunctionParameters(int pos, List tokensList) { List functionParameters = new ArrayList(); int cPos = pos+2; int tokenLevel = tokensList.get(pos+1).tokenLevel; int pPos = cPos; boolean comma; boolean paren; boolean end = false; List paramTkones = new ArrayList(); String paramStr = ""; do { Token t = tokensList.get(cPos); comma = false; paren = false; if (t.tokenLevel == tokenLevel) if (t.tokenTypeId == ParserSymbol.TYPE_ID) { if (t.tokenId == ParserSymbol.RIGHT_PARENTHESES_ID) paren = true; else if (t.tokenId == ParserSymbol.COMMA_ID) comma = true; } if ( (paren == true) || (comma == true) ) { if (cPos > pos + 2) { functionParameters.add( new FunctionParameter(paramTkones, paramStr, pPos, cPos-1 ) ); paramTkones = new ArrayList(); paramStr = ""; pPos = cPos+1; } } else { paramTkones.add(t); paramStr = paramStr + t.tokenStr; } if (paren) end = true; else cPos++; } while (!end); return functionParameters; } /** * Gets / returns argument representing given argument name. If * argument name exists on the list of known arguments * the the initial status of the found argument is remembered, otherwise new * argument will be created. * * @param argumentName the argument name * * @return Argument parameter representing given argument name: * * * @see ArgumentParameter * @see Argument */ private ArgumentParameter getParamArgument(String argumentName) { ArgumentParameter argParam = new ArgumentParameter(); argParam.index = getArgumentIndex(argumentName); argParam.argument = getArgument(argParam.index); argParam.presence = FOUND; if (argParam.argument == null) { argParam.argument = new Argument(argumentName); argumentsList.add(argParam.argument); argParam.index = argumentsList.size()-1; argParam.presence = NOT_FOUND; } else { argParam.initialValue = argParam.argument.argumentValue; argParam.initialType = argParam.argument.argumentType; argParam.argument.argumentValue = argParam.argument.getArgumentValue(); argParam.argument.argumentType = Argument.FREE_ARGUMENT; } return argParam; } /** * Clears argument parameter. * * @param argParam the argument parameter. */ private void clearParamArgument(ArgumentParameter argParam) { if (argParam.presence == NOT_FOUND) argumentsList.remove(argParam.index); else { argParam.argument.argumentValue = argParam.initialValue; argParam.argument.argumentType = argParam.initialType; } } /*================================================= * * Math implementations * *================================================= */ /** * Free Arguments handling. * * @param pos the token position */ private void FREE_ARGUMENT(int pos) { Argument argument = argumentsList.get( tokensList.get(pos).tokenId); boolean argumentVerboseMode = argument.getVerboseMode(); if (verboseMode == true) argument.setVerboseMode(); setToNumber(pos, argument.getArgumentValue()); if (argumentVerboseMode == false) argument.setSilentMode(); } /** * Dependent Arguments handling. * * @param pos the token position */ private void DEPENDENT_ARGUMENT(int pos) { Argument argument = argumentsList.get( tokensList.get(pos).tokenId); boolean argumentVerboseMode = argument.getVerboseMode(); if (verboseMode == true) argument.setVerboseMode(); /* * Handling possible recursive calls that can change * the structure of the tokens list, i.e. * * Argument x = new Argument("x = 2*y"); * Argument y = new Argument("y = 2*x"); * x.addDefinitions(y); * y.addDefinitions(x); * x.getArgumentValue(); */ int tokensListSizeBefore = tokensList.size(); Token tokenBefore = tokensList.get(pos); double argumentValue = argument.getArgumentValue(); int tokensListSizeAfter = tokensList.size(); if (tokensListSizeBefore == tokensListSizeAfter) { Token tokenAfter = tokensList.get(pos); if ( (tokenBefore.tokenTypeId == tokenAfter.tokenTypeId) && (tokenBefore.tokenId == tokenAfter.tokenId) ) { setToNumber(pos, argumentValue); } } if (argumentVerboseMode == false) argument.setSilentMode(); } /** * User functions handling. * * @param pos the token position */ private void USER_FUNCTION(int pos) { Function function; Function fun = functionsList.get( tokensList.get(pos).tokenId ); if (fun.getRecursiveMode() == true) { function = fun.clone(); function.functionExpression.recursionCallsCounter = recursionCallsCounter; } else function = fun; function.functionExpression.UDFVariadicParamsAtRunTime = getNumbers(pos); int argsNumber = function.getParametersNumber(); if (function.isVariadic == false) for (int argIdx = 0; argIdx < argsNumber; argIdx++) function.setArgumentValue(argIdx, tokensList.get(pos + argIdx + 1).tokenValue); boolean functionVerboseMode = function.getVerboseMode(); if (verboseMode == true) function.setVerboseMode(); /* * Handling possible recursive calls that can change * the structure of the tokens list, i.e. * * Function f = new Function("f(x) = 2*g(x)"); * Function g = new Function("g(x) = 2*f(x)"); * f.addDefinitions(g); * g.addDefinitions(f); */ int tokensListSizeBefore = tokensList.size(); Token tokenBefore = tokensList.get(pos); double value; try { value = function.calculate(); } catch(StackOverflowError soe){ value = Double.NaN; errorMessage = soe.getMessage(); } int tokensListSizeAfter = tokensList.size(); if (tokensListSizeBefore == tokensListSizeAfter) { Token tokenAfter = tokensList.get(pos); if ( (tokenBefore.tokenTypeId == tokenAfter.tokenTypeId) && (tokenBefore.tokenId == tokenAfter.tokenId) ) { setToNumber(pos, value); tokensList.get(pos).tokenLevel--; for (int argIdx = argsNumber; argIdx > 0 ; argIdx--) tokensList.remove(pos+argIdx); } } if (functionVerboseMode == false) function.setSilentMode(); } /** * User constants handling. * * @param pos the token position */ private void USER_CONSTANT(int pos) { Constant constant = constantsList.get( tokensList.get(pos).tokenId ); setToNumber(pos, constant.getConstantValue()); } /** * Recursive arguments handling. * * @param pos the token position */ private void RECURSIVE_ARGUMENT(int pos) { double index = tokensList.get(pos+1).tokenValue; RecursiveArgument argument = (RecursiveArgument)argumentsList.get( tokensList.get(pos).tokenId ); boolean argumentVerboseMode = argument.getVerboseMode(); if (verboseMode == true) argument.setVerboseMode(); double result = argument.getArgumentValue(index); f1SetDecreaseRemove(pos, result); if (argumentVerboseMode == false) argument.setSilentMode(); } /** * Constants handling. * * @param pos the token position */ private void CONSTANT(int pos) { double constValue = Double.NaN; switch (tokensList.get(pos).tokenId) { case ConstantValue.PI_ID: constValue = MathConstants.PI; break; case ConstantValue.EULER_ID: constValue = MathConstants.E; break; case ConstantValue.EULER_MASCHERONI_ID: constValue = MathConstants.EULER_MASCHERONI; break; case ConstantValue.GOLDEN_RATIO_ID: constValue = MathConstants.GOLDEN_RATIO; break; case ConstantValue.PLASTIC_ID: constValue = MathConstants.PLASTIC; break; case ConstantValue.EMBREE_TREFETHEN_ID: constValue = MathConstants.EMBREE_TREFETHEN; break; case ConstantValue.FEIGENBAUM_DELTA_ID: constValue = MathConstants.FEIGENBAUM_DELTA; break; case ConstantValue.FEIGENBAUM_ALFA_ID: constValue = MathConstants.FEIGENBAUM_ALFA; break; case ConstantValue.TWIN_PRIME_ID: constValue = MathConstants.TWIN_PRIME; break; case ConstantValue.MEISSEL_MERTEENS_ID: constValue = MathConstants.MEISSEL_MERTEENS; break; case ConstantValue.BRAUN_TWIN_PRIME_ID: constValue = MathConstants.BRAUN_TWIN_PRIME; break; case ConstantValue.BRAUN_PRIME_QUADR_ID: constValue = MathConstants.BRAUN_PRIME_QUADR; break; case ConstantValue.BRUIJN_NEWMAN_ID: constValue = MathConstants.BRUIJN_NEWMAN; break; case ConstantValue.CATALAN_ID: constValue = MathConstants.CATALAN; break; case ConstantValue.LANDAU_RAMANUJAN_ID: constValue = MathConstants.LANDAU_RAMANUJAN; break; case ConstantValue.VISWANATH_ID: constValue = MathConstants.VISWANATH; break; case ConstantValue.LEGENDRE_ID: constValue = MathConstants.LEGENDRE; break; case ConstantValue.RAMANUJAN_SOLDNER_ID: constValue = MathConstants.RAMANUJAN_SOLDNER; break; case ConstantValue.ERDOS_BORWEIN_ID: constValue = MathConstants.ERDOS_BORWEIN; break; case ConstantValue.BERNSTEIN_ID: constValue = MathConstants.BERNSTEIN; break; case ConstantValue.GAUSS_KUZMIN_WIRSING_ID: constValue = MathConstants.GAUSS_KUZMIN_WIRSING; break; case ConstantValue.HAFNER_SARNAK_MCCURLEY_ID: constValue = MathConstants.HAFNER_SARNAK_MCCURLEY; break; case ConstantValue.GOLOMB_DICKMAN_ID: constValue = MathConstants.GOLOMB_DICKMAN; break; case ConstantValue.CAHEN_ID: constValue = MathConstants.CAHEN; break; case ConstantValue.LAPLACE_LIMIT_ID: constValue = MathConstants.LAPLACE_LIMIT; break; case ConstantValue.ALLADI_GRINSTEAD_ID: constValue = MathConstants.ALLADI_GRINSTEAD; break; case ConstantValue.LENGYEL_ID: constValue = MathConstants.LENGYEL; break; case ConstantValue.LEVY_ID: constValue = MathConstants.LEVY; break; case ConstantValue.APERY_ID: constValue = MathConstants.APERY; break; case ConstantValue.MILLS_ID: constValue = MathConstants.MILLS; break; case ConstantValue.BACKHOUSE_ID: constValue = MathConstants.BACKHOUSE; break; case ConstantValue.PORTER_ID: constValue = MathConstants.PORTER; break; case ConstantValue.LIEB_QUARE_ICE_ID: constValue = MathConstants.LIEB_QUARE_ICE; break; case ConstantValue.NIVEN_ID: constValue = MathConstants.NIVEN; break; case ConstantValue.SIERPINSKI_ID: constValue = MathConstants.SIERPINSKI; break; case ConstantValue.KHINCHIN_ID: constValue = MathConstants.KHINCHIN; break; case ConstantValue.FRANSEN_ROBINSON_ID: constValue = MathConstants.FRANSEN_ROBINSON; break; case ConstantValue.LANDAU_ID: constValue = MathConstants.LANDAU; break; case ConstantValue.PARABOLIC_ID: constValue = MathConstants.PARABOLIC; break; case ConstantValue.OMEGA_ID: constValue = MathConstants.OMEGA; break; case ConstantValue.MRB_ID: constValue = MathConstants.MRB; break; case ConstantValue.LI2_ID: constValue = MathConstants.LI2; break; case ConstantValue.GOMPERTZ_ID: constValue = MathConstants.GOMPERTZ; break; case ConstantValue.LIGHT_SPEED_ID: constValue = PhysicalConstants.LIGHT_SPEED; break; case ConstantValue.GRAVITATIONAL_CONSTANT_ID: constValue = PhysicalConstants.GRAVITATIONAL_CONSTANT; break; case ConstantValue.GRAVIT_ACC_EARTH_ID: constValue = PhysicalConstants.GRAVIT_ACC_EARTH; break; case ConstantValue.PLANCK_CONSTANT_ID: constValue = PhysicalConstants.PLANCK_CONSTANT; break; case ConstantValue.PLANCK_CONSTANT_REDUCED_ID: constValue = PhysicalConstants.PLANCK_CONSTANT_REDUCED; break; case ConstantValue.PLANCK_LENGTH_ID: constValue = PhysicalConstants.PLANCK_LENGTH; break; case ConstantValue.PLANCK_MASS_ID: constValue = PhysicalConstants.PLANCK_MASS; break; case ConstantValue.PLANCK_TIME_ID: constValue = PhysicalConstants.PLANCK_TIME; break; case ConstantValue.LIGHT_YEAR_ID: constValue = AstronomicalConstants.LIGHT_YEAR; break; case ConstantValue.ASTRONOMICAL_UNIT_ID: constValue = AstronomicalConstants.ASTRONOMICAL_UNIT; break; case ConstantValue.PARSEC_ID: constValue = AstronomicalConstants.PARSEC; break; case ConstantValue.KILOPARSEC_ID: constValue = AstronomicalConstants.KILOPARSEC; break; case ConstantValue.EARTH_RADIUS_EQUATORIAL_ID: constValue = AstronomicalConstants.EARTH_RADIUS_EQUATORIAL; break; case ConstantValue.EARTH_RADIUS_POLAR_ID: constValue = AstronomicalConstants.EARTH_RADIUS_POLAR; break; case ConstantValue.EARTH_RADIUS_MEAN_ID: constValue = AstronomicalConstants.EARTH_RADIUS_MEAN; break; case ConstantValue.EARTH_MASS_ID: constValue = AstronomicalConstants.EARTH_MASS; break; case ConstantValue.EARTH_SEMI_MAJOR_AXIS_ID: constValue = AstronomicalConstants.EARTH_SEMI_MAJOR_AXIS; break; case ConstantValue.MOON_RADIUS_MEAN_ID: constValue = AstronomicalConstants.MOON_RADIUS_MEAN; break; case ConstantValue.MOON_MASS_ID: constValue = AstronomicalConstants.MOON_MASS; break; case ConstantValue.MONN_SEMI_MAJOR_AXIS_ID: constValue = AstronomicalConstants.MONN_SEMI_MAJOR_AXIS; break; case ConstantValue.SOLAR_RADIUS_ID: constValue = AstronomicalConstants.SOLAR_RADIUS; break; case ConstantValue.SOLAR_MASS_ID: constValue = AstronomicalConstants.SOLAR_MASS; break; case ConstantValue.MERCURY_RADIUS_MEAN_ID: constValue = AstronomicalConstants.MERCURY_RADIUS_MEAN; break; case ConstantValue.MERCURY_MASS_ID: constValue = AstronomicalConstants.MERCURY_MASS; break; case ConstantValue.MERCURY_SEMI_MAJOR_AXIS_ID: constValue = AstronomicalConstants.MERCURY_SEMI_MAJOR_AXIS; break; case ConstantValue.VENUS_RADIUS_MEAN_ID: constValue = AstronomicalConstants.VENUS_RADIUS_MEAN; break; case ConstantValue.VENUS_MASS_ID: constValue = AstronomicalConstants.VENUS_MASS; break; case ConstantValue.VENUS_SEMI_MAJOR_AXIS_ID: constValue = AstronomicalConstants.VENUS_SEMI_MAJOR_AXIS; break; case ConstantValue.MARS_RADIUS_MEAN_ID: constValue = AstronomicalConstants.MARS_RADIUS_MEAN; break; case ConstantValue.MARS_MASS_ID: constValue = AstronomicalConstants.MARS_MASS; break; case ConstantValue.MARS_SEMI_MAJOR_AXIS_ID: constValue = AstronomicalConstants.MARS_SEMI_MAJOR_AXIS; break; case ConstantValue.JUPITER_RADIUS_MEAN_ID: constValue = AstronomicalConstants.JUPITER_RADIUS_MEAN; break; case ConstantValue.JUPITER_MASS_ID: constValue = AstronomicalConstants.JUPITER_MASS; break; case ConstantValue.JUPITER_SEMI_MAJOR_AXIS_ID: constValue = AstronomicalConstants.JUPITER_SEMI_MAJOR_AXIS; break; case ConstantValue.SATURN_RADIUS_MEAN_ID: constValue = AstronomicalConstants.SATURN_RADIUS_MEAN; break; case ConstantValue.SATURN_MASS_ID: constValue = AstronomicalConstants.SATURN_MASS; break; case ConstantValue.SATURN_SEMI_MAJOR_AXIS_ID: constValue = AstronomicalConstants.SATURN_SEMI_MAJOR_AXIS; break; case ConstantValue.URANUS_RADIUS_MEAN_ID: constValue = AstronomicalConstants.URANUS_RADIUS_MEAN; break; case ConstantValue.URANUS_MASS_ID: constValue = AstronomicalConstants.URANUS_MASS; break; case ConstantValue.URANUS_SEMI_MAJOR_AXIS_ID: constValue = AstronomicalConstants.URANUS_SEMI_MAJOR_AXIS; break; case ConstantValue.NEPTUNE_RADIUS_MEAN_ID: constValue = AstronomicalConstants.NEPTUNE_RADIUS_MEAN; break; case ConstantValue.NEPTUNE_MASS_ID: constValue = AstronomicalConstants.NEPTUNE_MASS; break; case ConstantValue.NEPTUNE_SEMI_MAJOR_AXIS_ID: constValue = AstronomicalConstants.NEPTUNE_SEMI_MAJOR_AXIS; break; case ConstantValue.TRUE_ID: constValue = BooleanAlgebra.TRUE; break; case ConstantValue.FALSE_ID: constValue = BooleanAlgebra.FALSE; break; case ConstantValue.NAN_ID: constValue = MathConstants.NOT_A_NUMBER; break; case ConstantValue.NPAR_ID: constValue = UDFVariadicParamsAtRunTime.size(); break; } setToNumber(pos, constValue); } /** * Constants handling. * * @param pos the token position */ private void UNIT(int pos) { double unitValue = Double.NaN; switch (tokensList.get(pos).tokenId) { /* Ratio, Fraction */ case Unit.PERC_ID: unitValue = Units.PERC; break; case Unit.PROMIL_ID: unitValue = Units.PROMIL; break; /* Metric prefixes */ case Unit.YOTTA_ID: unitValue = Units.YOTTA; break; case Unit.ZETTA_ID: unitValue = Units.ZETTA; break; case Unit.EXA_ID: unitValue = Units.EXA; break; case Unit.PETA_ID: unitValue = Units.PETA; break; case Unit.TERA_ID: unitValue = Units.TERA; break; case Unit.GIGA_ID: unitValue = Units.GIGA; break; case Unit.MEGA_ID: unitValue = Units.MEGA; break; case Unit.KILO_ID: unitValue = Units.KILO; break; case Unit.HECTO_ID: unitValue = Units.HECTO; break; case Unit.DECA_ID: unitValue = Units.DECA; break; case Unit.DECI_ID: unitValue = Units.DECI; break; case Unit.CENTI_ID: unitValue = Units.CENTI; break; case Unit.MILLI_ID: unitValue = Units.MILLI; break; case Unit.MICRO_ID: unitValue = Units.MICRO; break; case Unit.NANO_ID: unitValue = Units.NANO; break; case Unit.PICO_ID: unitValue = Units.PICO; break; case Unit.FEMTO_ID: unitValue = Units.FEMTO; break; case Unit.ATTO_ID: unitValue = Units.ATTO; break; case Unit.ZEPTO_ID: unitValue = Units.ZEPTO; break; case Unit.YOCTO_ID: unitValue = Units.YOCTO; break; /* Units of length / distance */ case Unit.METRE_ID: unitValue = Units.METRE; break; case Unit.KILOMETRE_ID: unitValue = Units.KILOMETRE; break; case Unit.CENTIMETRE_ID: unitValue = Units.CENTIMETRE; break; case Unit.MILLIMETRE_ID: unitValue = Units.MILLIMETRE; break; case Unit.INCH_ID: unitValue = Units.INCH; break; case Unit.YARD_ID: unitValue = Units.YARD; break; case Unit.FEET_ID: unitValue = Units.FEET; break; case Unit.MILE_ID: unitValue = Units.MILE; break; case Unit.NAUTICAL_MILE_ID: unitValue = Units.NAUTICAL_MILE; break; /* Units of area */ case Unit.METRE2_ID: unitValue = Units.METRE2; break; case Unit.CENTIMETRE2_ID: unitValue = Units.CENTIMETRE2; break; case Unit.MILLIMETRE2_ID: unitValue = Units.MILLIMETRE2; break; case Unit.ARE_ID: unitValue = Units.ARE; break; case Unit.HECTARE_ID: unitValue = Units.HECTARE; break; case Unit.ACRE_ID: unitValue = Units.ACRE; break; case Unit.KILOMETRE2_ID: unitValue = Units.KILOMETRE2; break; /* Units of volume */ case Unit.MILLIMETRE3_ID: unitValue = Units.MILLIMETRE3; break; case Unit.CENTIMETRE3_ID: unitValue = Units.CENTIMETRE3; break; case Unit.METRE3_ID: unitValue = Units.METRE3; break; case Unit.KILOMETRE3_ID: unitValue = Units.KILOMETRE3; break; case Unit.MILLILITRE_ID: unitValue = Units.MILLILITRE; break; case Unit.LITRE_ID: unitValue = Units.LITRE; break; case Unit.GALLON_ID: unitValue = Units.GALLON; break; case Unit.PINT_ID: unitValue = Units.PINT; break; /* Units of time */ case Unit.SECOND_ID: unitValue = Units.SECOND; break; case Unit.MILLISECOND_ID: unitValue = Units.MILLISECOND; break; case Unit.MINUTE_ID: unitValue = Units.MINUTE; break; case Unit.HOUR_ID: unitValue = Units.HOUR; break; case Unit.DAY_ID: unitValue = Units.DAY; break; case Unit.WEEK_ID: unitValue = Units.WEEK; break; case Unit.JULIAN_YEAR_ID: unitValue = Units.JULIAN_YEAR; break; /* Units of mass */ case Unit.KILOGRAM_ID: unitValue = Units.KILOGRAM; break; case Unit.GRAM_ID: unitValue = Units.GRAM; break; case Unit.MILLIGRAM_ID: unitValue = Units.MILLIGRAM; break; case Unit.DECAGRAM_ID: unitValue = Units.DECAGRAM; break; case Unit.TONNE_ID: unitValue = Units.TONNE; break; case Unit.OUNCE_ID: unitValue = Units.OUNCE; break; case Unit.POUND_ID: unitValue = Units.POUND; break; /* Units of information */ case Unit.BIT_ID: unitValue = Units.BIT; break; case Unit.KILOBIT_ID: unitValue = Units.KILOBIT; break; case Unit.MEGABIT_ID: unitValue = Units.MEGABIT; break; case Unit.GIGABIT_ID: unitValue = Units.GIGABIT; break; case Unit.TERABIT_ID: unitValue = Units.TERABIT; break; case Unit.PETABIT_ID: unitValue = Units.PETABIT; break; case Unit.EXABIT_ID: unitValue = Units.EXABIT; break; case Unit.ZETTABIT_ID: unitValue = Units.ZETTABIT; break; case Unit.YOTTABIT_ID: unitValue = Units.YOTTABIT; break; case Unit.BYTE_ID: unitValue = Units.BYTE; break; case Unit.KILOBYTE_ID: unitValue = Units.KILOBYTE; break; case Unit.MEGABYTE_ID: unitValue = Units.MEGABYTE; break; case Unit.GIGABYTE_ID: unitValue = Units.GIGABYTE; break; case Unit.TERABYTE_ID: unitValue = Units.TERABYTE; break; case Unit.PETABYTE_ID: unitValue = Units.PETABYTE; break; case Unit.EXABYTE_ID: unitValue = Units.EXABYTE; break; case Unit.ZETTABYTE_ID: unitValue = Units.ZETTABYTE; break; case Unit.YOTTABYTE_ID: unitValue = Units.YOTTABYTE; break; /* Units of energy */ case Unit.JOULE_ID: unitValue = Units.JOULE; break; case Unit.ELECTRONO_VOLT_ID: unitValue = Units.ELECTRONO_VOLT; break; case Unit.KILO_ELECTRONO_VOLT_ID: unitValue = Units.KILO_ELECTRONO_VOLT; break; case Unit.MEGA_ELECTRONO_VOLT_ID: unitValue = Units.MEGA_ELECTRONO_VOLT; break; case Unit.GIGA_ELECTRONO_VOLT_ID: unitValue = Units.GIGA_ELECTRONO_VOLT; break; case Unit.TERA_ELECTRONO_VOLT_ID: unitValue = Units.TERA_ELECTRONO_VOLT; break; /* Units of speed */ case Unit.METRE_PER_SECOND_ID: unitValue = Units.METRE_PER_SECOND; break; case Unit.KILOMETRE_PER_HOUR_ID: unitValue = Units.KILOMETRE_PER_HOUR; break; case Unit.MILE_PER_HOUR_ID: unitValue = Units.MILE_PER_HOUR; break; case Unit.KNOT_ID: unitValue = Units.KNOT; break; /* Units of acceleration */ case Unit.METRE_PER_SECOND2_ID: unitValue = Units.METRE_PER_SECOND2; break; case Unit.KILOMETRE_PER_HOUR2_ID: unitValue = Units.KILOMETRE_PER_HOUR2; break; case Unit.MILE_PER_HOUR2_ID: unitValue = Units.MILE_PER_HOUR2; break; /* Units of angle */ case Unit.RADIAN_ARC_ID: unitValue = Units.RADIAN_ARC; break; case Unit.DEGREE_ARC_ID: unitValue = Units.DEGREE_ARC; break; case Unit.MINUTE_ARC_ID: unitValue = Units.MINUTE_ARC; break; case Unit.SECOND_ARC_ID: unitValue = Units.SECOND_ARC; break; } setToNumber(pos, unitValue); } /** * Random Variables handling. * * @param pos the token position */ private void RANDOM_VARIABLE(int pos) { double rndVar = Double.NaN; switch (tokensList.get(pos).tokenId) { case RandomVariable.UNIFORM_ID: rndVar = ProbabilityDistributions.rndUniformContinuous(ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT_ID: rndVar = ProbabilityDistributions.rndInteger(ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT1_ID: rndVar = ProbabilityDistributions.rndInteger(-10, 10, ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT2_ID: rndVar = ProbabilityDistributions.rndInteger(-100, 100, ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT3_ID: rndVar = ProbabilityDistributions.rndInteger(-1000, 1000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT4_ID: rndVar = ProbabilityDistributions.rndInteger(-10000, 10000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT5_ID: rndVar = ProbabilityDistributions.rndInteger(-100000, 100000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT6_ID: rndVar = ProbabilityDistributions.rndInteger(-1000000, 1000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT7_ID: rndVar = ProbabilityDistributions.rndInteger(-10000000, 10000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT8_ID: rndVar = ProbabilityDistributions.rndInteger(-100000000, 100000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.INT9_ID: rndVar = ProbabilityDistributions.rndInteger(-1000000000, 1000000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_ID: rndVar = ProbabilityDistributions.rndInteger(0, 2147483646, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_1_ID: rndVar = ProbabilityDistributions.rndInteger(0, 10, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_2_ID: rndVar = ProbabilityDistributions.rndInteger(0, 100, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_3_ID: rndVar = ProbabilityDistributions.rndInteger(0, 1000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_4_ID: rndVar = ProbabilityDistributions.rndInteger(0, 10000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_5_ID: rndVar = ProbabilityDistributions.rndInteger(0, 100000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_6_ID: rndVar = ProbabilityDistributions.rndInteger(0, 1000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_7_ID: rndVar = ProbabilityDistributions.rndInteger(0, 10000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_8_ID: rndVar = ProbabilityDistributions.rndInteger(0, 100000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT0_9_ID: rndVar = ProbabilityDistributions.rndInteger(0, 1000000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_ID: rndVar = ProbabilityDistributions.rndInteger(1, 2147483646, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_1_ID: rndVar = ProbabilityDistributions.rndInteger(1, 10, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_2_ID: rndVar = ProbabilityDistributions.rndInteger(1, 100, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_3_ID: rndVar = ProbabilityDistributions.rndInteger(1, 1000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_4_ID: rndVar = ProbabilityDistributions.rndInteger(1, 10000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_5_ID: rndVar = ProbabilityDistributions.rndInteger(1, 100000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_6_ID: rndVar = ProbabilityDistributions.rndInteger(1, 1000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_7_ID: rndVar = ProbabilityDistributions.rndInteger(1, 10000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_8_ID: rndVar = ProbabilityDistributions.rndInteger(1, 100000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NAT1_9_ID: rndVar = ProbabilityDistributions.rndInteger(1, 1000000000, ProbabilityDistributions.randomGenerator); break; case RandomVariable.NOR_ID: rndVar = ProbabilityDistributions.rndNormal(0.0, 1.0, ProbabilityDistributions.randomGenerator); break; } setToNumber(pos, rndVar); } /** * Gets token value * @param tokenIndex the token index * * @return the token value */ private double getTokenValue(int tokenIndex) { return tokensList.get(tokenIndex).tokenValue; } /** * Tetration handling. * * @param pos the token position */ private void TETRATION(int pos) { double a = getTokenValue(pos-1); double n = getTokenValue(pos+1); opSetDecreaseRemove(pos, MathFunctions.tetration(a, n), true); } /** * Power handling. * * @param pos the token position */ private void POWER(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, MathFunctions.power(a, b), true); } /** * Modulo handling. * * @param pos the token position */ private void MODULO(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, MathFunctions.mod(a, b) ); } /** * Division handling. * * @param pos the token position */ private void DIVIDE(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); if (disableRounding) { double result = Double.NaN; if (b != 0) result = a / b; opSetDecreaseRemove(pos, result, true); } else opSetDecreaseRemove(pos, MathFunctions.div(a, b), true); } /** * Multiplication handling. * * @param pos the token position */ private void MULTIPLY(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); if (disableRounding) opSetDecreaseRemove(pos, a * b, true); else opSetDecreaseRemove(pos, MathFunctions.multiply(a, b), true); } /** * Addition handling. * * @param pos the token position */ private void PLUS(int pos) { Token b = tokensList.get(pos+1); if (pos>0) { Token a = tokensList.get(pos-1); if ( (a.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) && (b.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID)) if (disableRounding) opSetDecreaseRemove(pos, a.tokenValue + b.tokenValue, true); else opSetDecreaseRemove(pos, MathFunctions.plus(a.tokenValue, b.tokenValue), true); else if (b.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) { setToNumber(pos,b.tokenValue); tokensList.remove(pos+1); } } else if (b.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) { setToNumber(pos,b.tokenValue); tokensList.remove(pos+1); } } /** * Subtraction handling * * @param pos the token position */ private void MINUS(int pos) { Token b = tokensList.get(pos+1); if (pos>0) { Token a = tokensList.get(pos-1); if ( (a.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) && (b.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID)) if (disableRounding) opSetDecreaseRemove(pos, a.tokenValue - b.tokenValue, true); else opSetDecreaseRemove(pos, MathFunctions.minus(a.tokenValue, b.tokenValue), true); else if (b.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) { setToNumber(pos,-b.tokenValue); tokensList.remove(pos+1); } } else if (b.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) { setToNumber(pos,-b.tokenValue); tokensList.remove(pos+1); } } /** * Logical AND * * @param pos the token position */ private void AND(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.and(a, b) ); } /** * Logical OR * * @param pos the token position */ private void OR(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.or(a, b) ); } /** * Logical NAND * * @param pos the token position */ private void NAND(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.nand(a, b) ); } /** * Logical NOR * * @param pos the token position */ private void NOR(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.nor(a, b) ); } /** * Logical XOR * * * @param pos the token position */ private void XOR(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.xor(a, b) ); } /** * Logical IMP * * * @param pos the token position */ private void IMP(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.imp(a, b) ); } /** * Logical CIMP * * @param pos the token position */ private void CIMP(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.cimp(a, b) ); } /** * Logical NIMP * * @param pos the token position */ private void NIMP(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.nimp(a, b) ); } /** * Logical CNIMP * * @param pos the token position */ private void CNIMP(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.cnimp(a, b) ); } /** * Logical EQV * * @param pos the token position */ private void EQV(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BooleanAlgebra.eqv(a, b) ); } /** * Logical negation * * @param pos the token position */ private void NEG(int pos) { double a = getTokenValue(pos+1); setToNumber(pos, BooleanAlgebra.not(a) ); tokensList.remove(pos+1); } /** * Equality relation. * * @param pos the token position */ private void EQ(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BinaryRelations.eq(a, b) ); } /** * Not equals. * * @param pos the token position */ private void NEQ(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BinaryRelations.neq(a, b) ); } /** * Lower than. * * @param pos the token position */ private void LT(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BinaryRelations.lt(a, b) ); } /** * Greater than. * * @param pos the token position */ private void GT(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BinaryRelations.gt(a, b) ); } /** * Lower or equal. * * @param pos the token position */ private void LEQ(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BinaryRelations.leq(a, b) ); } /** * Greater or equal * * @param pos the token position */ private void GEQ(int pos) { double a = getTokenValue(pos-1); double b = getTokenValue(pos+1); opSetDecreaseRemove(pos, BinaryRelations.geq(a, b) ); } /** * Bitwise COMPL * * @param pos the token position */ private void BITWISE_COMPL(int pos) { long a = (long)getTokenValue(pos+1); setToNumber(pos, ~a); tokensList.remove(pos+1); } /** * Bitwise AND * * @param pos the token position */ private void BITWISE_AND(int pos) { long a = (long)getTokenValue(pos-1); long b = (long)getTokenValue(pos+1); opSetDecreaseRemove(pos, a & b); } /** * Bitwise OR * * @param pos the token position */ private void BITWISE_OR(int pos) { long a = (long)getTokenValue(pos-1); long b = (long)getTokenValue(pos+1); opSetDecreaseRemove(pos, a | b); } /** * Bitwise XOR * * @param pos the token position */ private void BITWISE_XOR(int pos) { long a = (long)getTokenValue(pos-1); long b = (long)getTokenValue(pos+1); opSetDecreaseRemove(pos, a ^ b); } /** * Bitwise LEFT SHIFT * * @param pos the token position */ private void BITWISE_LEFT_SHIFT(int pos) { long a = (long)getTokenValue(pos-1); int b = (int)getTokenValue(pos+1); opSetDecreaseRemove(pos, a << b); } /** * Bitwise RIGHT SHIFT * * @param pos the token position */ private void BITWISE_RIGHT_SHIFT(int pos) { long a = (long)getTokenValue(pos-1); int b = (int)getTokenValue(pos+1); opSetDecreaseRemove(pos, a >> b); } /** * Sine function * * @param pos the token position */ private void SIN(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.sin(a) ); } /** * Cosine / Trigonometric functions * Sets tokens to number token * * @param pos the token position */ private void COS(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.cos(a) ); } /** * Tangent / Trigonometric functions * Sets tokens to number token * * @param pos the token position */ private void TAN(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.tan(a) ); } /** * Cotangent / Trigonometric functions * Sets tokens to number token * * @param pos the token position */ private void CTAN(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.ctan(a) ); } /** * Secant / Trigonometric functions * Sets tokens to number token * * @param pos the token position */ private void SEC(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.sec(a) ); } /** * Cosecant / Trigonometric functions * Sets tokens to number token * * @param pos the token position */ private void COSEC(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.cosec(a) ); } /** * Arcus sine / Inverse trigonometric functions * Sets tokens to number token * * @param pos the token position */ private void ASIN(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.asin(a) ); } /** * Arcus cosine / Inverse trigonometric functions * Sets tokens to number token * * @param pos the token position */ private void ACOS(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.acos(a) ); } /** * Arcus tangent / Inverse trigonometric functions * Sets tokens to number token * * @param pos the token position */ private void ATAN(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.atan(a) ); } /** * Arcus cotangent / Inverse trigonometric functions * Sets tokens to number token * * @param pos the token position */ private void ACTAN(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.actan(a) ); } /** * Natural logarithm (base e) * Sets tokens to number token * * @param pos the token position */ private void LN(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.ln(a) ); } /** * Logarithm - base 2 * Sets tokens to number token * * @param pos the token position */ private void LOG2(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.log2(a) ); } /** * Logarithm - base 10 * Sets tokens to number token * * @param pos the token position */ private void LOG10(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.log10(a) ); } /** * Converts degrees to radius * Sets tokens to number token * * @param pos the token position */ private void RAD(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.rad(a) ); } /** * Exponential function * Sets tokens to number token * * @param pos the token position */ private void EXP(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.exp(a) ); } /** * Square root * Sets tokens to number token * * @param pos the token position */ private void SQRT(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.sqrt(a) ); } /** * Hyperbolic sine * Sets tokens to number token * * @param pos the token position */ private void SINH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.sinh(a) ); } /** * Hyperbolic cosine * Sets tokens to number token * * @param pos the token position */ private void COSH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.cosh(a) ); } /** * Hyperbolic tangent * Sets tokens to number token * * @param pos the token position */ private void TANH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.tanh(a) ); } /** * Hyperbolic cotangent * Sets tokens to number token * * @param pos the token position */ private void COTH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.coth(a) ); } /** * Hyperbolic secant * Sets tokens to number token * * @param pos the token position */ private void SECH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.sech(a) ); } /** * Hyperbolic cosecant * Sets tokens to number token * * @param pos the token position */ private void CSCH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.csch(a) ); } /** * Converts radians to degrees * Sets tokens to number token * * @param pos the token position */ private void DEG(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.deg(a) ); } /** * Absolut value * Sets tokens to number token * * @param pos the token position */ private void ABS(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.abs(a) ); } /** * Signum function * Sets tokens to number token * * @param pos the token position */ private void SGN(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.sgn(a) ); } /** * Floor function * Sets tokens to number token * * @param pos the token position */ private void FLOOR(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.floor(a) ); } /** * Ceil function * Sets tokens to number token * * @param pos the token position */ private void CEIL(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.ceil(a) ); } /** * Arcus hyperbolic sine * Sets tokens to number token * * @param pos the token position */ private void ARSINH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.arsinh(a) ); } /** * Arcus hyperbolic cosine * Sets tokens to number token * * @param pos the token position */ private void ARCOSH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.arcosh(a) ); } /** * Arcus hyperbolic tangent * Sets tokens to number token * * @param pos the token position */ private void ARTANH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.artanh(a) ); } /** * Arcus hyperbolic cotangent * Sets tokens to number token * * @param pos the token position */ private void ARCOTH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.arcoth(a) ); } /** * Arcus hyperbolic secant * Sets tokens to number token * * @param pos the token position */ private void ARSECH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.arsech(a) ); } /** * Arcus hyperbolic cosecant * Sets tokens to number token * * @param pos the token position */ private void ARCSCH(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.arcsch(a) ); } /** * SA / sinc normalized * * @param pos the token position */ private void SA(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.sa(a) ); } /** * Sinc unnormalized * * @param pos the token position */ private void SINC(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.sinc(a) ); } /** * Bell numbers * * @param pos the token position */ private void BELL_NUMBER(int pos) { double n = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.bellNumber(n) ); } /** * Lucas numbers * * @param pos the token position */ private void LUCAS_NUMBER(int pos) { double n = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.lucasNumber(n) ); } /** * Fibonacci numbers * * @param pos the token position */ private void FIBONACCI_NUMBER(int pos) { double n = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.fibonacciNumber(n) ); } /** * Harmonic numbers * * @param pos the token position */ private void HARMONIC_NUMBER(int pos) { double n = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.harmonicNumber(n) ); } /** * Prime test * * @param pos the token position */ private void IS_PRIME(int pos) { double n = getTokenValue(pos+1); f1SetDecreaseRemove(pos, NumberTheory.primeTest(n) ); } /** * Prime counting * * @param pos the token position */ private void PRIME_COUNT(int pos) { double n = getTokenValue(pos+1); f1SetDecreaseRemove(pos, NumberTheory.primeCount(n) ); } /** * Exponential integral function * * @param pos the token position */ private void EXP_INT(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.exponentialIntegralEi(x) ); } /** * Logarithmic exponential integral function * * @param pos the token position */ private void LOG_INT(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.logarithmicIntegralLi(x) ); } /** * Offset logarithmic exponential integral function * * @param pos the token position */ private void OFF_LOG_INT(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.offsetLogarithmicIntegralLi(x) ); } /** * Factorilal function * Sets tokens to number token * * @param pos the token position */ private void FACT(int pos) { double a = getTokenValue(pos-1); setToNumber(pos, MathFunctions.factorial(a)); tokensList.remove(pos-1); } /** * Percentage * Sets tokens to number token * * @param pos the token position */ private void PERC(int pos) { double a = getTokenValue(pos-1); setToNumber(pos, a * Units.PERC); tokensList.remove(pos-1); } /** * Negation * Sets tokens to number token * * @param pos the token position */ private void NOT(int pos) { double a = getTokenValue(pos+1); f1SetDecreaseRemove(pos, BooleanAlgebra.not(a) ); } /** * Gauss error function * * @param pos the token position */ private void GAUSS_ERF(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.erf(x) ); } /** * Gauss complementary error function * * @param pos the token position */ private void GAUSS_ERFC(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.erfc(x) ); } /** * Inverse of Gauss error function * * @param pos the token position */ private void GAUSS_ERF_INV(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.erfInv(x) ); } /** * Inverse of Gauss complementary error function * * @param pos the token position */ private void GAUSS_ERFC_INV(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.erfcInv(x) ); } /** * Unit in The Last Place * Sets tokens to number token * * @param pos the token position */ private void ULP(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.ulp(x) ); } /** * Is Not-a-Number * Sets tokens to number token * * @param pos the token position */ private void ISNAN(int pos) { double x = getTokenValue(pos+1); if (Double.isNaN(x)) f1SetDecreaseRemove(pos, BooleanAlgebra.TRUE); else f1SetDecreaseRemove(pos, BooleanAlgebra.FALSE); } /** * Number of digits in base 10 * Sets tokens to number token * * @param pos the token position */ private void NDIG10(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, NumberTheory.numberOfDigits(x) ); } /** * Number of prime factors - distinct * Sets tokens to number token * * @param pos the token position */ private void NFACT(int pos) { double n = getTokenValue(pos+1); f1SetDecreaseRemove(pos, NumberTheory.numberOfPrimeFactors(n) ); } /** * Arcuus secant * Sets tokens to number token * * @param pos the token position */ private void ARCSEC(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.asec(x) ); } /** * Arcuus cosecant * Sets tokens to number token * * @param pos the token position */ private void ARCCSC(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, MathFunctions.acosec(x) ); } /** * Gamma special function * Sets tokens to number token * * @param pos the token position */ private void GAMMA(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.gamma(x) ); } /** * Lambert-W special function, principal branch 0 * Sets tokens to number token * * @param pos the token position */ private void LAMBERT_W0(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.lambertW(x, 0) ); } /** * Lambert-W special function, branch = -1 * Sets tokens to number token * * @param pos the token position */ private void LAMBERT_W1(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.lambertW(x, -1) ); } /** * Signum of Gamma special function * Sets tokens to number token * * @param pos the token position */ private void SGN_GAMMA(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.sgnGamma(x) ); } /** * Log Gamma special function * Sets tokens to number token * * @param pos the token position */ private void LOG_GAMMA(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.logGamma(x) ); } /** * Digamma special function * Sets tokens to number token * * @param pos the token position */ private void DI_GAMMA(int pos) { double x = getTokenValue(pos+1); f1SetDecreaseRemove(pos, SpecialFunctions.diGamma(x) ); } /** * User Defined Variadic function param value * Sets tokens to number token * * @param pos the token position */ private void UDF_PARAM(int pos) { double value = Double.NaN; double x = getTokenValue(pos+1); int npar = UDFVariadicParamsAtRunTime.size(); if ( (Double.isNaN(x) == false ) && (x != Double.POSITIVE_INFINITY) && (x != Double.NEGATIVE_INFINITY) ) { int i = (int)MathFunctions.integerPart(x); if (i == 0) { value = npar; } else if (Math.abs(i) <= npar) { if (i >= 1) { value = UDFVariadicParamsAtRunTime.get(i - 1); } else if (i <= -1) { value = UDFVariadicParamsAtRunTime.get(npar + i); } } } f1SetDecreaseRemove(pos, value ); } /** * Logarithm * Sets tokens to number token * * @param pos the token position */ private void LOG(int pos) { double b = getTokenValue(pos+1); double a = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.log(a, b) ); } /** * Creates ArraList containing function parameters * * @param pos the function position * * @return List of function parameters. */ private List getNumbers(int pos) { List numbers = new ArrayList(); int pn = pos; int lastIndex = tokensList.size() - 1; boolean isNumber; boolean end = false; do { pn++; Token t = tokensList.get(pn); isNumber = false; if ( (t.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) && (t.tokenId == ParserSymbol.NUMBER_ID) ) { isNumber = true; numbers.add(t.tokenValue); } if ( (pn == lastIndex) || (!isNumber) ) end = true; } while ( end == false ); return numbers; } /** * Modulo * Sets tokens to number token * * @param pos the token position */ private void MOD(int pos) { double a = getTokenValue(pos+1); double b = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.mod(a, b) ); } /** * Binomial Coefficient * * @param pos the token position */ private void BINOM_COEFF(int pos) { double n = getTokenValue(pos+1); double k = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.binomCoeff(n, k) ); } /** * Number of permutations * * @param pos the token position */ private void PERMUTATIONS(int pos) { double n = getTokenValue(pos+1); double k = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.numberOfPermutations(n, k) ); } /** * Beta special function * @param pos the token position */ private void BETA(int pos) { double x = getTokenValue(pos+1); double y = getTokenValue(pos+2); f2SetDecreaseRemove(pos, SpecialFunctions.beta(x, y) ); } /** * Log beta special function * @param pos the token position */ private void LOG_BETA(int pos) { double x = getTokenValue(pos+1); double y = getTokenValue(pos+2); f2SetDecreaseRemove(pos, SpecialFunctions.logBeta(x, y) ); } /** * Bernoulli Number * * @param pos the token position */ private void BERNOULLI_NUMBER(int pos) { double m = getTokenValue(pos+1); double n = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.bernoulliNumber(m, n) ); } /** * Stirling number of the first kind * * @param pos the token position */ private void STIRLING1_NUMBER(int pos) { double n = getTokenValue(pos+1); double k = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.Stirling1Number(n, k) ); } /** * Stirling number of the second kind. * * @param pos the token position */ private void STIRLING2_NUMBER(int pos) { double n = getTokenValue(pos+1); double k = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.Stirling2Number(n, k) ); } /** * Worpitzky number. * * @param pos the token position */ private void WORPITZKY_NUMBER(int pos) { double n = getTokenValue(pos+1); double k = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.worpitzkyNumber(n, k) ); } /** * Euler number * * @param pos the token position */ private void EULER_NUMBER(int pos) { double n = getTokenValue(pos+1); double k = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.eulerNumber(n, k) ); } /** * Kronecker delta * * @param pos the token position */ private void KRONECKER_DELTA(int pos) { double i = getTokenValue(pos+1); double j = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.kroneckerDelta(i, j) ); } /** * Euler polynomial * * @param pos the token position */ private void EULER_POLYNOMIAL(int pos) { double m = getTokenValue(pos+1); double x = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.eulerPolynomial(m, x) ); } /** * Harmonic numbers * * @param pos the token position */ private void HARMONIC2_NUMBER(int pos) { double x = getTokenValue(pos+1); double n = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.harmonicNumber(x, n) ); } /** * Decimal rounding * * @param pos the token position */ private void ROUND(int pos) { double value = getTokenValue(pos+1); int places = (int)getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.round(value, places) ); } /** * Random number - Uniform Continuous distribution * * @param pos the token position */ private void RND_VAR_UNIFORM_CONT(int pos) { double a = getTokenValue(pos+1); double b = getTokenValue(pos+2); f2SetDecreaseRemove(pos, ProbabilityDistributions.rndUniformContinuous(a, b, ProbabilityDistributions.randomGenerator) ); } /** * Random number - Uniform Discrete distribution * * @param pos the token position */ private void RND_VAR_UNIFORM_DISCR(int pos) { int a = (int)getTokenValue(pos+1); int b = (int)getTokenValue(pos+2); f2SetDecreaseRemove(pos, ProbabilityDistributions.rndInteger(a, b, ProbabilityDistributions.randomGenerator) ); } /** * Random number - Normal distribution * * @param pos the token position */ private void RND_NORMAL(int pos) { double mean = getTokenValue(pos+1); double stddev = getTokenValue(pos+2); f2SetDecreaseRemove(pos, ProbabilityDistributions.rndNormal(mean, stddev, ProbabilityDistributions.randomGenerator) ); } /** * Number of digits in given numeral system * * @param pos the token position */ private void NDIG(int pos) { double number = getTokenValue(pos+1); double numeralSystemBase = getTokenValue(pos+2); f2SetDecreaseRemove(pos, NumberTheory.numberOfDigits(number, numeralSystemBase) ); } /** * Digit at position - base 10 numeral system * * @param pos the token position */ private void DIGIT10(int pos) { double number = getTokenValue(pos+1); double position = getTokenValue(pos+2); f2SetDecreaseRemove(pos, NumberTheory.digitAtPosition(number, position) ); } /** * Prime factor value * * @param pos the token position */ private void FACTVAL(int pos) { double number = getTokenValue(pos+1); double id = getTokenValue(pos+2); f2SetDecreaseRemove(pos, NumberTheory.primeFactorValue(number, id) ); } /** * Prime factor value exponent * * @param pos the token position */ private void FACTEXP(int pos) { double number = getTokenValue(pos+1); double id = getTokenValue(pos+2); f2SetDecreaseRemove(pos, NumberTheory.primeFactorExponent(number, id) ); } /** * Nth order root * * @param pos the token position */ private void ROOT(int pos) { double n = getTokenValue(pos+1); double x = getTokenValue(pos+2); f2SetDecreaseRemove(pos, MathFunctions.root(n, x) ); } /** * Lower incomplete special Gamma function * * @param pos the token position */ private void INC_GAMMA_LOWER(int pos) { double s = getTokenValue(pos+1); double x = getTokenValue(pos+2); f2SetDecreaseRemove(pos, SpecialFunctions.incompleteGammaLower(s, x) ); } /** * Upper incomplete special Gamma function * * @param pos the token position */ private void INC_GAMMA_UPPER(int pos) { double s = getTokenValue(pos+1); double x = getTokenValue(pos+2); f2SetDecreaseRemove(pos, SpecialFunctions.incompleteGammaUpper(s, x) ); } /** * Lower regularized special Gamma function * * @param pos the token position */ private void REG_GAMMA_LOWER(int pos) { double s = getTokenValue(pos+1); double x = getTokenValue(pos+2); f2SetDecreaseRemove(pos, SpecialFunctions.regularizedGammaLowerP(s, x) ); } /** * Lower regularized special Gamma function * * @param pos the token position */ private void REG_GAMMA_UPPER(int pos) { double s = getTokenValue(pos+1); double x = getTokenValue(pos+2); f2SetDecreaseRemove(pos, SpecialFunctions.regularizedGammaUpperQ(s, x) ); } /** * IF function * * @param pos the token position */ private void IF_CONDITION(int pos) { /* * Get condition string * 1st parameter * The goal is to avoid calculation * of not needed part of IF function * Example: If(1=1, 2, sin(3) ) - here sin(3) does not * require to be calculated. */ List ifParams = getFunctionParameters(pos, tokensList); FunctionParameter ifParam = ifParams.get(0); Expression ifExp = new Expression(ifParam.paramStr, ifParam.tokens, argumentsList, functionsList, constantsList, KEEP_ROUNDING_SETTINGS, UDFExpression, UDFVariadicParamsAtRunTime); if (verboseMode == true) ifExp.setVerboseMode(); ifSetRemove(pos, ifExp.calculate()); } /** * IFF function * * @param pos the token position */ private void IFF(int pos) { /* * Get condition string * 1st parameter */ List iffParams = getFunctionParameters(pos, tokensList); FunctionParameter iffParam = iffParams.get(0); int parametersNumber = iffParams.size(); int trueParamNumber; int paramNumber; paramNumber = 1; Expression iffExp; double iffValue = 0; boolean iffCon = true; do { iffExp = new Expression(iffParam.paramStr, iffParam.tokens, argumentsList, functionsList, constantsList, KEEP_ROUNDING_SETTINGS, UDFExpression, UDFVariadicParamsAtRunTime); if (verboseMode == true) iffExp.setVerboseMode(); iffCon = true; iffValue = iffExp.calculate(); if ( (iffValue == 0) || (Double.isNaN(iffValue)) ) { paramNumber += 2; iffCon = false; if (paramNumber < parametersNumber) iffParam = iffParams.get(paramNumber-1); } } while ( (!iffCon) && (paramNumber < parametersNumber) ); int from; int to; int p; if (iffCon) { trueParamNumber = paramNumber+1; from = pos+1; to = iffParams.get(parametersNumber-1).toIndex+1; tokensList.get(from).tokenLevel--; tokensList.get(to).tokenLevel--; if (trueParamNumber < parametersNumber) { to = iffParams.get(parametersNumber-1).toIndex; from = iffParams.get(trueParamNumber).fromIndex-1; for (p = to; p >= from; p--) tokensList.remove(p); } from = iffParams.get(trueParamNumber-1).fromIndex; to = iffParams.get(trueParamNumber-1).toIndex; for (p = from; p <= to; p++) tokensList.get(p).tokenLevel--; to = from-1; from = pos; for (p = to; p >= from; p--) if (p != pos + 1) tokensList.remove(p); } else { to = iffParams.get(parametersNumber-1).toIndex+1; from = pos+1; for (p = to; p >= from; p--) tokensList.remove(p); setToNumber(pos, Double.NaN); tokensList.get(pos).tokenLevel--; } } /** * IF * Sets tokens to number token * * @param pos token index (position) */ private void IF(int pos) { double ifCondition = tokensList.get(pos+1).tokenValue; double ifTrue = tokensList.get(pos+2).tokenValue; double ifFalse = tokensList.get(pos+3).tokenValue; double result = ifFalse; if (ifCondition != 0) result = ifTrue; if (ifCondition == Double.NaN) result = Double.NaN; f3SetDecreaseRemove(pos, result ); } /** * Characteristic function (a,b) * * @param pos the token position */ private void CHI(int pos) { double x = getTokenValue(pos+1); double a = getTokenValue(pos+2); double b = getTokenValue(pos+3); f3SetDecreaseRemove(pos, MathFunctions.chi(x, a, b) ); } /** * Characteristic function [a,b] * * @param pos the token position */ private void CHI_LR(int pos) { double x = getTokenValue(pos+1); double a = getTokenValue(pos+2); double b = getTokenValue(pos+3); f3SetDecreaseRemove(pos, MathFunctions.chi_LR(x, a, b) ); } /** * Characteristic function [a,b) * * @param pos the token position */ private void CHI_L(int pos) { double x = getTokenValue(pos+1); double a = getTokenValue(pos+2); double b = getTokenValue(pos+3); f3SetDecreaseRemove(pos, MathFunctions.chi_L(x, a, b) ); } /** * Characteristic function (a,b] * * @param pos the token position */ private void CHI_R(int pos) { double x = getTokenValue(pos+1); double a = getTokenValue(pos+2); double b = getTokenValue(pos+3); f3SetDecreaseRemove(pos, MathFunctions.chi_R(x, a, b) ); } /** * Probability Distribution Function - Uniform Continuous distribution * * @param pos the token position */ private void PDF_UNIFORM_CONT(int pos) { double x = getTokenValue(pos+1); double a = getTokenValue(pos+2); double b = getTokenValue(pos+3); f3SetDecreaseRemove(pos, ProbabilityDistributions.pdfUniformContinuous(x, a, b) ); } /** * Cumulative Distribution Function - Uniform Continuous distribution * * @param pos the token position */ private void CDF_UNIFORM_CONT(int pos) { double x = getTokenValue(pos+1); double a = getTokenValue(pos+2); double b = getTokenValue(pos+3); f3SetDecreaseRemove(pos, ProbabilityDistributions.cdfUniformContinuous(x, a, b) ); } /** * Quantile Function - Uniform Continuous distribution * * @param pos the token position */ private void QNT_UNIFORM_CONT(int pos) { double q = getTokenValue(pos+1); double a = getTokenValue(pos+2); double b = getTokenValue(pos+3); f3SetDecreaseRemove(pos, ProbabilityDistributions.qntUniformContinuous(q, a, b) ); } /** * Probability Distribution Function - Normal distribution * * @param pos the token position */ private void PDF_NORMAL(int pos) { double x = getTokenValue(pos+1); double mean = getTokenValue(pos+2); double stddev = getTokenValue(pos+3); f3SetDecreaseRemove(pos, ProbabilityDistributions.pdfNormal(x, mean, stddev) ); } /** * Cumulative Distribution Function - Normal distribution * * @param pos the token position */ private void CDF_NORMAL(int pos) { double x = getTokenValue(pos+1); double mean = getTokenValue(pos+2); double stddev = getTokenValue(pos+3); f3SetDecreaseRemove(pos, ProbabilityDistributions.cdfNormal(x, mean, stddev) ); } /** * Quantile Function - Normal distribution * * @param pos the token position */ private void QNT_NORMAL(int pos) { double q = getTokenValue(pos+1); double mean = getTokenValue(pos+2); double stddev = getTokenValue(pos+3); f3SetDecreaseRemove(pos, ProbabilityDistributions.qntNormal(q, mean, stddev) ); } /** * Digit at position - numeral system with given base * * @param pos the token position */ private void DIGIT(int pos) { double number = getTokenValue(pos+1); double position = getTokenValue(pos+2); double numeralSystemBase = getTokenValue(pos+3); f3SetDecreaseRemove(pos, NumberTheory.digitAtPosition(number, position, numeralSystemBase) ); } /** * Incomplete beta special function * @param pos the token position */ private void INC_BETA(int pos) { double x = getTokenValue(pos+1); double a = getTokenValue(pos+2); double b = getTokenValue(pos+3); f3SetDecreaseRemove(pos, SpecialFunctions.incompleteBeta(a, b, x) ); } /** * Regularized incomplete beta special function * @param pos the token position */ private void REG_BETA(int pos) { double x = getTokenValue(pos+1); double a = getTokenValue(pos+2); double b = getTokenValue(pos+3); f3SetDecreaseRemove(pos, SpecialFunctions.regularizedBeta(a, b, x) ); } /** * Updating missing tokens (i.e. indexes i sum operator). Used when creating * internal expressions based on the sublist of tokens. * * * @param tokens the tokens list * @param keyWord missing key word * @param tokenId missing token id * @param tokenTypeId missing token type id */ private void updateMissingTokens(List tokens, String keyWord, int tokenId, int tokenTypeId) { for (Token t : tokens) if ( (t.tokenTypeId == ConstantValue.NaN) && (t.tokenStr.equals(keyWord))) { t.keyWord = keyWord; t.tokenId = tokenId; t.tokenTypeId = tokenTypeId; } } /** * Update missing tokens in expression related * to iterative operators. * * @param index Index parameter of the iterative operator * @param iterParams Parameters list of the iterative operator */ private void updateMissingTokens(ArgumentParameter index, IterativeOperatorParameters iterParams) { if (index.presence == Argument.NOT_FOUND) { updateMissingTokens(iterParams.indexParam.tokens, iterParams.indexParam.paramStr, index.index, Argument.TYPE_ID ); updateMissingTokens(iterParams.fromParam.tokens, iterParams.indexParam.paramStr, index.index, Argument.TYPE_ID ); updateMissingTokens(iterParams.toParam.tokens, iterParams.indexParam.paramStr, index.index, Argument.TYPE_ID ); updateMissingTokens(iterParams.funParam.tokens, iterParams.indexParam.paramStr, index.index, Argument.TYPE_ID ); } } /** * Evaluates ranges 'from', 'to', 'delta' for the iterative operator * * @param index Index parameter of the iterative operator * @param iterParams Parameters list of the iterative operator */ private void evalFromToDeltaParameters(ArgumentParameter index, IterativeOperatorParameters iterParams) { /* * Create from, to, fun expression * based on the from string * expressions will use the same arguments list * as used in the main expression (this.argumentsList) */ iterParams.fromExp = new Expression(iterParams.fromParam.paramStr, iterParams.fromParam.tokens, argumentsList, functionsList, constantsList, KEEP_ROUNDING_SETTINGS, UDFExpression, UDFVariadicParamsAtRunTime); iterParams.toExp = new Expression(iterParams.toParam.paramStr, iterParams.toParam.tokens, argumentsList, functionsList, constantsList, KEEP_ROUNDING_SETTINGS, UDFExpression, UDFVariadicParamsAtRunTime); iterParams.funExp = new Expression(iterParams.funParam.paramStr, iterParams.funParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); iterParams.deltaExp = null; if (verboseMode == true) { iterParams.fromExp.setVerboseMode(); iterParams.toExp.setVerboseMode(); iterParams.funExp.setVerboseMode(); } /* * Evaluate range */ iterParams.from = iterParams.fromExp.calculate(); iterParams.to = iterParams.toExp.calculate(); iterParams.delta = 1.0; if (iterParams.to < iterParams.from) iterParams.delta = -1.0; if (iterParams.withDelta == true) { iterParams.deltaExp = new Expression(iterParams.deltaParam.paramStr, iterParams.deltaParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); if (index.presence == Argument.NOT_FOUND) { updateMissingTokens(iterParams.deltaParam.tokens, iterParams.indexParam.paramStr, index.index, Argument.TYPE_ID ); } if (verboseMode == true) iterParams.deltaExp.setVerboseMode(); iterParams.delta = iterParams.deltaExp.calculate(); } } /** * Summation operator (SIGMA by) * sum(i,m,n,f(i),b) --> sum f(i) from i=m to i=n by delta * i - index (argument) * m, n - numbers or expressions * f(i) - function string * by delta * * @param pos the token position */ private void SUM(int pos) { IterativeOperatorParameters iterParams = new IterativeOperatorParameters( getFunctionParameters(pos, tokensList) ); ArgumentParameter index = getParamArgument(iterParams.indexParam.paramStr); updateMissingTokens(index, iterParams); evalFromToDeltaParameters(index, iterParams); double sigma = NumberTheory.sigmaSummation(iterParams.funExp, index.argument, iterParams.from, iterParams.to, iterParams.delta); clearParamArgument(index); calcSetDecreaseRemove(pos, sigma, true); } /** * Product operator (SIGMA by) * pord(i,m,n,f(i),b) --> prod f(i) from i=m to i=n by delta * i - index (argument) * m, n - numbers or expressions * f(i) - function string * by delta * * @param pos the token position */ private void PROD(int pos) { IterativeOperatorParameters iterParams = new IterativeOperatorParameters( getFunctionParameters(pos, tokensList) ); ArgumentParameter index = getParamArgument(iterParams.indexParam.paramStr); updateMissingTokens(index, iterParams); evalFromToDeltaParameters(index, iterParams); double product = NumberTheory.piProduct(iterParams.funExp, index.argument, iterParams.from, iterParams.to, iterParams.delta); clearParamArgument(index); calcSetDecreaseRemove(pos, product, true); } /** * Minimum value - iterative operator * mini(i,m,n,f(i),b) --> min f(i) from i=m to i=n by delta * i - index (argument) * m, n - numbers or expressions * f(i) - function string * by delta * * @param pos the token position */ private void MIN(int pos) { IterativeOperatorParameters iterParams = new IterativeOperatorParameters( getFunctionParameters(pos, tokensList) ); ArgumentParameter index = getParamArgument(iterParams.indexParam.paramStr); updateMissingTokens(index, iterParams); evalFromToDeltaParameters(index, iterParams); double min = NumberTheory.min(iterParams.funExp, index.argument, iterParams.from, iterParams.to, iterParams.delta); clearParamArgument(index); calcSetDecreaseRemove(pos, min); } /** * Maximum value - iterative operator * maxi(i,m,n,f(i),b) --> max f(i) from i=m to i=n by delta * i - index (argument) * m, n - numbers or expressions * f(i) - function string * by delta * * @param pos the token position */ private void MAX(int pos) { IterativeOperatorParameters iterParams = new IterativeOperatorParameters( getFunctionParameters(pos, tokensList) ); ArgumentParameter index = getParamArgument(iterParams.indexParam.paramStr); updateMissingTokens(index, iterParams); evalFromToDeltaParameters(index, iterParams); double max = NumberTheory.max(iterParams.funExp, index.argument, iterParams.from, iterParams.to, iterParams.delta); clearParamArgument(index); calcSetDecreaseRemove(pos, max); } /** * Average function value - iterative operator * avg(i,m,n,f(i),b) --> avg f(i) from i=m to i=n by delta * i - index (argument) * m, n - numbers or expressions * f(i) - function string * by delta * * @param pos the token position */ private void AVG(int pos) { IterativeOperatorParameters iterParams = new IterativeOperatorParameters( getFunctionParameters(pos, tokensList) ); ArgumentParameter index = getParamArgument(iterParams.indexParam.paramStr); updateMissingTokens(index, iterParams); evalFromToDeltaParameters(index, iterParams); double avg = Statistics.avg(iterParams.funExp, index.argument, iterParams.from, iterParams.to, iterParams.delta); clearParamArgument(index); calcSetDecreaseRemove(pos, avg, true); } /** * Variance from sample function values - iterative operator * vari(i,m,n,f(i),b) --> var f(i) from i=m to i=n by delta * i - index (argument) * m, n - numbers or expressions * f(i) - function string * by delta * * @param pos the token position */ private void VAR(int pos) { IterativeOperatorParameters iterParams = new IterativeOperatorParameters( getFunctionParameters(pos, tokensList) ); ArgumentParameter index = getParamArgument(iterParams.indexParam.paramStr); updateMissingTokens(index, iterParams); evalFromToDeltaParameters(index, iterParams); double var = Statistics.var(iterParams.funExp, index.argument, iterParams.from, iterParams.to, iterParams.delta); clearParamArgument(index); calcSetDecreaseRemove(pos, var, true); } /** * Standard deviation from sample function values - iterative operator * stdi(i,m,n,f(i),b) --> std f(i) from i=m to i=n by delta * i - index (argument) * m, n - numbers or expressions * f(i) - function string * by delta * * @param pos the token position */ private void STD(int pos) { IterativeOperatorParameters iterParams = new IterativeOperatorParameters( getFunctionParameters(pos, tokensList) ); ArgumentParameter index = getParamArgument(iterParams.indexParam.paramStr); updateMissingTokens(index, iterParams); evalFromToDeltaParameters(index, iterParams); double std = Statistics.std(iterParams.funExp, index.argument, iterParams.from, iterParams.to, iterParams.delta); clearParamArgument(index); calcSetDecreaseRemove(pos, std, true); } /** * Function derivative * * @param pos the token position * @param derivativeType the type of derivative (LEFT, RIGHT, ...) */ private void DERIVATIVE(int pos, int derivativeType) { /* * 2 params - der( f(x), x ) * 3 params - der( f(x), x, x0 ) * 4 params - der( f(x), x, eps, maxsteps ) * 5 params - der( f(x), x, x0, eps, maxsteps ) */ List derParams = getFunctionParameters(pos, tokensList); /* * Default epsilon */ final double DEF_EPS = 1E-8; /* * Default max number of steps */ final int DEF_MAX_STEPS = 20; /* * Get internal function strinng * 1th - parameter */ FunctionParameter funParam = derParams.get(0); /* * Get argument * 2nd - parameter */ FunctionParameter xParam = derParams.get(1); ArgumentParameter x = getParamArgument(xParam.paramStr); if (x.presence == Argument.NOT_FOUND) { updateMissingTokens(xParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(funParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); } Expression funExp = new Expression(funParam.paramStr, funParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); double x0 = Double.NaN; /* * der( f(x), x ) * der( f(x), x, eps, maxsteps ) */ if ( (derParams.size() == 2) || (derParams.size() == 4) ) x0 = x.argument.getArgumentValue(); /* * der( f(x), x, x0 ) * der( f(x), x, x0, eps, maxsteps ) */ if ( (derParams.size() == 3) || (derParams.size() == 5) ) { FunctionParameter x0Param = derParams.get(2); if (x.presence == Argument.NOT_FOUND) updateMissingTokens(x0Param.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); Expression x0Expr = new Expression(x0Param.paramStr, x0Param.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); x0 = x0Expr.calculate(); } double eps = DEF_EPS; int maxSteps = DEF_MAX_STEPS; /* * der( f(x), x, eps, maxsteps ) * der( f(x), x, x0, eps, maxsteps ) */ if ( (derParams.size() == 4) || (derParams.size() == 5) ) { FunctionParameter epsParam; FunctionParameter maxStepsParam; if (derParams.size() == 4) { epsParam = derParams.get(2); maxStepsParam = derParams.get(3); } else { epsParam = derParams.get(3); maxStepsParam = derParams.get(4); } if (x.presence == Argument.NOT_FOUND) { updateMissingTokens(epsParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(maxStepsParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); } Expression epsExpr = new Expression(epsParam.paramStr, epsParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); Expression maxStepsExp = new Expression(maxStepsParam.paramStr, maxStepsParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); eps = epsExpr.calculate(); maxSteps = (int)Math.round(maxStepsExp.calculate()); } if (derivativeType == Calculus.GENERAL_DERIVATIVE) { double general = Calculus.derivative(funExp, x.argument, x0, Calculus.GENERAL_DERIVATIVE, eps, maxSteps); calcSetDecreaseRemove(pos, general); } else if (derivativeType == Calculus.LEFT_DERIVATIVE) { double left = Calculus.derivative(funExp, x.argument, x0, Calculus.LEFT_DERIVATIVE, eps, maxSteps); calcSetDecreaseRemove(pos, left); } else { double right = Calculus.derivative(funExp, x.argument, x0, Calculus.RIGHT_DERIVATIVE, eps, maxSteps); calcSetDecreaseRemove(pos, right); } clearParamArgument(x); } /** * Function derivative * * @param pos the token position * @param derivativeType the type of derivative (left, right, etc...) */ private void DERIVATIVE_NTH(int pos, int derivativeType) { final double DEF_EPS = 1E-6; /* * Default max number of steps */ final int DEF_MAX_STEPS = 20; List derParams = getFunctionParameters(pos, tokensList); /* * Get internal function strinng * 1st - parameter */ FunctionParameter funParam = derParams.get(0); /* * Get n-th * 2nd - parameter */ FunctionParameter nParam = derParams.get(1); /* * Get argument * 3rd - parameter */ FunctionParameter xParam = derParams.get(2); ArgumentParameter x = getParamArgument(xParam.paramStr); if (x.presence == Argument.NOT_FOUND) { updateMissingTokens(xParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(funParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(nParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); } Expression funExp = new Expression(funParam.paramStr, funParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); Expression nExp = new Expression(nParam.paramStr, nParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); double n = nExp.calculate(); double x0 = x.argument.getArgumentValue(); double eps = DEF_EPS; int maxSteps = DEF_MAX_STEPS; if (derParams.size() == 5) { FunctionParameter epsParam = derParams.get(3); FunctionParameter maxStepsParam = derParams.get(4); if (x.presence == Argument.NOT_FOUND) { updateMissingTokens(epsParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(maxStepsParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); } Expression epsExpr = new Expression(epsParam.paramStr, epsParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); Expression maxStepsExp = new Expression(maxStepsParam.paramStr, maxStepsParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); eps = epsExpr.calculate(); maxSteps = (int)Math.round(maxStepsExp.calculate()); } if (derivativeType == Calculus.GENERAL_DERIVATIVE) { double left = Calculus.derivativeNth(funExp, n, x.argument, x0, Calculus.LEFT_DERIVATIVE, eps, maxSteps); double right = Calculus.derivativeNth(funExp, n, x.argument, x0, Calculus.RIGHT_DERIVATIVE, eps, maxSteps); calcSetDecreaseRemove(pos, (left + right) / 2.0); } else if (derivativeType == Calculus.LEFT_DERIVATIVE) { double left = Calculus.derivativeNth(funExp, n, x.argument, x0, Calculus.LEFT_DERIVATIVE, eps, maxSteps); calcSetDecreaseRemove(pos, left); } else { double right = Calculus.derivativeNth(funExp, n, x.argument, x0, Calculus.RIGHT_DERIVATIVE, eps, maxSteps); calcSetDecreaseRemove(pos, right); } clearParamArgument(x); } /** * Function integral * * @param pos the token position */ private void INTEGRAL(int pos) { /** * Default epsilon */ final double DEF_EPS = 1E-6; /* * Default max number of steps */ final int DEF_MAX_STEPS = 20; List intParams = getFunctionParameters(pos, tokensList); /* * Get internal function strinng * 1th - parameter */ FunctionParameter funParam = intParams.get(0); /* * Get argument * 2nd - parameter */ FunctionParameter xParam = intParams.get(1); /* * Get * 2nd - parameter */ FunctionParameter aParam = intParams.get(2); FunctionParameter bParam = intParams.get(3); ArgumentParameter x = getParamArgument(xParam.paramStr); if (x.presence == Argument.NOT_FOUND) { updateMissingTokens(xParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(funParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(aParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(bParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); } Expression funExp = new Expression(funParam.paramStr, funParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); Expression aExp = new Expression(aParam.paramStr, aParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); Expression bExp = new Expression(bParam.paramStr, bParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); double eps = DEF_EPS; int maxSteps = DEF_MAX_STEPS; calcSetDecreaseRemove(pos, Calculus.integralTrapezoid(funExp, x.argument, aExp.calculate(), bExp.calculate(), eps, maxSteps) ); clearParamArgument(x); } /** * Function SOLVE * * @param pos the token position */ private void SOLVE(int pos) { /** * Default epsilon */ final double DEF_EPS = 1E-9; /* * Default max number of steps */ final int DEF_MAX_STEPS = 100; List intParams = getFunctionParameters(pos, tokensList); /* * Get internal function strinng * 1th - parameter */ FunctionParameter funParam = intParams.get(0); /* * Get argument * 2nd - parameter */ FunctionParameter xParam = intParams.get(1); /* * Get * 2nd - parameter */ FunctionParameter aParam = intParams.get(2); FunctionParameter bParam = intParams.get(3); ArgumentParameter x = getParamArgument(xParam.paramStr); if (x.presence == Argument.NOT_FOUND) { updateMissingTokens(xParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(funParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(aParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); updateMissingTokens(bParam.tokens, xParam.paramStr, x.index, Argument.TYPE_ID ); } Expression funExp = new Expression(funParam.paramStr, funParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); Expression aExp = new Expression(aParam.paramStr, aParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); Expression bExp = new Expression(bParam.paramStr, bParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); double eps = DEF_EPS; int maxSteps = DEF_MAX_STEPS; calcSetDecreaseRemove(pos, Calculus.solveBrent(funExp, x.argument, aExp.calculate(), bExp.calculate(), eps, maxSteps) ); clearParamArgument(x); } /** * Forward difference operator * * @param pos the token position */ private void FORWARD_DIFFERENCE(int pos) { List params = getFunctionParameters(pos, tokensList); FunctionParameter funParam = params.get(0); FunctionParameter xParam = params.get(1); ArgumentParameter x = getParamArgument(xParam.paramStr); Expression funExp = new Expression(funParam.paramStr, funParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); if (verboseMode == true) funExp.setVerboseMode(); double h = 1; if (params.size() == 3) { FunctionParameter hParam = params.get(2); Expression hExp = new Expression(hParam.paramStr, hParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); if (verboseMode == true) hExp.setVerboseMode(); h = hExp.calculate(); } calcSetDecreaseRemove(pos, Calculus.forwardDifference(funExp, h, x.argument) ); clearParamArgument(x); } /** * Backward diffrence operator * * @param pos the token position */ private void BACKWARD_DIFFERENCE(int pos) { List params = getFunctionParameters(pos, tokensList); FunctionParameter funParam = params.get(0); FunctionParameter xParam = params.get(1); ArgumentParameter x = getParamArgument(xParam.paramStr); Expression funExp = new Expression(funParam.paramStr, funParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); if (verboseMode == true) funExp.setVerboseMode(); double h = 1; if (params.size() == 3) { FunctionParameter hParam = params.get(2); Expression hExp = new Expression(hParam.paramStr, hParam.tokens, argumentsList, functionsList, constantsList, DISABLE_ROUNDING, UDFExpression, UDFVariadicParamsAtRunTime); if (verboseMode == true) hExp.setVerboseMode(); h = hExp.calculate(); } calcSetDecreaseRemove(pos, Calculus.backwardDifference(funExp, h, x.argument) ); clearParamArgument(x); } /** * Minimum variadic * Sets tokens to number token * * @param pos the token position */ private void MIN_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.min( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * Maximum variadic * Sets tokens to number token * * @param pos token index (position) */ private void MAX_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.max( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * Sum variadic * Sets tokens to number token * * @param pos token index (position) */ private void SUM_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.sum( mXparser.arrayList2double(numbers) ), numbers.size(), true); } /** * Sum variadic * Sets tokens to number token * * @param pos token index (position) */ private void PROD_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.prod( mXparser.arrayList2double(numbers) ), numbers.size(), true); } /** * Average variadic * Sets tokens to number token * * @param pos token index (position) */ private void AVG_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, Statistics.avg( mXparser.arrayList2double(numbers) ), numbers.size(), true); } /** * Variance variadic * Sets tokens to number token * * @param pos token index (position) */ private void VAR_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, Statistics.var( mXparser.arrayList2double(numbers) ), numbers.size(), true); } /** * Standard deviation variadic * Sets tokens to number token * * @param pos token index (position) */ private void STD_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, Statistics.std( mXparser.arrayList2double(numbers) ), numbers.size(), true); } /** * Continued fraction * * @param pos the token position */ private void CONTINUED_FRACTION(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, MathFunctions.continuedFraction( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * Continued polynomial * * @param pos the token position */ private void CONTINUED_POLYNOMIAL(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, MathFunctions.continuedPolynomial( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * Greates Common Divisor * * @param pos the token position */ private void GCD(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.gcd( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * Lowest Common Multiply * * @param pos the token position */ private void LCM(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.lcm( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * Random number from list * * @param pos the token position */ private void RND_LIST(int pos) { List numbers = getNumbers(pos); int n = numbers.size(); int i = ProbabilityDistributions.rndIndex(n, ProbabilityDistributions.randomGenerator); variadicSetDecreaseRemove(pos, numbers.get(i), numbers.size() ); } /** * Coalesce * * @param pos the token position */ private void COALESCE(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, MathFunctions.coalesce( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * OR_VARIADIC * * @param pos the token position */ private void OR_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, BooleanAlgebra.orVariadic( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * AND_VARIADIC * * @param pos the token position */ private void AND_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, BooleanAlgebra.andVariadic( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * XOR_VARIADIC * * @param pos the token position */ private void XOR_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, BooleanAlgebra.xorVariadic( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * ARGMIN_VARIADIC * * @param pos the token position */ private void ARGMIN_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.argmin( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * ARGMAX_VARIADIC * * @param pos the token position */ private void ARGMAX_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.argmax( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * MEDIAN_VARIADIC * * @param pos the token position */ private void MEDIAN_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, Statistics.median( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * MODE_VARIADIC * * @param pos the token position */ private void MODE_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, Statistics.mode( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * BASE_VARIADIC * * @param pos the token position */ private void BASE_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.convOthBase2Decimal( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * NDIST_VARIADIC * * @param pos the token position */ private void NDIST_VARIADIC(int pos) { List numbers = getNumbers(pos); variadicSetDecreaseRemove(pos, NumberTheory.numberOfDistValues( mXparser.arrayList2double(numbers) ), numbers.size() ); } /** * Parser symbols * Removes comma * * @param pos token index (position) */ private void COMMA(int pos) { tokensList.remove(pos); } /** * Parser symbols * Removes parenthesis * * @param lPos left token index (position) * @param rPos roght token index (position) */ private void PARENTHESES(int lPos, int rPos) { for (int p = lPos; p <= rPos; p++) tokensList.get(p).tokenLevel--; tokensList.remove(rPos); tokensList.remove(lPos); } /*================================================= * * Syntax checking and calculate() method * *================================================= */ /** * Checks syntax of the expression string. * * @return true if syntax is ok */ public boolean checkLexSyntax() { boolean syntax = NO_SYNTAX_ERRORS; recursionCallsCounter = 0; if (expressionString.length() == 0) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = "Empty expression string\n"; return syntax; } SyntaxChecker syn = new SyntaxChecker(new ByteArrayInputStream(expressionString.getBytes())); try { syn.checkSyntax(); } catch (Exception e) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = "lexical error \n\n" + e.getMessage() + "\n"; } return syntax; } /** * Checks syntax of the expression string. * * @return true if syntax is ok */ public boolean checkSyntax() { boolean syntax = checkSyntax("[" + expressionString + "] ", false); return syntax; } /** * Checks syntax of the calculus parameter * * @return true if syntax is ok */ private int checkCalculusParameter(String param) { int errors = 0; for (KeyWord kw : keyWordsList) if (kw.wordTypeId != Argument.TYPE_ID) if ( param.equals(kw.wordString) ) errors++; return errors; } /** * Checks if argument given in the function parameter is known * in the expression. * * @param param the function parameter * * @return true if argument is known, * otherwise returns false. */ private boolean checkIfKnownArgument(FunctionParameter param) { if (param.tokens.size() > 1) return false; Token t = param.tokens.get(0); if (t.tokenTypeId != Argument.TYPE_ID) return false; return true; } /** * Checks if token is uknown * * @param param the function parameter * * @return true if there is only 1 token with unknown type, * otherwise returns false. */ private boolean checkIfUnknownToken(FunctionParameter param) { if (param.tokens.size() > 1) return false; Token t = param.tokens.get(0); if (t.tokenTypeId != ConstantValue.NaN) return false; return true; } /** * Checking the syntax (recursively). * * @param level string representing the recurssion level. * @return true if syntax was correct, * otherwise returns false. */ private boolean checkSyntax(String level, boolean functionWithBodyExt) { if ( (expressionWasModified == false) && (syntaxStatus == NO_SYNTAX_ERRORS) && (optionsChangesetNumber == mXparser.optionsChangesetNumber) ) { errorMessage = level + "already checked - no errors!\n"; recursionCallPending = false; return NO_SYNTAX_ERRORS; } optionsChangesetNumber = mXparser.optionsChangesetNumber; if (functionWithBodyExt) { syntaxStatus = NO_SYNTAX_ERRORS; recursionCallPending = false; expressionWasModified = false; errorMessage = errorMessage + level + "function with extended body - assuming no errors.\n"; return NO_SYNTAX_ERRORS; } recursionCallPending = true; errorMessage = level +"checking ...\n"; boolean syntax = NO_SYNTAX_ERRORS; if (expressionString.length() == 0) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + "Empty expression string\n"; syntaxStatus = syntax; recursionCallPending = false; return syntax; } SyntaxChecker syn = new SyntaxChecker(new ByteArrayInputStream(expressionString.getBytes())); try { syn.checkSyntax(); /* * IF there are no lex error */ tokenizeExpressionString(); /* * Duplicated tokens? */ String kw1; String kw2; java.util.Collections.sort(keyWordsList, new KwStrComparator() ); for (int kwId = 1; kwId < keyWordsList.size(); kwId++) { kw1 = keyWordsList.get(kwId-1).wordString; kw2 = keyWordsList.get(kwId).wordString; if ( kw1.equals(kw2) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + "(" + kw1 + ") Duplicated .\n"; } } int tokensNumber = initialTokens.size(); Stack syntaxStack = new Stack(); SyntaxStackElement stackElement; for (int tokenIndex = 0; tokenIndex < tokensNumber; tokenIndex++ ) { Token t = initialTokens.get(tokenIndex); String tokenStr = "(" + t.tokenStr +", " + tokenIndex + ") "; /* * Check syntax for "ARGUMENT" token */ if (t.tokenTypeId == Argument.TYPE_ID) { Argument arg = getArgument(t.tokenId); if (getParametersNumber(tokenIndex) >= 0 ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " was expected.\n"; } else if (arg.getArgumentBodyType() == Argument.BODY_RUNTIME) { if ( arg.getArgumentType() == Argument.DEPENDENT_ARGUMENT ) { if ( (arg.argumentExpression != this) && (arg.argumentExpression.recursionCallPending == false) ) { boolean syntaxRec = arg.argumentExpression.checkSyntax(level + "-> " + "[" + t.tokenStr + "] = [" + arg.argumentExpression.getExpressionString() + "] ", false); syntax = syntax && syntaxRec; errorMessage = errorMessage + level + tokenStr + "checking dependent argument ...\n" + arg.argumentExpression.getErrorMessage(); } } } else { errorMessage = errorMessage + level + tokenStr + "argument with extended body - assuming no errors.\n"; } } /* * Check syntax for "RECURSIVE ARGUMENT" token */ if (t.tokenTypeId == RecursiveArgument.TYPE_ID_RECURSIVE) { Argument arg = getArgument(t.tokenId); if (getParametersNumber(tokenIndex) != 1 ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting 1 parameter.\n"; } else if ( (arg.argumentExpression != this) && (arg.argumentExpression.recursionCallPending == false) ) { boolean syntaxRec = arg.argumentExpression.checkSyntax(level + "-> " + "[" + t.tokenStr + "] = [" + arg.argumentExpression.getExpressionString() + "] ", false); syntax = syntax && syntaxRec; errorMessage = errorMessage + level + tokenStr + "checking recursive argument ...\n" + arg.argumentExpression.getErrorMessage(); } } /* * Check syntax for "NOT RECOGNIZED" token */ if (t.tokenTypeId == Token.NOT_MATCHED) { boolean calculusToken = false; for (SyntaxStackElement e : syntaxStack) if ( e.tokenStr.equals(t.tokenStr) ) calculusToken = true; if (!calculusToken) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + "invalid .\n"; } } /* * Check syntax for "USER DEFINED FUNCTION" token */ if (t.tokenTypeId == Function.TYPE_ID) { Function fun = getFunction(t.tokenId); fun.checkRecursiveMode(); int npar = getParametersNumber(tokenIndex); int fpar = fun.getParametersNumber(); if (npar == 0) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting at least one argument.\n"; } else if ( (fun.isVariadic == false) && ( fpar != npar ) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting " + fpar + " arguments.\n"; } else if ( (fun.functionExpression != this) && (fun.functionExpression.recursionCallPending == false) ) { boolean syntaxRec; if (fun.getFunctionBodyType() == Function.BODY_RUNTIME) syntaxRec = fun.functionExpression.checkSyntax(level + "-> " + "[" + t.tokenStr + "] = [" + fun.functionExpression.getExpressionString() + "] ", false); else syntaxRec = fun.functionExpression.checkSyntax(level + "-> " + "[" + t.tokenStr + "] = [" + fun.functionExpression.getExpressionString() + "] ", true); syntax = syntax && syntaxRec; if (fun.isVariadic) errorMessage = errorMessage + level + tokenStr + "checking variadic user defined function ...\n" + fun.functionExpression.getErrorMessage(); else errorMessage = errorMessage + level + tokenStr + "checking user defined function ...\n" + fun.functionExpression.getErrorMessage(); } } /* * Check syntax for "CONSTANT" token */ if (t.tokenTypeId == ConstantValue.TYPE_ID) { if ( getParametersNumber(tokenIndex) >= 0 ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " was expected.\n"; } } /* * Check syntax for "USER DEFINED CONSTANT" token */ if (t.tokenTypeId == Constant.TYPE_ID) { if ( getParametersNumber(tokenIndex) >= 0 ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " was expected.\n"; } } /* * Check syntax for "UNARY FUNCTION" token */ if (t.tokenTypeId == Function1Arg.TYPE_ID) { if ( getParametersNumber(tokenIndex) != 1 ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting 1 argument.\n"; } } /* * Check syntax for "BINARY FUNCTION" token */ if (t.tokenTypeId == Function2Arg.TYPE_ID) { if ( getParametersNumber(tokenIndex) != 2 ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting 2 arguments.\n"; } } /* * Check syntax for "3 args FUNCTION" token */ if (t.tokenTypeId == Function3Arg.TYPE_ID) { if ( getParametersNumber(tokenIndex) != 3 ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting 3 arguments.\n"; } } /* * Check syntax for "CALCULUS OPERATOR" token */ if (t.tokenTypeId == CalculusOperator.TYPE_ID) { int paramsNumber = getParametersNumber(tokenIndex); List funParams = null; if (paramsNumber > 0) funParams = getFunctionParameters(tokenIndex, initialTokens); if ( (t.tokenId == CalculusOperator.DER_ID) || (t.tokenId == CalculusOperator.DER_LEFT_ID) || (t.tokenId == CalculusOperator.DER_RIGHT_ID) ) { if ( (paramsNumber < 2) || (paramsNumber > 5) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting 2 or 3 or 4 or 5 calculus parameters.\n"; } else { if ( (paramsNumber == 2) || (paramsNumber == 4) ) { FunctionParameter argParam = funParams.get(1); if ( checkIfKnownArgument(argParam) == false) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " argument was expected.\n"; } } else { FunctionParameter argParam = funParams.get(1); stackElement = new SyntaxStackElement(argParam.paramStr, t.tokenLevel+1); syntaxStack.push(stackElement); int errors = checkCalculusParameter(stackElement.tokenStr); if (errors > 0) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " Found duplicated key words for calculus parameter " + "(" + stackElement.tokenStr + ", " + errors + ").\n"; } if ( !checkIfKnownArgument(argParam) && !checkIfUnknownToken(argParam) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " One token (argument or unknown) was expected.\n"; } } } } if (t.tokenId == CalculusOperator.DERN_ID) { if ( (paramsNumber !=3) && (paramsNumber != 5) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting 3 or 5 calculus arguments.\n"; } else { FunctionParameter argParam = funParams.get(2); if ( checkIfKnownArgument(argParam) == false) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " argument was expected.\n"; } } } if ( (t.tokenId == CalculusOperator.INT_ID) || (t.tokenId == CalculusOperator.SOLVE_ID) ) { if (paramsNumber !=4) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting 4 calculus arguments.\n"; } else { FunctionParameter argParam = funParams.get(1); stackElement = new SyntaxStackElement(argParam.paramStr, t.tokenLevel+1); syntaxStack.push(stackElement); int errors = checkCalculusParameter(stackElement.tokenStr); if (errors > 0) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + "Found duplicated key words for calculus parameter " + "(" + stackElement.tokenStr + ", " + errors + ").\n"; } if ( !checkIfKnownArgument(argParam) && !checkIfUnknownToken(argParam) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + "One token (argument or unknown) was expected.\n"; } } } if ( (t.tokenId == CalculusOperator.PROD_ID) || (t.tokenId == CalculusOperator.SUM_ID) || (t.tokenId == CalculusOperator.MIN_ID) || (t.tokenId == CalculusOperator.MAX_ID) || (t.tokenId == CalculusOperator.AVG_ID) || (t.tokenId == CalculusOperator.VAR_ID) || (t.tokenId == CalculusOperator.STD_ID) ) { if ( (paramsNumber != 4) && (paramsNumber != 5) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting 4 or 5 calculus arguments.\n"; } else { FunctionParameter indexParam = funParams.get(0); stackElement = new SyntaxStackElement(indexParam.paramStr, t.tokenLevel+1); syntaxStack.push(stackElement); int errors = checkCalculusParameter(stackElement.tokenStr); if (errors > 0) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + "Found duplicated key words for calculus parameter " + "(" + stackElement.tokenStr + ", " + errors + ").\n"; } if ( !checkIfKnownArgument(indexParam) && !checkIfUnknownToken(indexParam) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + "One token (argument or unknown) was expected.\n"; } } } if ( (t.tokenId == CalculusOperator.FORW_DIFF_ID) || (t.tokenId == CalculusOperator.BACKW_DIFF_ID) ) { if ( (paramsNumber != 2) && (paramsNumber != 3) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " expecting 2 or 3 arguments.\n"; } else { FunctionParameter xParam = funParams.get(1); if ( checkIfKnownArgument(xParam) == false) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + " argument was expected.\n"; } } } } /* * Check syntax for "VARIADIC FUNCTION" token */ if (t.tokenTypeId == FunctionVariadic.TYPE_ID) { int paramsNumber = getParametersNumber(tokenIndex); if (paramsNumber < 1) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + "At least one argument was expected.\n"; } if (t.tokenId == FunctionVariadic.IFF_ID) { if ( (paramsNumber % 2 != 0) || (paramsNumber < 2) ) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + tokenStr + "Expecting parity number of arguments.\n"; } } } if ( (t.tokenTypeId == ParserSymbol.TYPE_ID) && (t.tokenId == ParserSymbol.RIGHT_PARENTHESES_ID) ) { if ( syntaxStack.size() > 0 ) if (t.tokenLevel == syntaxStack.lastElement().tokenLevel ) syntaxStack.pop(); } } } catch (Exception e) { syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN; errorMessage = errorMessage + level + "lexical error \n\n" + e.getMessage() + "\n"; } if (syntax == NO_SYNTAX_ERRORS) { errorMessage = errorMessage + level + "no errors.\n"; expressionWasModified = false; } else { errorMessage = errorMessage + level + "errors were found.\n"; expressionWasModified = true; } syntaxStatus = syntax; recursionCallPending = false; return syntax; } /** * Calculates the expression value * * @return The expression value if syntax was ok, * otherwise returns Double.NaN. */ public double calculate() { computingTime = 0; long startTime = System.currentTimeMillis(); if (verboseMode == true) { printSystemInfo("\n", NO_EXP_STR); printSystemInfo("\n", WITH_EXP_STR); printSystemInfo("Starting ...\n", WITH_EXP_STR); showArguments(); } /* * check expression syntax and * evaluate expression string tokens * */ if ( (expressionWasModified == true) || (syntaxStatus != NO_SYNTAX_ERRORS) ) syntaxStatus = checkSyntax(); if ( syntaxStatus == SYNTAX_ERROR_OR_STATUS_UNKNOWN) { errorMessage = errorMessage + "Problem with expression syntax\n"; if (verboseMode == true) printSystemInfo("syntaxStatus == SYNTAX_ERROR_OR_STATUS_UNKNOWN, returning Double.NaN\n", NO_EXP_STR); /* * Recursive counter to avoid infinite loops in expressions * created in they way shown in below examples * * Argument x = new Argument("x = 2*y"); * Argument y = new Argument("y = 2*x"); * x.addDefinitions(y); * y.addDefinitions(x); * * Function f = new Function("f(x) = 2*g(x)"); * Function g = new Function("g(x) = 2*f(x)"); * f.addDefinitions(g); * g.addDefinitions(f); * */ recursionCallsCounter = 0; return Double.NaN; } /* * Building initial tokens only if this is first recursion call * or we have expression clone, helps to solve problem with * definitions similar to the below example * * * Function f = new Function("f(x) = 2*g(x)"); * Function g = new Function("g(x) = 2*f(x)"); * f.addDefinitions(g); * g.addDefinitions(f); */ if ( (recursionCallsCounter == 0) || (internalClone) ) copyInitialTokens(); /* * if nothing to calculate return Double.NaN */ if (tokensList.size() == 0) { errorMessage = errorMessage + "Empty expression\n"; if (verboseMode == true) printSystemInfo("tokensList.size() == 0, returning Double.NaN\n", NO_EXP_STR); recursionCallsCounter = 0; return Double.NaN; } /* * Incrementing recursive counter to avoid infinite loops in expressions * created in they way shown in below examples * * Argument x = new Argument("x = 2*y"); * Argument y = new Argument("y = 2*x"); * x.addDefinitions(y); * y.addDefinitions(x); * * Function f = new Function("f(x) = 2*g(x)"); * Function g = new Function("g(x) = 2*f(x)"); * f.addDefinitions(g); * g.addDefinitions(f); * */ if (recursionCallsCounter >= mXparser.MAX_RECURSION_CALLS) { errorMessage = errorMessage + "recursionCallsCounter >= MAX_RECURSION_CALLS\n"; if (verboseMode == true) { printSystemInfo("recursionCallsCounter >= mXparser.MAX_RECURSION_CALLS, returning Double.NaN\n", NO_EXP_STR); printSystemInfo("recursionCallsCounter = " + recursionCallsCounter + "\n", NO_EXP_STR); printSystemInfo("mXparser.MAX_RECURSION_CALLS = " + mXparser.MAX_RECURSION_CALLS + "\n", NO_EXP_STR); } recursionCallsCounter = 0; this.errorMessage = errorMessage + "\n" + "[" + description + "][" + expressionString + "] " + "Maximum recursion calls reached.\n"; return Double.NaN; } recursionCallsCounter++; /* * position for particular tokens types */ int calculusPos; int ifPos; int iffPos; int variadicFunPos; int depArgPos; int recArgPos; int f3ArgPos; int f2ArgPos; int f1ArgPos; int userFunPos; int plusPos; int minusPos; int multiplyPos; int dividePos; int powerPos; int tetrationPos; int powerNum; int factPos; int modPos; int percPos; int negPos; int andGroupPos; int orGroupPos; int implGroupPos; int bolPos; int eqPos; int neqPos; int ltPos; int gtPos; int leqPos; int geqPos; int commaPos; int lParPos; int rParPos; int bitwisePos; int bitwiseComplPos; Token token; Token tokenL; Token tokenR; Argument argument; int tokensNumber; int maxPartLevel; int lPos; int rPos; int tokenIndex; int pos; int p; List commas = null; int emptyLoopCounter = 0; /* While exist token which needs to bee evaluated */ if (verboseMode == true) printSystemInfo("Starting calculation loop\n", WITH_EXP_STR); do { if (mXparser.isCurrentCalculationCancelled()) { errorMessage = errorMessage + "\n" + "Cancel request - finishing"; return Double.NaN; } tokensNumber = tokensList.size(); maxPartLevel = -1; lPos = -1; rPos = -1; /* * initializing tokens types positions */ calculusPos = -1; ifPos = -1; iffPos = -1; variadicFunPos = -1; recArgPos = -1; depArgPos = -1; f3ArgPos = -1; f2ArgPos = -1; f1ArgPos = -1; userFunPos = -1; plusPos = -1; minusPos = -1; multiplyPos = -1; dividePos = -1; powerPos = -1; tetrationPos = -1; factPos = -1; modPos = -1; percPos = -1; powerNum = 0; negPos = -1; andGroupPos = -1; orGroupPos = -1; implGroupPos = -1; bolPos = -1; eqPos = -1; neqPos = -1; ltPos = -1; gtPos = -1; leqPos = -1; geqPos = -1; commaPos = -1; lParPos = -1; rParPos = -1; bitwisePos = -1; bitwiseComplPos = -1; /* calculus or if or iff operations ... */ p = -1; do { p++; token = tokensList.get(p); if (token.tokenTypeId == CalculusOperator.TYPE_ID) calculusPos = p; else if ( (token.tokenTypeId == Function3Arg.TYPE_ID) && (token.tokenId == Function3Arg.IF_CONDITION_ID) ) ifPos = p; else if ( (token.tokenTypeId == FunctionVariadic.TYPE_ID) && (token.tokenId == FunctionVariadic.IFF_ID) ) iffPos = p; } while ( (p < tokensNumber-1 ) && (calculusPos < 0) && (ifPos < 0) && (iffPos < 0) ); if ( (calculusPos < 0) && (ifPos < 0) && (iffPos < 0) ){ /* Find start index of the tokens with the highest level */ for (tokenIndex = 0; tokenIndex < tokensNumber; tokenIndex++) { token = tokensList.get(tokenIndex); if (token.tokenLevel > maxPartLevel) { maxPartLevel = tokensList.get(tokenIndex).tokenLevel; lPos = tokenIndex; } if (token.tokenTypeId == Argument.TYPE_ID) { argument = argumentsList.get( tokensList.get(tokenIndex).tokenId ); /* * Only free arguments can be directly * replaced with numbers. This is in order to * avoid tokensList change in possible * recursive calls from dependent arguments * as dependent arguments will not work * on argument clones. Here we are also checking * if there is dependent argument in expression. */ if (argument.argumentType == Argument.FREE_ARGUMENT) FREE_ARGUMENT(tokenIndex); else depArgPos = tokenIndex; } else if (token.tokenTypeId == ConstantValue.TYPE_ID) CONSTANT(tokenIndex); else if (token.tokenTypeId == Unit.TYPE_ID) UNIT(tokenIndex); else if (token.tokenTypeId == Constant.TYPE_ID) USER_CONSTANT(tokenIndex); else if (token.tokenTypeId == RandomVariable.TYPE_ID) RANDOM_VARIABLE(tokenIndex); } if (lPos < 0) { errorMessage = errorMessage + "\n" + "Internal error / strange token level - finishing"; return Double.NaN; } /* * If dependent argument was found then dependent arguments * in the tokensList need to replaced one after another in * separate loops as tokensList might change in some other * call done in possible recursive call. * * Argument x = new Argument("x = 2*y"); * Argument y = new Argument("y = 2*x"); * x.addDefinitions(y); * y.addDefinitions(x); */ if (depArgPos >= 0) { boolean depArgFound; do { depArgFound = false; int currentTokensNumber = tokensList.size(); for (tokenIndex = 0; tokenIndex < currentTokensNumber; tokenIndex++) { token = tokensList.get(tokenIndex); if (token.tokenTypeId == Argument.TYPE_ID) { argument = argumentsList.get( tokensList.get(tokenIndex).tokenId ); if (argument.argumentType == Argument.DEPENDENT_ARGUMENT) { DEPENDENT_ARGUMENT(tokenIndex); depArgFound = true; break; } } } } while (depArgFound); } else { tokenIndex = lPos; /* Find end index of the tokens with the highest level */ while ( (tokenIndex < tokensNumber) && (maxPartLevel == tokensList.get(tokenIndex).tokenLevel ) ) tokenIndex++; rPos = tokenIndex - 1; if (verboseMode == true) { printSystemInfo("Parsing (" + lPos + ", " + rPos + ") ", WITH_EXP_STR); showParsing(lPos,rPos); } /* if no calculus operations were found * check for other tokens */ boolean leftIsNumber; boolean rigthIsNumber; for (pos = lPos; pos <= rPos; pos++) { leftIsNumber = false; rigthIsNumber = false; token = tokensList.get(pos); if (pos-1 >= 0) { tokenL = tokensList.get(pos-1); if (tokenL.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) leftIsNumber = true; } if (pos+1 < tokensNumber) { tokenR = tokensList.get(pos+1); if (tokenR.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) rigthIsNumber = true; } if ((token.tokenTypeId == RecursiveArgument.TYPE_ID_RECURSIVE) && (recArgPos < 0)) recArgPos = pos; else if ((token.tokenTypeId == FunctionVariadic.TYPE_ID) && (variadicFunPos < 0)) variadicFunPos = pos; else if ((token.tokenTypeId == Function3Arg.TYPE_ID) && (f3ArgPos < 0)) f3ArgPos = pos; else if ((token.tokenTypeId == Function2Arg.TYPE_ID) && (f2ArgPos < 0)) f2ArgPos = pos; else if ((token.tokenTypeId == Function1Arg.TYPE_ID) && (f1ArgPos < 0)) f1ArgPos = pos; else if ((token.tokenTypeId == Function.TYPE_ID) && (userFunPos < 0)) userFunPos = pos; else if (token.tokenTypeId == Operator.TYPE_ID) { if ( (token.tokenId == Operator.POWER_ID) && (leftIsNumber && rigthIsNumber) ) { powerPos = pos; powerNum++; } else if ( (token.tokenId == Operator.TETRATION_ID) && (leftIsNumber && rigthIsNumber) ) { tetrationPos = pos; } else if ( (token.tokenId == Operator.FACT_ID) && (factPos < 0) && (leftIsNumber)) { factPos = pos; } else if ( (token.tokenId == Operator.PERC_ID) && (percPos < 0) && (leftIsNumber)) { percPos = pos; } else if ( (token.tokenId == Operator.MOD_ID) && (modPos < 0) && (leftIsNumber && rigthIsNumber)) { modPos = pos; } else if ( (token.tokenId == Operator.PLUS_ID) && (plusPos < 0) && (rigthIsNumber)) plusPos = pos; else if ( (token.tokenId == Operator.MINUS_ID) && (minusPos < 0) && (rigthIsNumber)) minusPos = pos; else if ( (token.tokenId == Operator.MULTIPLY_ID) && (multiplyPos < 0) && (leftIsNumber && rigthIsNumber)) multiplyPos = pos; else if ( (token.tokenId == Operator.DIVIDE_ID) && (dividePos < 0) && (leftIsNumber && rigthIsNumber)) dividePos = pos; } else if (token.tokenTypeId == BooleanOperator.TYPE_ID) { if ( (token.tokenId == BooleanOperator.NEG_ID) && (negPos < 0) && (rigthIsNumber) ) negPos = pos; else if (leftIsNumber && rigthIsNumber) { if ( (token.tokenId == BooleanOperator.AND_ID || token.tokenId == BooleanOperator.NAND_ID) && (andGroupPos < 0) ) andGroupPos = pos; else if ( (token.tokenId == BooleanOperator.OR_ID || token.tokenId == BooleanOperator.NOR_ID || token.tokenId == BooleanOperator.XOR_ID) && (orGroupPos < 0) ) orGroupPos = pos; else if ( (token.tokenId == BooleanOperator.IMP_ID || token.tokenId == BooleanOperator.CIMP_ID || token.tokenId == BooleanOperator.NIMP_ID || token.tokenId == BooleanOperator.CNIMP_ID || token.tokenId == BooleanOperator.EQV_ID) && (implGroupPos < 0) ) implGroupPos = pos; else if (bolPos < 0) bolPos = pos; } } else if (token.tokenTypeId == BinaryRelation.TYPE_ID) { if ( (token.tokenId == BinaryRelation.EQ_ID) && (eqPos < 0) && (leftIsNumber && rigthIsNumber)) eqPos = pos; else if ( (token.tokenId == BinaryRelation.NEQ_ID) && (neqPos < 0) && (leftIsNumber && rigthIsNumber)) neqPos = pos; else if ( (token.tokenId == BinaryRelation.LT_ID) && (ltPos < 0) && (leftIsNumber && rigthIsNumber)) ltPos = pos; else if ( (token.tokenId == BinaryRelation.GT_ID) && (gtPos < 0) && (leftIsNumber && rigthIsNumber)) gtPos = pos; else if ( (token.tokenId == BinaryRelation.LEQ_ID) && (leqPos < 0) && (leftIsNumber && rigthIsNumber)) leqPos = pos; else if ( (token.tokenId == BinaryRelation.GEQ_ID) && (geqPos < 0) && (leftIsNumber && rigthIsNumber)) geqPos = pos; } else if (token.tokenTypeId == BitwiseOperator.TYPE_ID) { if ((token.tokenId == BitwiseOperator.COMPL_ID) && (bitwiseComplPos < 0) && (rigthIsNumber)) bitwiseComplPos = pos; else if ((bitwisePos < 0) && (leftIsNumber && rigthIsNumber)) bitwisePos = pos; } else if (token.tokenTypeId == ParserSymbol.TYPE_ID) { if ( (token.tokenId == ParserSymbol.COMMA_ID) ) { if (commaPos < 0) commas = new ArrayList(); commas.add(pos); commaPos = pos; } else if ( (token.tokenId == ParserSymbol.LEFT_PARENTHESES_ID) && (lParPos < 0) ) lParPos = pos; else if ( (token.tokenId == ParserSymbol.RIGHT_PARENTHESES_ID) && (rParPos < 0) ) rParPos = pos; } } /* * powering should be done using backwards sequence */ if (powerNum > 1) { powerPos = -1; p = rPos+1; do { p--; token = tokensList.get(p); if ( (token.tokenTypeId == Operator.TYPE_ID) && (token.tokenId == Operator.POWER_ID) ) powerPos = p; } while ( (p>lPos) && (powerPos == -1) ); } } } /* calculus operations */ if (calculusPos >= 0) calculusCalc(calculusPos); else if (ifPos >= 0) { IF_CONDITION(ifPos); } else if (iffPos >= 0) { IFF(iffPos); } else /* ... arguments ... */ /* ... recursive arguments ... */ if (recArgPos >= 0) { RECURSIVE_ARGUMENT(recArgPos); } else /* ... variadic functions ... */ if (variadicFunPos >= 0) variadicFunCalc(variadicFunPos); else /* ... 3-args functions ... */ if (f3ArgPos >= 0) f3ArgCalc(f3ArgPos); else /* ... 2-args functions ... */ if (f2ArgPos >= 0) f2ArgCalc(f2ArgPos); else /* ... 1-arg functions ... */ if (f1ArgPos >= 0) f1ArgCalc(f1ArgPos); else /* ... user functions ... */ if (userFunPos >= 0) { USER_FUNCTION(userFunPos); } else /* ... powering ... */ if (tetrationPos >= 0) { TETRATION(tetrationPos); } else if (powerPos >= 0) { POWER(powerPos); } else if (factPos >= 0) { FACT(factPos); } else if (percPos >= 0) { PERC(percPos); } else if (modPos >= 0) { MODULO(modPos); } else if (negPos >= 0) { NEG(negPos); } else if (bitwiseComplPos >= 0) { BITWISE_COMPL(bitwiseComplPos); } else /* ... arithmetical operators ... */ if ( (multiplyPos >= 0) || (dividePos >= 0) ) { if ( (multiplyPos >= 0) && (dividePos >= 0) ) if (multiplyPos <= dividePos) MULTIPLY(multiplyPos); else DIVIDE(dividePos); else if (multiplyPos >= 0) MULTIPLY(multiplyPos); else DIVIDE(dividePos); } else if ( (minusPos >= 0) || (plusPos >= 0) ) { if ( (minusPos >= 0) && (plusPos >= 0) ) if (minusPos <= plusPos) MINUS(minusPos); else PLUS(plusPos); else if (minusPos >= 0) MINUS(minusPos); else PLUS(plusPos); } else if (neqPos >= 0) { NEQ(neqPos); } else /* ... binary relations ... */ if (eqPos >= 0) { EQ(eqPos); } else if (ltPos >= 0) { LT(ltPos); } else if (gtPos >= 0) { GT(gtPos); } else if (leqPos >= 0) { LEQ(leqPos); } else if (geqPos >= 0) { GEQ(geqPos); } else if (commaPos >= 0) { for (int i = commas.size()-1; i >= 0; i--) COMMA( commas.get(i) ); } else /* ... logical operators ... */ if (andGroupPos >= 0) bolCalc(andGroupPos); else if (orGroupPos >= 0) bolCalc(orGroupPos); else if (implGroupPos >= 0) bolCalc(implGroupPos); else if (bolPos >= 0) bolCalc(bolPos); else /* ... bitwise operators ... */ if (bitwisePos >= 0) bitwiseCalc(bitwisePos); else if ( (lParPos >= 0) && (rParPos > lParPos) ) { PARENTHESES(lParPos,rParPos); } else if (tokensList.size() > 1) { this.errorMessage = errorMessage + "\n" + "[" + description + "][" + expressionString + "] " + "Fatal error - not know what to do with tokens while calculate().\n"; } if (verboseMode == true) { showParsing(0,tokensList.size()-1); printSystemInfo(" done\n", NO_EXP_STR); } if (tokensList.size() == tokensNumber) emptyLoopCounter++; else emptyLoopCounter = 0; if (emptyLoopCounter > 10) { errorMessage = errorMessage + "\n" + "Internal error, do not know what to do with the token, probably mXparser bug, please report - finishing"; return Double.NaN; } } while (tokensList.size() > 1); if (verboseMode == true) { printSystemInfo("Calculated value: " + tokensList.get(0).tokenValue + "\n", WITH_EXP_STR); printSystemInfo("Exiting\n", WITH_EXP_STR); printSystemInfo("\n", NO_EXP_STR); } long endTime = System.currentTimeMillis(); computingTime = (endTime - startTime)/1000.0; recursionCallsCounter = 0; double result = tokensList.get(0).tokenValue; if (mXparser.almostIntRounding) { double resultint = Math.round(result); if ( Math.abs(result-resultint) <= BinaryRelations.getEpsilon() ) result = resultint; } return result; } /** * Calculates unary function * @param pos token position */ private void f1ArgCalc(int pos) { switch (tokensList.get(pos).tokenId) { case Function1Arg.SIN_ID: SIN(pos); break; case Function1Arg.COS_ID: COS(pos); break; case Function1Arg.TAN_ID: TAN(pos); break; case Function1Arg.CTAN_ID: CTAN(pos); break; case Function1Arg.SEC_ID: SEC(pos); break; case Function1Arg.COSEC_ID: COSEC(pos); break; case Function1Arg.ASIN_ID: ASIN(pos); break; case Function1Arg.ACOS_ID: ACOS(pos); break; case Function1Arg.ATAN_ID: ATAN(pos); break; case Function1Arg.ACTAN_ID: ACTAN(pos); break; case Function1Arg.LN_ID: LN(pos); break; case Function1Arg.LOG2_ID: LOG2(pos); break; case Function1Arg.LOG10_ID: LOG10(pos); break; case Function1Arg.RAD_ID: RAD(pos); break; case Function1Arg.EXP_ID: EXP(pos); break; case Function1Arg.SQRT_ID: SQRT(pos); break; case Function1Arg.SINH_ID: SINH(pos); break; case Function1Arg.COSH_ID: COSH(pos); break; case Function1Arg.TANH_ID: TANH(pos); break; case Function1Arg.COTH_ID: COTH(pos); break; case Function1Arg.SECH_ID: SECH(pos); break; case Function1Arg.CSCH_ID: CSCH(pos); break; case Function1Arg.DEG_ID: DEG(pos); break; case Function1Arg.ABS_ID: ABS(pos); break; case Function1Arg.SGN_ID: SGN(pos); break; case Function1Arg.FLOOR_ID: FLOOR(pos); break; case Function1Arg.CEIL_ID: CEIL(pos); break; case Function1Arg.NOT_ID: NOT(pos); break; case Function1Arg.ARSINH_ID: ARSINH(pos); break; case Function1Arg.ARCOSH_ID: ARCOSH(pos); break; case Function1Arg.ARTANH_ID: ARTANH(pos); break; case Function1Arg.ARCOTH_ID: ARCOTH(pos); break; case Function1Arg.ARSECH_ID: ARSECH(pos); break; case Function1Arg.ARCSCH_ID: ARCSCH(pos); break; case Function1Arg.SA_ID: SA(pos); break; case Function1Arg.SINC_ID: SINC(pos); break; case Function1Arg.BELL_NUMBER_ID: BELL_NUMBER(pos); break; case Function1Arg.LUCAS_NUMBER_ID: LUCAS_NUMBER(pos); break; case Function1Arg.FIBONACCI_NUMBER_ID: FIBONACCI_NUMBER(pos); break; case Function1Arg.HARMONIC_NUMBER_ID: HARMONIC_NUMBER(pos); break; case Function1Arg.IS_PRIME_ID: IS_PRIME(pos); break; case Function1Arg.PRIME_COUNT_ID: PRIME_COUNT(pos); break; case Function1Arg.EXP_INT_ID: EXP_INT(pos); break; case Function1Arg.LOG_INT_ID: LOG_INT(pos); break; case Function1Arg.OFF_LOG_INT_ID: OFF_LOG_INT(pos); break; case Function1Arg.GAUSS_ERF_ID: GAUSS_ERF(pos); break; case Function1Arg.GAUSS_ERFC_ID: GAUSS_ERFC(pos); break; case Function1Arg.GAUSS_ERF_INV_ID: GAUSS_ERF_INV(pos); break; case Function1Arg.GAUSS_ERFC_INV_ID: GAUSS_ERFC_INV(pos); break; case Function1Arg.ULP_ID: ULP(pos); break; case Function1Arg.ISNAN_ID: ISNAN(pos); break; case Function1Arg.NDIG10_ID: NDIG10(pos); break; case Function1Arg.NFACT_ID: NFACT(pos); break; case Function1Arg.ARCSEC_ID: ARCSEC(pos); break; case Function1Arg.ARCCSC_ID: ARCCSC(pos); break; case Function1Arg.GAMMA_ID: GAMMA(pos); break; case Function1Arg.LAMBERT_W0_ID: LAMBERT_W0(pos); break; case Function1Arg.LAMBERT_W1_ID: LAMBERT_W1(pos); break; case Function1Arg.SGN_GAMMA_ID: SGN_GAMMA(pos); break; case Function1Arg.LOG_GAMMA_ID: LOG_GAMMA(pos); break; case Function1Arg.DI_GAMMA_ID: DI_GAMMA(pos); break; case Function1Arg.PARAM_ID: UDF_PARAM(pos); break; } } /** * Calculates binary function * @param pos Token position */ private void f2ArgCalc(int pos) { switch (tokensList.get(pos).tokenId) { case Function2Arg.LOG_ID: LOG(pos); break; case Function2Arg.MOD_ID: MOD(pos); break; case Function2Arg.BINOM_COEFF_ID: BINOM_COEFF(pos); break; case Function2Arg.BERNOULLI_NUMBER_ID: BERNOULLI_NUMBER(pos); break; case Function2Arg.STIRLING1_NUMBER_ID: STIRLING1_NUMBER(pos); break; case Function2Arg.STIRLING2_NUMBER_ID: STIRLING2_NUMBER(pos); break; case Function2Arg.WORPITZKY_NUMBER_ID: WORPITZKY_NUMBER(pos); break; case Function2Arg.EULER_NUMBER_ID: EULER_NUMBER(pos); break; case Function2Arg.KRONECKER_DELTA_ID: KRONECKER_DELTA(pos); break; case Function2Arg.EULER_POLYNOMIAL_ID: EULER_POLYNOMIAL(pos); break; case Function2Arg.HARMONIC_NUMBER_ID: HARMONIC2_NUMBER(pos); break; case Function2Arg.RND_UNIFORM_CONT_ID: RND_VAR_UNIFORM_CONT(pos); break; case Function2Arg.RND_UNIFORM_DISCR_ID: RND_VAR_UNIFORM_DISCR(pos); break; case Function2Arg.ROUND_ID: ROUND(pos); break; case Function2Arg.RND_NORMAL_ID: RND_NORMAL(pos); break; case Function2Arg.NDIG_ID: NDIG(pos); break; case Function2Arg.DIGIT10_ID: DIGIT10(pos); break; case Function2Arg.FACTVAL_ID: FACTVAL(pos); break; case Function2Arg.FACTEXP_ID: FACTEXP(pos); break; case Function2Arg.ROOT_ID: ROOT(pos); break; case Function2Arg.INC_GAMMA_LOWER_ID: INC_GAMMA_LOWER(pos); break; case Function2Arg.INC_GAMMA_UPPER_ID: INC_GAMMA_UPPER(pos); break; case Function2Arg.REG_GAMMA_LOWER_ID: REG_GAMMA_LOWER(pos); break; case Function2Arg.REG_GAMMA_UPPER_ID: REG_GAMMA_UPPER(pos); break; case Function2Arg.PERMUTATIONS_ID: PERMUTATIONS(pos); break; case Function2Arg.BETA_ID: BETA(pos); break; case Function2Arg.LOG_BETA_ID: LOG_BETA(pos); break; } } /** * Calculates function with 3 arguments * @param pos Token position */ private void f3ArgCalc(int pos) { switch (tokensList.get(pos).tokenId) { case Function3Arg.IF_ID: IF(pos); break; case Function3Arg.CHI_ID: CHI(pos); break; case Function3Arg.CHI_LR_ID: CHI_LR(pos); break; case Function3Arg.CHI_L_ID: CHI_L(pos); break; case Function3Arg.CHI_R_ID: CHI_R(pos); break; case Function3Arg.PDF_UNIFORM_CONT_ID: PDF_UNIFORM_CONT(pos); break; case Function3Arg.CDF_UNIFORM_CONT_ID: CDF_UNIFORM_CONT(pos); break; case Function3Arg.QNT_UNIFORM_CONT_ID: QNT_UNIFORM_CONT(pos); break; case Function3Arg.PDF_NORMAL_ID: PDF_NORMAL(pos); break; case Function3Arg.CDF_NORMAL_ID: CDF_NORMAL(pos); break; case Function3Arg.QNT_NORMAL_ID: QNT_NORMAL(pos); break; case Function3Arg.DIGIT_ID: DIGIT(pos); break; case Function3Arg.INC_BETA_ID: INC_BETA(pos); break; case Function3Arg.REG_BETA_ID: REG_BETA(pos); break; } } /** * Calculates Variadic function * @param pos Token position */ private void variadicFunCalc(int pos) { switch (tokensList.get(pos).tokenId) { case FunctionVariadic.IFF_ID: IFF(pos); break; case FunctionVariadic.MIN_ID: MIN_VARIADIC(pos); break; case FunctionVariadic.MAX_ID: MAX_VARIADIC(pos); break; case FunctionVariadic.SUM_ID: SUM_VARIADIC(pos); break; case FunctionVariadic.PROD_ID: PROD_VARIADIC(pos); break; case FunctionVariadic.AVG_ID: AVG_VARIADIC(pos); break; case FunctionVariadic.VAR_ID: VAR_VARIADIC(pos); break; case FunctionVariadic.STD_ID: STD_VARIADIC(pos); break; case FunctionVariadic.CONT_FRAC_ID: CONTINUED_FRACTION(pos); break; case FunctionVariadic.CONT_POL_ID: CONTINUED_POLYNOMIAL(pos); break; case FunctionVariadic.GCD_ID: GCD(pos); break; case FunctionVariadic.LCM_ID: LCM(pos); break; case FunctionVariadic.RND_LIST_ID: RND_LIST(pos); break; case FunctionVariadic.COALESCE_ID: COALESCE(pos); break; case FunctionVariadic.OR_ID: OR_VARIADIC(pos); break; case FunctionVariadic.AND_ID: AND_VARIADIC(pos); break; case FunctionVariadic.XOR_ID: XOR_VARIADIC(pos); break; case FunctionVariadic.ARGMIN_ID: ARGMIN_VARIADIC(pos); break; case FunctionVariadic.ARGMAX_ID: ARGMAX_VARIADIC(pos); break; case FunctionVariadic.MEDIAN_ID: MEDIAN_VARIADIC(pos); break; case FunctionVariadic.MODE_ID: MODE_VARIADIC(pos); break; case FunctionVariadic.BASE_ID: BASE_VARIADIC(pos); break; case FunctionVariadic.NDIST_ID: NDIST_VARIADIC(pos); break; } } /** * Calculates calculus operators * @param pos */ private void calculusCalc(int pos) { switch (tokensList.get(pos).tokenId) { case CalculusOperator.SUM_ID: SUM(pos); break; case CalculusOperator.PROD_ID: PROD(pos); break; case CalculusOperator.MIN_ID: MIN(pos); break; case CalculusOperator.MAX_ID: MAX(pos); break; case CalculusOperator.AVG_ID: AVG(pos); break; case CalculusOperator.VAR_ID: VAR(pos); break; case CalculusOperator.STD_ID: STD(pos); break; case CalculusOperator.INT_ID: INTEGRAL(pos); break; case CalculusOperator.SOLVE_ID: SOLVE(pos); break; case CalculusOperator.DER_ID: DERIVATIVE(pos, Calculus.GENERAL_DERIVATIVE); break; case CalculusOperator.DER_LEFT_ID: DERIVATIVE(pos, Calculus.LEFT_DERIVATIVE); break; case CalculusOperator.DER_RIGHT_ID: DERIVATIVE(pos, Calculus.RIGHT_DERIVATIVE); break; case CalculusOperator.DERN_ID: DERIVATIVE_NTH(pos, Calculus.GENERAL_DERIVATIVE); break; case CalculusOperator.FORW_DIFF_ID: FORWARD_DIFFERENCE(pos); break; case CalculusOperator.BACKW_DIFF_ID: BACKWARD_DIFFERENCE(pos); break; } } /** * Calculates boolean operators * @param pos */ private void bolCalc(int pos) { switch (tokensList.get(pos).tokenId) { case BooleanOperator.AND_ID: AND(pos); break; case BooleanOperator.CIMP_ID: CIMP(pos); break; case BooleanOperator.CNIMP_ID: CNIMP(pos); break; case BooleanOperator.EQV_ID: EQV(pos); break; case BooleanOperator.IMP_ID: IMP(pos); break; case BooleanOperator.NAND_ID: NAND(pos); break; case BooleanOperator.NIMP_ID: NIMP(pos); break; case BooleanOperator.NOR_ID: NOR(pos); break; case BooleanOperator.OR_ID: OR(pos); break; case BooleanOperator.XOR_ID: XOR(pos); break; } } /** * Calculates Bitwise operators * @param pos */ private void bitwiseCalc(int pos) { switch (tokensList.get(pos).tokenId) { case BitwiseOperator.AND_ID: BITWISE_AND(pos); break; case BitwiseOperator.OR_ID: BITWISE_OR(pos); break; case BitwiseOperator.XOR_ID: BITWISE_XOR(pos); break; case BitwiseOperator.LEFT_SHIFT_ID: BITWISE_LEFT_SHIFT(pos); break; case BitwiseOperator.RIGHT_SHIFT_ID: BITWISE_RIGHT_SHIFT(pos); break; } } /*================================================= * * Parser methods * *================================================= */ /** * Class level method for adding specific automatic * parser keywords relates to User Defined Functions * i.e.: par(i), [npar] */ private void addUDFSpecificParserKeyWords() { addKeyWord(Function1Arg.PARAM_STR, Function1Arg.PARAM_DESC, Function1Arg.PARAM_ID, Function1Arg.PARAM_SYN, Function1Arg.PARAM_SINCE, Function1Arg.TYPE_ID); addKeyWord(ConstantValue.NPAR_STR, ConstantValue.NPAR_DESC, ConstantValue.NPAR_ID, ConstantValue.NPAR_SYN, ConstantValue.NPAR_SINCE, ConstantValue.TYPE_ID); } /** * Creates parser key words list */ private void addParserKeyWords() { /* * Operators key words */ addKeyWord(Operator.PLUS_STR, Operator.PLUS_DESC, Operator.PLUS_ID, Operator.PLUS_SYN, Operator.PLUS_SINCE, Operator.TYPE_ID); addKeyWord(Operator.MINUS_STR, Operator.MINUS_DESC, Operator.MINUS_ID, Operator.MINUS_SYN, Operator.MINUS_SINCE, Operator.TYPE_ID); addKeyWord(Operator.MULTIPLY_STR, Operator.MULTIPLY_DESC, Operator.MULTIPLY_ID, Operator.MULTIPLY_SYN, Operator.MULTIPLY_SINCE, Operator.TYPE_ID); addKeyWord(Operator.DIVIDE_STR, Operator.DIVIDE_DESC, Operator.DIVIDE_ID, Operator.DIVIDE_SYN, Operator.DIVIDE_SINCE, Operator.TYPE_ID); addKeyWord(Operator.POWER_STR, Operator.POWER_DESC, Operator.POWER_ID, Operator.POWER_SYN, Operator.POWER_SINCE, Operator.TYPE_ID); addKeyWord(Operator.FACT_STR, Operator.FACT_DESC, Operator.FACT_ID, Operator.FACT_SYN, Operator.FACT_SINCE, Operator.TYPE_ID); addKeyWord(Operator.MOD_STR, Operator.MOD_DESC, Operator.MOD_ID, Operator.MOD_SYN, Operator.MOD_SINCE, Operator.TYPE_ID); addKeyWord(Operator.PERC_STR, Operator.PERC_DESC, Operator.PERC_ID, Operator.PERC_SYN, Operator.PERC_SINCE, Operator.TYPE_ID); addKeyWord(Operator.TETRATION_STR, Operator.TETRATION_DESC, Operator.TETRATION_ID, Operator.TETRATION_SYN, Operator.TETRATION_SINCE, Operator.TYPE_ID); /* * Boolean operators key words */ addKeyWord(BooleanOperator.NEG_STR, BooleanOperator.NEG_DESC, BooleanOperator.NEG_ID, BooleanOperator.NEG_SYN, BooleanOperator.NEG_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.AND_STR, BooleanOperator.AND_DESC, BooleanOperator.AND_ID, BooleanOperator.AND_SYN, BooleanOperator.AND_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.AND1_STR, BooleanOperator.AND_DESC, BooleanOperator.AND_ID, BooleanOperator.AND1_SYN, BooleanOperator.AND_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.AND2_STR, BooleanOperator.AND_DESC, BooleanOperator.AND_ID, BooleanOperator.AND2_SYN, BooleanOperator.AND_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.NAND_STR, BooleanOperator.NAND_DESC, BooleanOperator.NAND_ID, BooleanOperator.NAND_SYN, BooleanOperator.NAND_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.NAND1_STR, BooleanOperator.NAND_DESC, BooleanOperator.NAND_ID, BooleanOperator.NAND1_SYN, BooleanOperator.NAND_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.NAND2_STR, BooleanOperator.NAND_DESC, BooleanOperator.NAND_ID, BooleanOperator.NAND2_SYN, BooleanOperator.NAND_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.OR_STR, BooleanOperator.OR_DESC, BooleanOperator.OR_ID, BooleanOperator.OR_SYN, BooleanOperator.OR_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.OR1_STR, BooleanOperator.OR_DESC, BooleanOperator.OR_ID, BooleanOperator.OR1_SYN, BooleanOperator.OR_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.OR2_STR, BooleanOperator.OR_DESC, BooleanOperator.OR_ID, BooleanOperator.OR2_SYN, BooleanOperator.OR_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.NOR_STR, BooleanOperator.NOR_DESC, BooleanOperator.NOR_ID, BooleanOperator.NOR_SYN, BooleanOperator.NOR_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.NOR1_STR, BooleanOperator.NOR_DESC, BooleanOperator.NOR_ID, BooleanOperator.NOR1_SYN, BooleanOperator.NOR_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.NOR2_STR, BooleanOperator.NOR_DESC, BooleanOperator.NOR_ID, BooleanOperator.NOR2_SYN, BooleanOperator.NOR_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.XOR_STR, BooleanOperator.XOR_DESC, BooleanOperator.XOR_ID, BooleanOperator.XOR_SYN, BooleanOperator.XOR_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.IMP_STR, BooleanOperator.IMP_DESC, BooleanOperator.IMP_ID, BooleanOperator.IMP_SYN, BooleanOperator.IMP_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.NIMP_STR, BooleanOperator.NIMP_DESC, BooleanOperator.NIMP_ID, BooleanOperator.NIMP_SYN, BooleanOperator.NIMP_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.CIMP_STR, BooleanOperator.CIMP_DESC, BooleanOperator.CIMP_ID, BooleanOperator.CIMP_SYN, BooleanOperator.CIMP_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.CNIMP_STR, BooleanOperator.CNIMP_DESC, BooleanOperator.CNIMP_ID, BooleanOperator.CNIMP_SYN, BooleanOperator.CNIMP_SINCE, BooleanOperator.TYPE_ID); addKeyWord(BooleanOperator.EQV_STR, BooleanOperator.EQV_DESC, BooleanOperator.EQV_ID, BooleanOperator.EQV_SYN, BooleanOperator.EQV_SINCE, BooleanOperator.TYPE_ID); /* * Binary relations key words */ addKeyWord(BinaryRelation.EQ_STR, BinaryRelation.EQ_DESC, BinaryRelation.EQ_ID, BinaryRelation.EQ_SYN, BinaryRelation.EQ_SINCE, BinaryRelation.TYPE_ID); addKeyWord(BinaryRelation.EQ1_STR, BinaryRelation.EQ_DESC, BinaryRelation.EQ_ID, BinaryRelation.EQ1_SYN, BinaryRelation.EQ_SINCE, BinaryRelation.TYPE_ID); addKeyWord(BinaryRelation.NEQ_STR, BinaryRelation.NEQ_DESC, BinaryRelation.NEQ_ID, BinaryRelation.NEQ_SYN, BinaryRelation.NEQ_SINCE, BinaryRelation.TYPE_ID); addKeyWord(BinaryRelation.NEQ1_STR, BinaryRelation.NEQ_DESC, BinaryRelation.NEQ_ID, BinaryRelation.NEQ1_SYN, BinaryRelation.NEQ_SINCE, BinaryRelation.TYPE_ID); addKeyWord(BinaryRelation.NEQ2_STR, BinaryRelation.NEQ_DESC, BinaryRelation.NEQ_ID, BinaryRelation.NEQ2_SYN, BinaryRelation.NEQ_SINCE, BinaryRelation.TYPE_ID); addKeyWord(BinaryRelation.LT_STR, BinaryRelation.LT_DESC, BinaryRelation.LT_ID, BinaryRelation.LT_SYN, BinaryRelation.LT_SINCE, BinaryRelation.TYPE_ID); addKeyWord(BinaryRelation.GT_STR, BinaryRelation.GT_DESC, BinaryRelation.GT_ID, BinaryRelation.GT_SYN, BinaryRelation.GT_SINCE, BinaryRelation.TYPE_ID); addKeyWord(BinaryRelation.LEQ_STR, BinaryRelation.LEQ_DESC, BinaryRelation.LEQ_ID, BinaryRelation.LEQ_SYN, BinaryRelation.LEQ_SINCE, BinaryRelation.TYPE_ID); addKeyWord(BinaryRelation.GEQ_STR, BinaryRelation.GEQ_DESC, BinaryRelation.GEQ_ID, BinaryRelation.GEQ_SYN, BinaryRelation.GEQ_SINCE, BinaryRelation.TYPE_ID); if (parserKeyWordsOnly == false) { /* * 1 arg functions key words */ addKeyWord(Function1Arg.SIN_STR, Function1Arg.SIN_DESC, Function1Arg.SIN_ID, Function1Arg.SIN_SYN, Function1Arg.SIN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.COS_STR, Function1Arg.COS_DESC, Function1Arg.COS_ID, Function1Arg.COS_SYN, Function1Arg.COS_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.TAN_STR, Function1Arg.TAN_DESC, Function1Arg.TAN_ID, Function1Arg.TAN_SYN, Function1Arg.TAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.TG_STR, Function1Arg.TAN_DESC, Function1Arg.TAN_ID, Function1Arg.TG_SYN, Function1Arg.TAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.CTAN_STR, Function1Arg.CTAN_DESC, Function1Arg.CTAN_ID, Function1Arg.CTAN_SYN, Function1Arg.CTAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.CTG_STR, Function1Arg.CTAN_DESC, Function1Arg.CTAN_ID, Function1Arg.CTG_SYN, Function1Arg.CTAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.COT_STR, Function1Arg.CTAN_DESC, Function1Arg.CTAN_ID, Function1Arg.COT_SYN, Function1Arg.CTAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.SEC_STR, Function1Arg.SEC_DESC, Function1Arg.SEC_ID, Function1Arg.SEC_SYN, Function1Arg.SEC_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.COSEC_STR, Function1Arg.COSEC_DESC, Function1Arg.COSEC_ID, Function1Arg.COSEC_SYN, Function1Arg.COSEC_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.CSC_STR, Function1Arg.COSEC_DESC, Function1Arg.COSEC_ID, Function1Arg.CSC_SYN, Function1Arg.COSEC_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ASIN_STR, Function1Arg.ASIN_DESC, Function1Arg.ASIN_ID, Function1Arg.ASIN_SYN, Function1Arg.ASIN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARSIN_STR, Function1Arg.ASIN_DESC, Function1Arg.ASIN_ID, Function1Arg.ARSIN_SYN, Function1Arg.ASIN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCSIN_STR, Function1Arg.ASIN_DESC, Function1Arg.ASIN_ID, Function1Arg.ARCSIN_SYN, Function1Arg.ASIN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACOS_STR, Function1Arg.ACOS_DESC, Function1Arg.ACOS_ID, Function1Arg.ACOS_SYN, Function1Arg.ACOS_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCOS_STR, Function1Arg.ACOS_DESC, Function1Arg.ACOS_ID, Function1Arg.ARCOS_SYN, Function1Arg.ACOS_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCOS_STR, Function1Arg.ACOS_DESC, Function1Arg.ACOS_ID, Function1Arg.ARCCOS_SYN, Function1Arg.ACOS_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ATAN_STR, Function1Arg.ATAN_DESC, Function1Arg.ATAN_ID, Function1Arg.ATAN_SYN, Function1Arg.ATAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCTAN_STR, Function1Arg.ATAN_DESC, Function1Arg.ATAN_ID, Function1Arg.ARCTAN_SYN, Function1Arg.ATAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ATG_STR, Function1Arg.ATAN_DESC, Function1Arg.ATAN_ID, Function1Arg.ATG_SYN, Function1Arg.ATAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCTG_STR, Function1Arg.ATAN_DESC, Function1Arg.ATAN_ID, Function1Arg.ARCTG_SYN, Function1Arg.ATAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACTAN_STR, Function1Arg.ACTAN_DESC, Function1Arg.ACTAN_ID, Function1Arg.ACTAN_SYN, Function1Arg.ACTAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCTAN_STR, Function1Arg.ACTAN_DESC, Function1Arg.ACTAN_ID, Function1Arg.ARCCTAN_SYN, Function1Arg.ACTAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACTG_STR, Function1Arg.ACTAN_DESC, Function1Arg.ACTAN_ID, Function1Arg.ACTG_SYN, Function1Arg.ACTAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCTG_STR, Function1Arg.ACTAN_DESC, Function1Arg.ACTAN_ID, Function1Arg.ARCCTG_SYN, Function1Arg.ACTAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACOT_STR, Function1Arg.ACTAN_DESC, Function1Arg.ACTAN_ID, Function1Arg.ACOT_SYN, Function1Arg.ACTAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCOT_STR, Function1Arg.ACTAN_DESC, Function1Arg.ACTAN_ID, Function1Arg.ARCCOT_SYN, Function1Arg.ACTAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.LN_STR, Function1Arg.LN_DESC, Function1Arg.LN_ID, Function1Arg.LN_SYN, Function1Arg.LN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.LOG2_STR, Function1Arg.LOG2_DESC, Function1Arg.LOG2_ID, Function1Arg.LOG2_SYN, Function1Arg.LOG2_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.LOG10_STR, Function1Arg.LOG10_DESC, Function1Arg.LOG10_ID, Function1Arg.LOG10_SYN, Function1Arg.LOG10_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.RAD_STR, Function1Arg.RAD_DESC, Function1Arg.RAD_ID, Function1Arg.RAD_SYN, Function1Arg.RAD_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.EXP_STR, Function1Arg.EXP_DESC, Function1Arg.EXP_ID, Function1Arg.EXP_SYN, Function1Arg.EXP_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.SQRT_STR, Function1Arg.SQRT_DESC, Function1Arg.SQRT_ID, Function1Arg.SQRT_SYN, Function1Arg.SQRT_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.SINH_STR, Function1Arg.SINH_DESC, Function1Arg.SINH_ID, Function1Arg.SINH_SYN, Function1Arg.SINH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.COSH_STR, Function1Arg.COSH_DESC, Function1Arg.COSH_ID, Function1Arg.COSH_SYN, Function1Arg.COSH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.TANH_STR, Function1Arg.TANH_DESC, Function1Arg.TANH_ID, Function1Arg.TANH_SYN, Function1Arg.TANH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.TGH_STR, Function1Arg.TANH_DESC, Function1Arg.TANH_ID, Function1Arg.TGH_SYN, Function1Arg.TANH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.CTANH_STR, Function1Arg.COTH_DESC, Function1Arg.COTH_ID, Function1Arg.CTANH_SYN, Function1Arg.COTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.COTH_STR, Function1Arg.COTH_DESC, Function1Arg.COTH_ID, Function1Arg.COTH_SYN, Function1Arg.COTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.CTGH_STR, Function1Arg.COTH_DESC, Function1Arg.COTH_ID, Function1Arg.CTGH_SYN, Function1Arg.COTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.SECH_STR, Function1Arg.SECH_DESC, Function1Arg.SECH_ID, Function1Arg.SECH_SYN, Function1Arg.SECH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.CSCH_STR, Function1Arg.CSCH_DESC, Function1Arg.CSCH_ID, Function1Arg.CSCH_SYN, Function1Arg.CSCH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.COSECH_STR, Function1Arg.CSCH_DESC, Function1Arg.CSCH_ID, Function1Arg.COSECH_SYN, Function1Arg.CSCH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.DEG_STR, Function1Arg.DEG_DESC, Function1Arg.DEG_ID, Function1Arg.DEG_SYN, Function1Arg.DEG_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ABS_STR, Function1Arg.ABS_DESC, Function1Arg.ABS_ID, Function1Arg.ABS_SYN, Function1Arg.ABS_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.SGN_STR, Function1Arg.SGN_DESC, Function1Arg.SGN_ID, Function1Arg.SGN_SYN, Function1Arg.SGN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.FLOOR_STR, Function1Arg.FLOOR_DESC, Function1Arg.FLOOR_ID, Function1Arg.FLOOR_SYN, Function1Arg.FLOOR_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.CEIL_STR, Function1Arg.CEIL_DESC, Function1Arg.CEIL_ID, Function1Arg.CEIL_SYN, Function1Arg.CEIL_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.NOT_STR, Function1Arg.NOT_DESC, Function1Arg.NOT_ID, Function1Arg.NOT_SYN, Function1Arg.NOT_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ASINH_STR, Function1Arg.ARSINH_DESC, Function1Arg.ARSINH_ID, Function1Arg.ASINH_SYN, Function1Arg.ARSINH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARSINH_STR, Function1Arg.ARSINH_DESC, Function1Arg.ARSINH_ID, Function1Arg.ARSINH_SYN, Function1Arg.ARSINH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCSINH_STR, Function1Arg.ARSINH_DESC, Function1Arg.ARSINH_ID, Function1Arg.ARCSINH_SYN, Function1Arg.ARSINH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACOSH_STR, Function1Arg.ARCOSH_DESC, Function1Arg.ARCOSH_ID, Function1Arg.ACOSH_SYN, Function1Arg.ARCOSH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCOSH_STR, Function1Arg.ARCOSH_DESC, Function1Arg.ARCOSH_ID, Function1Arg.ARCOSH_SYN, Function1Arg.ARCOSH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCOSH_STR, Function1Arg.ARCOSH_DESC, Function1Arg.ARCOSH_ID, Function1Arg.ARCCOSH_SYN, Function1Arg.ARCOSH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ATANH_STR, Function1Arg.ARTANH_DESC, Function1Arg.ARTANH_ID, Function1Arg.ATANH_SYN, Function1Arg.ARTANH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCTANH_STR, Function1Arg.ARTANH_DESC, Function1Arg.ARTANH_ID, Function1Arg.ARCTANH_SYN, Function1Arg.ARTANH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ATGH_STR, Function1Arg.ARTANH_DESC, Function1Arg.ARTANH_ID, Function1Arg.ATGH_SYN, Function1Arg.ARTANH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCTGH_STR, Function1Arg.ARTANH_DESC, Function1Arg.ARTANH_ID, Function1Arg.ARCTGH_SYN, Function1Arg.ARTANH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACTANH_STR, Function1Arg.ARCOTH_DESC, Function1Arg.ARCOTH_ID, Function1Arg.ACTANH_SYN, Function1Arg.ARCOTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCTANH_STR, Function1Arg.ARCOTH_DESC, Function1Arg.ARCOTH_ID, Function1Arg.ARCCTANH_SYN, Function1Arg.ARCOTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACOTH_STR, Function1Arg.ARCOTH_DESC, Function1Arg.ARCOTH_ID, Function1Arg.ACOTH_SYN, Function1Arg.ARCOTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCOTH_STR, Function1Arg.ARCOTH_DESC, Function1Arg.ARCOTH_ID, Function1Arg.ARCOTH_SYN, Function1Arg.ARCOTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCOTH_STR, Function1Arg.ARCOTH_DESC, Function1Arg.ARCOTH_ID, Function1Arg.ARCCOTH_SYN, Function1Arg.ARCOTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACTGH_STR, Function1Arg.ARCOTH_DESC, Function1Arg.ARCOTH_ID, Function1Arg.ACTGH_SYN, Function1Arg.ARCOTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCTGH_STR, Function1Arg.ARCOTH_DESC, Function1Arg.ARCOTH_ID, Function1Arg.ARCCTGH_SYN, Function1Arg.ARCOTH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ASECH_STR, Function1Arg.ARSECH_DESC, Function1Arg.ARSECH_ID, Function1Arg.ASECH_SYN, Function1Arg.ARSECH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARSECH_STR, Function1Arg.ARSECH_DESC, Function1Arg.ARSECH_ID, Function1Arg.ARSECH_SYN, Function1Arg.ARSECH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCSECH_STR, Function1Arg.ARSECH_DESC, Function1Arg.ARSECH_ID, Function1Arg.ARCSECH_SYN, Function1Arg.ARSECH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACSCH_STR, Function1Arg.ARCSCH_DESC, Function1Arg.ARCSCH_ID, Function1Arg.ACSCH_SYN, Function1Arg.ARCSCH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCSCH_STR, Function1Arg.ARCSCH_DESC, Function1Arg.ARCSCH_ID, Function1Arg.ARCSCH_SYN, Function1Arg.ARCSCH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCSCH_STR, Function1Arg.ARCSCH_DESC, Function1Arg.ARCSCH_ID, Function1Arg.ARCCSCH_SYN, Function1Arg.ARCSCH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ACOSECH_STR, Function1Arg.ARCSCH_DESC, Function1Arg.ARCSCH_ID, Function1Arg.ACOSECH_SYN, Function1Arg.ARCSCH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCOSECH_STR, Function1Arg.ARCSCH_DESC, Function1Arg.ARCSCH_ID, Function1Arg.ARCOSECH_SYN, Function1Arg.ARCSCH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCOSECH_STR, Function1Arg.ARCSCH_DESC, Function1Arg.ARCSCH_ID, Function1Arg.ARCCOSECH_SYN, Function1Arg.ARCSCH_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.SA_STR, Function1Arg.SA_DESC, Function1Arg.SA_ID, Function1Arg.SA_SYN, Function1Arg.SA_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.SA1_STR, Function1Arg.SA_DESC, Function1Arg.SA_ID, Function1Arg.SA1_SYN, Function1Arg.SA_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.SINC_STR, Function1Arg.SINC_DESC, Function1Arg.SINC_ID, Function1Arg.SINC_SYN, Function1Arg.SINC_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.BELL_NUMBER_STR, Function1Arg.BELL_NUMBER_DESC, Function1Arg.BELL_NUMBER_ID, Function1Arg.BELL_NUMBER_SYN, Function1Arg.BELL_NUMBER_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.FIBONACCI_NUMBER_STR, Function1Arg.FIBONACCI_NUMBER_DESC, Function1Arg.FIBONACCI_NUMBER_ID, Function1Arg.FIBONACCI_NUMBER_SYN, Function1Arg.FIBONACCI_NUMBER_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.LUCAS_NUMBER_STR, Function1Arg.LUCAS_NUMBER_DESC, Function1Arg.LUCAS_NUMBER_ID, Function1Arg.LUCAS_NUMBER_SYN, Function1Arg.LUCAS_NUMBER_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.HARMONIC_NUMBER_STR, Function1Arg.HARMONIC_NUMBER_DESC, Function1Arg.HARMONIC_NUMBER_ID, Function1Arg.HARMONIC_NUMBER_SYN, Function1Arg.HARMONIC_NUMBER_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.IS_PRIME_STR, Function1Arg.IS_PRIME_DESC, Function1Arg.IS_PRIME_ID, Function1Arg.IS_PRIME_SYN, Function1Arg.IS_PRIME_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.PRIME_COUNT_STR, Function1Arg.PRIME_COUNT_DESC, Function1Arg.PRIME_COUNT_ID, Function1Arg.PRIME_COUNT_SYN, Function1Arg.PRIME_COUNT_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.EXP_INT_STR, Function1Arg.EXP_INT_DESC, Function1Arg.EXP_INT_ID, Function1Arg.EXP_INT_SYN, Function1Arg.EXP_INT_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.LOG_INT_STR, Function1Arg.LOG_INT_DESC, Function1Arg.LOG_INT_ID, Function1Arg.LOG_INT_SYN, Function1Arg.LOG_INT_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.OFF_LOG_INT_STR, Function1Arg.OFF_LOG_INT_DESC, Function1Arg.OFF_LOG_INT_ID, Function1Arg.OFF_LOG_INT_SYN, Function1Arg.OFF_LOG_INT_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.GAUSS_ERF_STR, Function1Arg.GAUSS_ERF_DESC, Function1Arg.GAUSS_ERF_ID, Function1Arg.GAUSS_ERF_SYN, Function1Arg.GAUSS_ERF_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.GAUSS_ERFC_STR, Function1Arg.GAUSS_ERFC_DESC, Function1Arg.GAUSS_ERFC_ID, Function1Arg.GAUSS_ERFC_SYN, Function1Arg.GAUSS_ERFC_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.GAUSS_ERF_INV_STR, Function1Arg.GAUSS_ERF_INV_DESC, Function1Arg.GAUSS_ERF_INV_ID, Function1Arg.GAUSS_ERF_INV_SYN, Function1Arg.GAUSS_ERF_INV_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.GAUSS_ERFC_INV_STR, Function1Arg.GAUSS_ERFC_INV_DESC, Function1Arg.GAUSS_ERFC_INV_ID, Function1Arg.GAUSS_ERFC_INV_SYN, Function1Arg.GAUSS_ERFC_INV_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ULP_STR, Function1Arg.ULP_DESC, Function1Arg.ULP_ID, Function1Arg.ULP_SYN, Function1Arg.ULP_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ISNAN_STR, Function1Arg.ISNAN_DESC, Function1Arg.ISNAN_ID, Function1Arg.ISNAN_SYN, Function1Arg.ISNAN_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.NDIG10_STR, Function1Arg.NDIG10_DESC, Function1Arg.NDIG10_ID, Function1Arg.NDIG10_SYN, Function1Arg.NDIG10_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.NFACT_STR, Function1Arg.NFACT_DESC, Function1Arg.NFACT_ID, Function1Arg.NFACT_SYN, Function1Arg.NFACT_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCSEC_STR, Function1Arg.ARCSEC_DESC, Function1Arg.ARCSEC_ID, Function1Arg.ARCSEC_SYN, Function1Arg.ARCSEC_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.ARCCSC_STR, Function1Arg.ARCCSC_DESC, Function1Arg.ARCCSC_ID, Function1Arg.ARCCSC_SYN, Function1Arg.ARCCSC_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.GAMMA_STR, Function1Arg.GAMMA_DESC, Function1Arg.GAMMA_ID, Function1Arg.GAMMA_SYN, Function1Arg.GAMMA_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.LAMBERT_W0_STR, Function1Arg.LAMBERT_W0_DESC, Function1Arg.LAMBERT_W0_ID, Function1Arg.LAMBERT_W0_SYN, Function1Arg.LAMBERT_W0_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.LAMBERT_W1_STR, Function1Arg.LAMBERT_W1_DESC, Function1Arg.LAMBERT_W1_ID, Function1Arg.LAMBERT_W1_SYN, Function1Arg.LAMBERT_W1_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.SGN_GAMMA_STR, Function1Arg.SGN_GAMMA_DESC, Function1Arg.SGN_GAMMA_ID, Function1Arg.SGN_GAMMA_SYN, Function1Arg.SGN_GAMMA_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.LOG_GAMMA_STR, Function1Arg.LOG_GAMMA_DESC, Function1Arg.LOG_GAMMA_ID, Function1Arg.LOG_GAMMA_SYN, Function1Arg.LOG_GAMMA_SINCE, Function1Arg.TYPE_ID); addKeyWord(Function1Arg.DI_GAMMA_STR, Function1Arg.DI_GAMMA_DESC, Function1Arg.DI_GAMMA_ID, Function1Arg.DI_GAMMA_SYN, Function1Arg.DI_GAMMA_SINCE, Function1Arg.TYPE_ID); /* * 2 args functions key words */ addKeyWord(Function2Arg.LOG_STR, Function2Arg.LOG_DESC, Function2Arg.LOG_ID, Function2Arg.LOG_SYN, Function2Arg.LOG_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.MOD_STR, Function2Arg.MOD_DESC, Function2Arg.MOD_ID, Function2Arg.MOD_SYN, Function2Arg.MOD_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.BINOM_COEFF_STR, Function2Arg.BINOM_COEFF_DESC, Function2Arg.BINOM_COEFF_ID, Function2Arg.BINOM_COEFF_SYN, Function2Arg.BINOM_COEFF_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.BINOM_COEFF_NCK_STR, Function2Arg.BINOM_COEFF_DESC, Function2Arg.BINOM_COEFF_ID, Function2Arg.BINOM_COEFF_NCK_SYN, Function2Arg.BINOM_COEFF_NCK_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.BERNOULLI_NUMBER_STR, Function2Arg.BERNOULLI_NUMBER_DESC, Function2Arg.BERNOULLI_NUMBER_ID, Function2Arg.BERNOULLI_NUMBER_SYN, Function2Arg.BERNOULLI_NUMBER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.STIRLING1_NUMBER_STR, Function2Arg.STIRLING1_NUMBER_DESC, Function2Arg.STIRLING1_NUMBER_ID, Function2Arg.STIRLING1_NUMBER_SYN, Function2Arg.STIRLING1_NUMBER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.STIRLING2_NUMBER_STR, Function2Arg.STIRLING2_NUMBER_DESC, Function2Arg.STIRLING2_NUMBER_ID, Function2Arg.STIRLING2_NUMBER_SYN, Function2Arg.STIRLING2_NUMBER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.WORPITZKY_NUMBER_STR, Function2Arg.WORPITZKY_NUMBER_DESC, Function2Arg.WORPITZKY_NUMBER_ID, Function2Arg.WORPITZKY_NUMBER_SYN, Function2Arg.WORPITZKY_NUMBER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.EULER_NUMBER_STR, Function2Arg.EULER_NUMBER_DESC, Function2Arg.EULER_NUMBER_ID, Function2Arg.EULER_NUMBER_SYN, Function2Arg.EULER_NUMBER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.KRONECKER_DELTA_STR, Function2Arg.KRONECKER_DELTA_DESC, Function2Arg.KRONECKER_DELTA_ID, Function2Arg.KRONECKER_DELTA_SYN, Function2Arg.KRONECKER_DELTA_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.EULER_POLYNOMIAL_STR, Function2Arg.EULER_POLYNOMIAL_DESC, Function2Arg.EULER_POLYNOMIAL_ID, Function2Arg.EULER_POLYNOMIAL_SYN, Function2Arg.EULER_POLYNOMIAL_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.HARMONIC_NUMBER_STR, Function2Arg.HARMONIC_NUMBER_DESC, Function2Arg.HARMONIC_NUMBER_ID, Function2Arg.HARMONIC_NUMBER_SYN, Function2Arg.HARMONIC_NUMBER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.RND_UNIFORM_CONT_STR, Function2Arg.RND_UNIFORM_CONT_DESC, Function2Arg.RND_UNIFORM_CONT_ID, Function2Arg.RND_UNIFORM_CONT_SYN, Function2Arg.RND_UNIFORM_CONT_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.RND_UNIFORM_DISCR_STR, Function2Arg.RND_UNIFORM_DISCR_DESC, Function2Arg.RND_UNIFORM_DISCR_ID, Function2Arg.RND_UNIFORM_DISCR_SYN, Function2Arg.RND_UNIFORM_DISCR_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.ROUND_STR, Function2Arg.ROUND_DESC, Function2Arg.ROUND_ID, Function2Arg.ROUND_SYN, Function2Arg.ROUND_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.RND_NORMAL_STR, Function2Arg.RND_NORMAL_DESC, Function2Arg.RND_NORMAL_ID, Function2Arg.RND_NORMAL_SYN, Function2Arg.RND_NORMAL_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.NDIG_STR, Function2Arg.NDIG_DESC, Function2Arg.NDIG_ID, Function2Arg.NDIG_SYN, Function2Arg.NDIG_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.DIGIT10_STR, Function2Arg.DIGIT10_DESC, Function2Arg.DIGIT10_ID, Function2Arg.DIGIT10_SYN, Function2Arg.DIGIT10_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.FACTVAL_STR, Function2Arg.FACTVAL_DESC, Function2Arg.FACTVAL_ID, Function2Arg.FACTVAL_SYN, Function2Arg.FACTVAL_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.FACTEXP_STR, Function2Arg.FACTEXP_DESC, Function2Arg.FACTEXP_ID, Function2Arg.FACTEXP_SYN, Function2Arg.FACTEXP_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.ROOT_STR, Function2Arg.ROOT_DESC, Function2Arg.ROOT_ID, Function2Arg.ROOT_SYN, Function2Arg.ROOT_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.INC_GAMMA_LOWER_STR, Function2Arg.INC_GAMMA_LOWER_DESC, Function2Arg.INC_GAMMA_LOWER_ID, Function2Arg.INC_GAMMA_LOWER_SYN, Function2Arg.INC_GAMMA_LOWER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.INC_GAMMA_UPPER_STR, Function2Arg.INC_GAMMA_UPPER_DESC, Function2Arg.INC_GAMMA_UPPER_ID, Function2Arg.INC_GAMMA_UPPER_SYN, Function2Arg.INC_GAMMA_UPPER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.REG_GAMMA_LOWER_STR, Function2Arg.REG_GAMMA_LOWER_DESC, Function2Arg.REG_GAMMA_LOWER_ID, Function2Arg.REG_GAMMA_LOWER_SYN, Function2Arg.REG_GAMMA_LOWER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.REG_GAMMA_UPPER_STR, Function2Arg.REG_GAMMA_UPPER_DESC, Function2Arg.REG_GAMMA_UPPER_ID, Function2Arg.REG_GAMMA_UPPER_SYN, Function2Arg.REG_GAMMA_UPPER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.REG_GAMMA_LOWER_P_STR, Function2Arg.REG_GAMMA_LOWER_DESC, Function2Arg.REG_GAMMA_LOWER_ID, Function2Arg.REG_GAMMA_LOWER_P_SYN, Function2Arg.REG_GAMMA_LOWER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.REG_GAMMA_UPPER_Q_STR, Function2Arg.REG_GAMMA_UPPER_DESC, Function2Arg.REG_GAMMA_UPPER_ID, Function2Arg.REG_GAMMA_UPPER_Q_SYN, Function2Arg.REG_GAMMA_UPPER_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.PERMUTATIONS_STR, Function2Arg.PERMUTATIONS_DESC, Function2Arg.PERMUTATIONS_ID, Function2Arg.PERMUTATIONS_SYN, Function2Arg.PERMUTATIONS_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.BETA_STR, Function2Arg.BETA_DESC, Function2Arg.BETA_ID, Function2Arg.BETA_SYN, Function2Arg.BETA_SINCE, Function2Arg.TYPE_ID); addKeyWord(Function2Arg.LOG_BETA_STR, Function2Arg.LOG_BETA_DESC, Function2Arg.LOG_BETA_ID, Function2Arg.LOG_BETA_SYN, Function2Arg.LOG_BETA_SINCE, Function2Arg.TYPE_ID); /* * 3 args functions key words */ addKeyWord(Function3Arg.IF_STR, Function3Arg.IF_DESC, Function3Arg.IF_CONDITION_ID, Function3Arg.IF_SYN, Function3Arg.IF_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.CHI_STR, Function3Arg.CHI_DESC, Function3Arg.CHI_ID, Function3Arg.CHI_SYN, Function3Arg.CHI_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.CHI_LR_STR, Function3Arg.CHI_LR_DESC, Function3Arg.CHI_LR_ID, Function3Arg.CHI_LR_SYN, Function3Arg.CHI_LR_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.CHI_L_STR, Function3Arg.CHI_L_DESC, Function3Arg.CHI_L_ID, Function3Arg.CHI_L_SYN, Function3Arg.CHI_L_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.CHI_R_STR, Function3Arg.CHI_R_DESC, Function3Arg.CHI_R_ID, Function3Arg.CHI_R_SYN, Function3Arg.CHI_R_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.PDF_UNIFORM_CONT_STR, Function3Arg.PDF_UNIFORM_CONT_DESC, Function3Arg.PDF_UNIFORM_CONT_ID, Function3Arg.PDF_UNIFORM_CONT_SYN, Function3Arg.PDF_UNIFORM_CONT_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.CDF_UNIFORM_CONT_STR, Function3Arg.CDF_UNIFORM_CONT_DESC, Function3Arg.CDF_UNIFORM_CONT_ID, Function3Arg.CDF_UNIFORM_CONT_SYN, Function3Arg.CDF_UNIFORM_CONT_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.QNT_UNIFORM_CONT_STR, Function3Arg.QNT_UNIFORM_CONT_DESC, Function3Arg.QNT_UNIFORM_CONT_ID, Function3Arg.QNT_UNIFORM_CONT_SYN, Function3Arg.QNT_UNIFORM_CONT_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.PDF_NORMAL_STR, Function3Arg.PDF_NORMAL_DESC, Function3Arg.PDF_NORMAL_ID, Function3Arg.PDF_NORMAL_SYN, Function3Arg.PDF_NORMAL_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.CDF_NORMAL_STR, Function3Arg.CDF_NORMAL_DESC, Function3Arg.CDF_NORMAL_ID, Function3Arg.CDF_NORMAL_SYN, Function3Arg.CDF_NORMAL_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.QNT_NORMAL_STR, Function3Arg.QNT_NORMAL_DESC, Function3Arg.QNT_NORMAL_ID, Function3Arg.QNT_NORMAL_SYN, Function3Arg.QNT_NORMAL_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.DIGIT_STR, Function3Arg.DIGIT_DESC, Function3Arg.DIGIT_ID, Function3Arg.DIGIT_SYN, Function3Arg.DIGIT_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.INC_BETA_STR, Function3Arg.INC_BETA_DESC, Function3Arg.INC_BETA_ID, Function3Arg.INC_BETA_SYN, Function3Arg.INC_BETA_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.REG_BETA_STR, Function3Arg.REG_BETA_DESC, Function3Arg.REG_BETA_ID, Function3Arg.REG_BETA_SYN, Function3Arg.REG_BETA_SINCE, Function3Arg.TYPE_ID); addKeyWord(Function3Arg.REG_BETA_I_STR, Function3Arg.REG_BETA_DESC, Function3Arg.REG_BETA_ID, Function3Arg.REG_BETA_I_SYN, Function3Arg.REG_BETA_I_SINCE, Function3Arg.TYPE_ID); /* * Variadic functions as key words */ addKeyWord(FunctionVariadic.IFF_STR, FunctionVariadic.IFF_DESC, FunctionVariadic.IFF_ID, FunctionVariadic.IFF_SYN, FunctionVariadic.IFF_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.MIN_STR, FunctionVariadic.MIN_DESC, FunctionVariadic.MIN_ID, FunctionVariadic.MIN_SYN, FunctionVariadic.MIN_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.MAX_STR, FunctionVariadic.MAX_DESC, FunctionVariadic.MAX_ID, FunctionVariadic.MAX_SYN, FunctionVariadic.MAX_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.CONT_FRAC_STR, FunctionVariadic.CONT_FRAC_DESC, FunctionVariadic.CONT_FRAC_ID, FunctionVariadic.CONT_FRAC_SYN, FunctionVariadic.CONT_FRAC_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.CONT_POL_STR, FunctionVariadic.CONT_POL_DESC, FunctionVariadic.CONT_POL_ID, FunctionVariadic.CONT_POL_SYN, FunctionVariadic.CONT_POL_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.GCD_STR, FunctionVariadic.GCD_DESC, FunctionVariadic.GCD_ID, FunctionVariadic.GCD_SYN, FunctionVariadic.GCD_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.LCM_STR, FunctionVariadic.LCM_DESC, FunctionVariadic.LCM_ID, FunctionVariadic.LCM_SYN, FunctionVariadic.LCM_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.SUM_STR, FunctionVariadic.SUM_DESC, FunctionVariadic.SUM_ID, FunctionVariadic.SUM_SYN, FunctionVariadic.SUM_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.PROD_STR, FunctionVariadic.PROD_DESC, FunctionVariadic.PROD_ID, FunctionVariadic.PROD_SYN, FunctionVariadic.PROD_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.AVG_STR, FunctionVariadic.AVG_DESC, FunctionVariadic.AVG_ID, FunctionVariadic.AVG_SYN, FunctionVariadic.AVG_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.VAR_STR, FunctionVariadic.VAR_DESC, FunctionVariadic.VAR_ID, FunctionVariadic.VAR_SYN, FunctionVariadic.VAR_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.STD_STR, FunctionVariadic.STD_DESC, FunctionVariadic.STD_ID, FunctionVariadic.STD_SYN, FunctionVariadic.STD_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.RND_LIST_STR, FunctionVariadic.RND_LIST_DESC, FunctionVariadic.RND_LIST_ID, FunctionVariadic.RND_LIST_SYN, FunctionVariadic.RND_LIST_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.COALESCE_STR, FunctionVariadic.COALESCE_DESC, FunctionVariadic.COALESCE_ID, FunctionVariadic.COALESCE_SYN, FunctionVariadic.COALESCE_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.OR_STR, FunctionVariadic.OR_DESC, FunctionVariadic.OR_ID, FunctionVariadic.OR_SYN, FunctionVariadic.OR_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.AND_STR, FunctionVariadic.AND_DESC, FunctionVariadic.AND_ID, FunctionVariadic.AND_SYN, FunctionVariadic.AND_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.XOR_STR, FunctionVariadic.XOR_DESC, FunctionVariadic.XOR_ID, FunctionVariadic.XOR_SYN, FunctionVariadic.XOR_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.ARGMIN_STR, FunctionVariadic.ARGMIN_DESC, FunctionVariadic.ARGMIN_ID, FunctionVariadic.ARGMIN_SYN, FunctionVariadic.ARGMIN_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.ARGMAX_STR, FunctionVariadic.ARGMAX_DESC, FunctionVariadic.ARGMAX_ID, FunctionVariadic.ARGMAX_SYN, FunctionVariadic.ARGMAX_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.MEDIAN_STR, FunctionVariadic.MEDIAN_DESC, FunctionVariadic.MEDIAN_ID, FunctionVariadic.MEDIAN_SYN, FunctionVariadic.MEDIAN_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.MODE_STR, FunctionVariadic.MODE_DESC, FunctionVariadic.MODE_ID, FunctionVariadic.MODE_SYN, FunctionVariadic.MODE_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.BASE_STR, FunctionVariadic.BASE_DESC, FunctionVariadic.BASE_ID, FunctionVariadic.BASE_SYN, FunctionVariadic.BASE_SINCE, FunctionVariadic.TYPE_ID); addKeyWord(FunctionVariadic.NDIST_STR, FunctionVariadic.NDIST_DESC, FunctionVariadic.NDIST_ID, FunctionVariadic.NDIST_SYN, FunctionVariadic.NDIST_SINCE, FunctionVariadic.TYPE_ID); /* * Calculus key words */ addKeyWord(CalculusOperator.SUM_STR, CalculusOperator.SUM_DESC, CalculusOperator.SUM_ID, CalculusOperator.SUM_SYN, CalculusOperator.SUM_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.PROD_STR, CalculusOperator.PROD_DESC, CalculusOperator.PROD_ID, CalculusOperator.PROD_SYN, CalculusOperator.PROD_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.INT_STR, CalculusOperator.INT_DESC, CalculusOperator.INT_ID, CalculusOperator.INT_SYN, CalculusOperator.INT_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.DER_STR, CalculusOperator.DER_DESC, CalculusOperator.DER_ID, CalculusOperator.DER_SYN, CalculusOperator.DER_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.DER_LEFT_STR, CalculusOperator.DER_LEFT_DESC, CalculusOperator.DER_LEFT_ID, CalculusOperator.DER_LEFT_SYN, CalculusOperator.DER_LEFT_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.DER_RIGHT_STR, CalculusOperator.DER_RIGHT_DESC, CalculusOperator.DER_RIGHT_ID, CalculusOperator.DER_RIGHT_SYN, CalculusOperator.DER_RIGHT_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.DERN_STR, CalculusOperator.DERN_DESC, CalculusOperator.DERN_ID, CalculusOperator.DERN_SYN, CalculusOperator.DERN_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.FORW_DIFF_STR, CalculusOperator.FORW_DIFF_DESC, CalculusOperator.FORW_DIFF_ID, CalculusOperator.FORW_DIFF_SYN, CalculusOperator.FORW_DIFF_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.BACKW_DIFF_STR, CalculusOperator.BACKW_DIFF_DESC, CalculusOperator.BACKW_DIFF_ID, CalculusOperator.BACKW_DIFF_SYN, CalculusOperator.BACKW_DIFF_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.AVG_STR, CalculusOperator.AVG_DESC, CalculusOperator.AVG_ID, CalculusOperator.AVG_SYN, CalculusOperator.AVG_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.VAR_STR, CalculusOperator.VAR_DESC, CalculusOperator.VAR_ID, CalculusOperator.VAR_SYN, CalculusOperator.VAR_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.STD_STR, CalculusOperator.STD_DESC, CalculusOperator.STD_ID, CalculusOperator.STD_SYN, CalculusOperator.STD_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.MIN_STR, CalculusOperator.MIN_DESC, CalculusOperator.MIN_ID, CalculusOperator.MIN_SYN, CalculusOperator.MIN_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.MAX_STR, CalculusOperator.MAX_DESC, CalculusOperator.MAX_ID, CalculusOperator.MAX_SYN, CalculusOperator.MAX_SINCE, CalculusOperator.TYPE_ID); addKeyWord(CalculusOperator.SOLVE_STR, CalculusOperator.SOLVE_DESC, CalculusOperator.SOLVE_ID, CalculusOperator.SOLVE_SYN, CalculusOperator.SOLVE_SINCE, CalculusOperator.TYPE_ID); /* * Constants key words */ addKeyWord(ConstantValue.PI_STR, ConstantValue.PI_DESC, ConstantValue.PI_ID, ConstantValue.PI_SYN, ConstantValue.PI_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.EULER_STR, ConstantValue.EULER_DESC, ConstantValue.EULER_ID, ConstantValue.EULER_SYN, ConstantValue.EULER_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.EULER_MASCHERONI_STR, ConstantValue.EULER_MASCHERONI_DESC, ConstantValue.EULER_MASCHERONI_ID, ConstantValue.EULER_MASCHERONI_SYN, ConstantValue.EULER_MASCHERONI_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.GOLDEN_RATIO_STR, ConstantValue.GOLDEN_RATIO_DESC, ConstantValue.GOLDEN_RATIO_ID, ConstantValue.GOLDEN_RATIO_SYN, ConstantValue.GOLDEN_RATIO_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.PLASTIC_STR, ConstantValue.PLASTIC_DESC, ConstantValue.PLASTIC_ID, ConstantValue.PLASTIC_SYN, ConstantValue.PLASTIC_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.EMBREE_TREFETHEN_STR, ConstantValue.EMBREE_TREFETHEN_DESC, ConstantValue.EMBREE_TREFETHEN_ID, ConstantValue.EMBREE_TREFETHEN_SYN, ConstantValue.EMBREE_TREFETHEN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.FEIGENBAUM_DELTA_STR, ConstantValue.FEIGENBAUM_DELTA_DESC, ConstantValue.FEIGENBAUM_DELTA_ID, ConstantValue.FEIGENBAUM_DELTA_SYN, ConstantValue.FEIGENBAUM_DELTA_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.FEIGENBAUM_ALFA_STR, ConstantValue.FEIGENBAUM_ALFA_DESC, ConstantValue.FEIGENBAUM_ALFA_ID, ConstantValue.FEIGENBAUM_ALFA_SYN, ConstantValue.FEIGENBAUM_ALFA_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.TWIN_PRIME_STR, ConstantValue.TWIN_PRIME_DESC, ConstantValue.TWIN_PRIME_ID, ConstantValue.TWIN_PRIME_SYN, ConstantValue.TWIN_PRIME_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MEISSEL_MERTEENS_STR, ConstantValue.MEISSEL_MERTEENS_DESC, ConstantValue.MEISSEL_MERTEENS_ID, ConstantValue.MEISSEL_MERTEENS_SYN, ConstantValue.MEISSEL_MERTEENS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.BRAUN_TWIN_PRIME_STR, ConstantValue.BRAUN_TWIN_PRIME_DESC, ConstantValue.BRAUN_TWIN_PRIME_ID, ConstantValue.BRAUN_TWIN_PRIME_SYN, ConstantValue.BRAUN_TWIN_PRIME_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.BRAUN_PRIME_QUADR_STR, ConstantValue.BRAUN_PRIME_QUADR_DESC, ConstantValue.BRAUN_PRIME_QUADR_ID, ConstantValue.BRAUN_PRIME_QUADR_SYN, ConstantValue.BRAUN_PRIME_QUADR_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.BRUIJN_NEWMAN_STR, ConstantValue.BRUIJN_NEWMAN_DESC, ConstantValue.BRUIJN_NEWMAN_ID, ConstantValue.BRUIJN_NEWMAN_SYN, ConstantValue.BRUIJN_NEWMAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.CATALAN_STR, ConstantValue.CATALAN_DESC, ConstantValue.CATALAN_ID, ConstantValue.CATALAN_SYN, ConstantValue.CATALAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.LANDAU_RAMANUJAN_STR, ConstantValue.LANDAU_RAMANUJAN_DESC, ConstantValue.LANDAU_RAMANUJAN_ID, ConstantValue.LANDAU_RAMANUJAN_SYN, ConstantValue.LANDAU_RAMANUJAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.VISWANATH_STR, ConstantValue.VISWANATH_DESC, ConstantValue.VISWANATH_ID, ConstantValue.VISWANATH_SYN, ConstantValue.VISWANATH_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.LEGENDRE_STR, ConstantValue.LEGENDRE_DESC, ConstantValue.LEGENDRE_ID, ConstantValue.LEGENDRE_SYN, ConstantValue.LEGENDRE_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.RAMANUJAN_SOLDNER_STR, ConstantValue.RAMANUJAN_SOLDNER_DESC, ConstantValue.RAMANUJAN_SOLDNER_ID, ConstantValue.RAMANUJAN_SOLDNER_SYN, ConstantValue.RAMANUJAN_SOLDNER_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.ERDOS_BORWEIN_STR, ConstantValue.ERDOS_BORWEIN_DESC, ConstantValue.ERDOS_BORWEIN_ID, ConstantValue.ERDOS_BORWEIN_SYN, ConstantValue.ERDOS_BORWEIN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.BERNSTEIN_STR, ConstantValue.BERNSTEIN_DESC, ConstantValue.BERNSTEIN_ID, ConstantValue.BERNSTEIN_SYN, ConstantValue.BERNSTEIN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.GAUSS_KUZMIN_WIRSING_STR, ConstantValue.GAUSS_KUZMIN_WIRSING_DESC, ConstantValue.GAUSS_KUZMIN_WIRSING_ID, ConstantValue.GAUSS_KUZMIN_WIRSING_SYN, ConstantValue.GAUSS_KUZMIN_WIRSING_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.HAFNER_SARNAK_MCCURLEY_STR, ConstantValue.HAFNER_SARNAK_MCCURLEY_DESC, ConstantValue.HAFNER_SARNAK_MCCURLEY_ID, ConstantValue.HAFNER_SARNAK_MCCURLEY_SYN, ConstantValue.HAFNER_SARNAK_MCCURLEY_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.GOLOMB_DICKMAN_STR, ConstantValue.GOLOMB_DICKMAN_DESC, ConstantValue.GOLOMB_DICKMAN_ID, ConstantValue.GOLOMB_DICKMAN_SYN, ConstantValue.GOLOMB_DICKMAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.CAHEN_STR, ConstantValue.CAHEN_DESC, ConstantValue.CAHEN_ID, ConstantValue.CAHEN_SYN, ConstantValue.CAHEN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.LAPLACE_LIMIT_STR, ConstantValue.LAPLACE_LIMIT_DESC, ConstantValue.LAPLACE_LIMIT_ID, ConstantValue.LAPLACE_LIMIT_SYN, ConstantValue.LAPLACE_LIMIT_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.ALLADI_GRINSTEAD_STR, ConstantValue.ALLADI_GRINSTEAD_DESC, ConstantValue.ALLADI_GRINSTEAD_ID, ConstantValue.ALLADI_GRINSTEAD_SYN, ConstantValue.ALLADI_GRINSTEAD_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.LENGYEL_STR, ConstantValue.LENGYEL_DESC, ConstantValue.LENGYEL_ID, ConstantValue.LENGYEL_SYN, ConstantValue.LENGYEL_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.LEVY_STR, ConstantValue.LEVY_DESC, ConstantValue.LEVY_ID, ConstantValue.LEVY_SYN, ConstantValue.LEVY_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.APERY_STR, ConstantValue.APERY_DESC, ConstantValue.APERY_ID, ConstantValue.APERY_SYN, ConstantValue.APERY_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MILLS_STR, ConstantValue.MILLS_DESC, ConstantValue.MILLS_ID, ConstantValue.MILLS_SYN, ConstantValue.MILLS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.BACKHOUSE_STR, ConstantValue.BACKHOUSE_DESC, ConstantValue.BACKHOUSE_ID, ConstantValue.BACKHOUSE_SYN, ConstantValue.BACKHOUSE_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.PORTER_STR, ConstantValue.PORTER_DESC, ConstantValue.PORTER_ID, ConstantValue.PORTER_SYN, ConstantValue.PORTER_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.LIEB_QUARE_ICE_STR, ConstantValue.LIEB_QUARE_ICE_DESC, ConstantValue.LIEB_QUARE_ICE_ID, ConstantValue.LIEB_QUARE_ICE_SYN, ConstantValue.LIEB_QUARE_ICE_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.NIVEN_STR, ConstantValue.NIVEN_DESC, ConstantValue.NIVEN_ID, ConstantValue.NIVEN_SYN, ConstantValue.NIVEN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.SIERPINSKI_STR, ConstantValue.SIERPINSKI_DESC, ConstantValue.SIERPINSKI_ID, ConstantValue.SIERPINSKI_SYN, ConstantValue.SIERPINSKI_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.KHINCHIN_STR, ConstantValue.KHINCHIN_DESC, ConstantValue.KHINCHIN_ID, ConstantValue.KHINCHIN_SYN, ConstantValue.KHINCHIN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.FRANSEN_ROBINSON_STR, ConstantValue.FRANSEN_ROBINSON_DESC, ConstantValue.FRANSEN_ROBINSON_ID, ConstantValue.FRANSEN_ROBINSON_SYN, ConstantValue.FRANSEN_ROBINSON_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.LANDAU_STR, ConstantValue.LANDAU_DESC, ConstantValue.LANDAU_ID, ConstantValue.LANDAU_SYN, ConstantValue.LANDAU_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.PARABOLIC_STR, ConstantValue.PARABOLIC_DESC, ConstantValue.PARABOLIC_ID, ConstantValue.PARABOLIC_SYN, ConstantValue.PARABOLIC_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.OMEGA_STR, ConstantValue.OMEGA_DESC, ConstantValue.OMEGA_ID, ConstantValue.OMEGA_SYN, ConstantValue.OMEGA_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MRB_STR, ConstantValue.MRB_DESC, ConstantValue.MRB_ID, ConstantValue.MRB_SYN, ConstantValue.MRB_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.LI2_STR, ConstantValue.LI2_DESC, ConstantValue.LI2_ID, ConstantValue.LI2_SYN, ConstantValue.LI2_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.GOMPERTZ_STR, ConstantValue.GOMPERTZ_DESC, ConstantValue.GOMPERTZ_ID, ConstantValue.GOMPERTZ_SYN, ConstantValue.GOMPERTZ_SINCE, ConstantValue.TYPE_ID); /* Physical Constants */ addKeyWord(ConstantValue.LIGHT_SPEED_STR, ConstantValue.LIGHT_SPEED_DESC, ConstantValue.LIGHT_SPEED_ID, ConstantValue.LIGHT_SPEED_SYN, ConstantValue.LIGHT_SPEED_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.GRAVITATIONAL_CONSTANT_STR, ConstantValue.GRAVITATIONAL_CONSTANT_DESC, ConstantValue.GRAVITATIONAL_CONSTANT_ID, ConstantValue.GRAVITATIONAL_CONSTANT_SYN, ConstantValue.GRAVITATIONAL_CONSTANT_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.GRAVIT_ACC_EARTH_STR, ConstantValue.GRAVIT_ACC_EARTH_DESC, ConstantValue.GRAVIT_ACC_EARTH_ID, ConstantValue.GRAVIT_ACC_EARTH_SYN, ConstantValue.GRAVIT_ACC_EARTH_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.PLANCK_CONSTANT_STR, ConstantValue.PLANCK_CONSTANT_DESC, ConstantValue.PLANCK_CONSTANT_ID, ConstantValue.PLANCK_CONSTANT_SYN, ConstantValue.PLANCK_CONSTANT_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.PLANCK_CONSTANT_REDUCED_STR, ConstantValue.PLANCK_CONSTANT_REDUCED_DESC, ConstantValue.PLANCK_CONSTANT_REDUCED_ID, ConstantValue.PLANCK_CONSTANT_REDUCED_SYN, ConstantValue.PLANCK_CONSTANT_REDUCED_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.PLANCK_LENGTH_STR, ConstantValue.PLANCK_LENGTH_DESC, ConstantValue.PLANCK_LENGTH_ID, ConstantValue.PLANCK_LENGTH_SYN, ConstantValue.PLANCK_LENGTH_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.PLANCK_MASS_STR, ConstantValue.PLANCK_MASS_DESC, ConstantValue.PLANCK_MASS_ID, ConstantValue.PLANCK_MASS_SYN, ConstantValue.PLANCK_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.PLANCK_TIME_STR, ConstantValue.PLANCK_TIME_DESC, ConstantValue.PLANCK_TIME_ID, ConstantValue.PLANCK_TIME_SYN, ConstantValue.PLANCK_TIME_SINCE, ConstantValue.TYPE_ID); /* Astronomical Constants */ addKeyWord(ConstantValue.LIGHT_YEAR_STR, ConstantValue.LIGHT_YEAR_DESC, ConstantValue.LIGHT_YEAR_ID, ConstantValue.LIGHT_YEAR_SYN, ConstantValue.LIGHT_YEAR_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.ASTRONOMICAL_UNIT_STR, ConstantValue.ASTRONOMICAL_UNIT_DESC, ConstantValue.ASTRONOMICAL_UNIT_ID, ConstantValue.ASTRONOMICAL_UNIT_SYN, ConstantValue.ASTRONOMICAL_UNIT_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.PARSEC_STR, ConstantValue.PARSEC_DESC, ConstantValue.PARSEC_ID, ConstantValue.PARSEC_SYN, ConstantValue.PARSEC_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.KILOPARSEC_STR, ConstantValue.KILOPARSEC_DESC, ConstantValue.KILOPARSEC_ID, ConstantValue.KILOPARSEC_SYN, ConstantValue.KILOPARSEC_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.EARTH_RADIUS_EQUATORIAL_STR, ConstantValue.EARTH_RADIUS_EQUATORIAL_DESC, ConstantValue.EARTH_RADIUS_EQUATORIAL_ID, ConstantValue.EARTH_RADIUS_EQUATORIAL_SYN, ConstantValue.EARTH_RADIUS_EQUATORIAL_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.EARTH_RADIUS_POLAR_STR, ConstantValue.EARTH_RADIUS_POLAR_DESC, ConstantValue.EARTH_RADIUS_POLAR_ID, ConstantValue.EARTH_RADIUS_POLAR_SYN, ConstantValue.EARTH_RADIUS_POLAR_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.EARTH_RADIUS_MEAN_STR, ConstantValue.EARTH_RADIUS_MEAN_DESC, ConstantValue.EARTH_RADIUS_MEAN_ID, ConstantValue.EARTH_RADIUS_MEAN_SYN, ConstantValue.EARTH_RADIUS_MEAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.EARTH_MASS_STR, ConstantValue.EARTH_MASS_DESC, ConstantValue.EARTH_MASS_ID, ConstantValue.EARTH_MASS_SYN, ConstantValue.EARTH_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.EARTH_SEMI_MAJOR_AXIS_STR, ConstantValue.EARTH_SEMI_MAJOR_AXIS_DESC, ConstantValue.EARTH_SEMI_MAJOR_AXIS_ID, ConstantValue.EARTH_SEMI_MAJOR_AXIS_SYN, ConstantValue.EARTH_SEMI_MAJOR_AXIS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MOON_RADIUS_MEAN_STR, ConstantValue.MOON_RADIUS_MEAN_DESC, ConstantValue.MOON_RADIUS_MEAN_ID, ConstantValue.MOON_RADIUS_MEAN_SYN, ConstantValue.MOON_RADIUS_MEAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MOON_MASS_STR, ConstantValue.MOON_MASS_DESC, ConstantValue.MOON_MASS_ID, ConstantValue.MOON_MASS_SYN, ConstantValue.MOON_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MONN_SEMI_MAJOR_AXIS_STR, ConstantValue.MONN_SEMI_MAJOR_AXIS_DESC, ConstantValue.MONN_SEMI_MAJOR_AXIS_ID, ConstantValue.MONN_SEMI_MAJOR_AXIS_SYN, ConstantValue.MONN_SEMI_MAJOR_AXIS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.SOLAR_RADIUS_STR, ConstantValue.SOLAR_RADIUS_DESC, ConstantValue.SOLAR_RADIUS_ID, ConstantValue.SOLAR_RADIUS_SYN, ConstantValue.SOLAR_RADIUS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.SOLAR_MASS_STR, ConstantValue.SOLAR_MASS_DESC, ConstantValue.SOLAR_MASS_ID, ConstantValue.SOLAR_MASS_SYN, ConstantValue.SOLAR_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MERCURY_RADIUS_MEAN_STR, ConstantValue.MERCURY_RADIUS_MEAN_DESC, ConstantValue.MERCURY_RADIUS_MEAN_ID, ConstantValue.MERCURY_RADIUS_MEAN_SYN, ConstantValue.MERCURY_RADIUS_MEAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MERCURY_MASS_STR, ConstantValue.MERCURY_MASS_DESC, ConstantValue.MERCURY_MASS_ID, ConstantValue.MERCURY_MASS_SYN, ConstantValue.MERCURY_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MERCURY_SEMI_MAJOR_AXIS_STR, ConstantValue.MERCURY_SEMI_MAJOR_AXIS_DESC, ConstantValue.MERCURY_SEMI_MAJOR_AXIS_ID, ConstantValue.MERCURY_SEMI_MAJOR_AXIS_SYN, ConstantValue.MERCURY_SEMI_MAJOR_AXIS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.VENUS_RADIUS_MEAN_STR, ConstantValue.VENUS_RADIUS_MEAN_DESC, ConstantValue.VENUS_RADIUS_MEAN_ID, ConstantValue.VENUS_RADIUS_MEAN_SYN, ConstantValue.VENUS_RADIUS_MEAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.VENUS_MASS_STR, ConstantValue.VENUS_MASS_DESC, ConstantValue.VENUS_MASS_ID, ConstantValue.VENUS_MASS_SYN, ConstantValue.VENUS_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.VENUS_SEMI_MAJOR_AXIS_STR, ConstantValue.VENUS_SEMI_MAJOR_AXIS_DESC, ConstantValue.VENUS_SEMI_MAJOR_AXIS_ID, ConstantValue.VENUS_SEMI_MAJOR_AXIS_SYN, ConstantValue.VENUS_SEMI_MAJOR_AXIS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MARS_RADIUS_MEAN_STR, ConstantValue.MARS_RADIUS_MEAN_DESC, ConstantValue.MARS_RADIUS_MEAN_ID, ConstantValue.MARS_RADIUS_MEAN_SYN, ConstantValue.MARS_RADIUS_MEAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MARS_MASS_STR, ConstantValue.MARS_MASS_DESC, ConstantValue.MARS_MASS_ID, ConstantValue.MARS_MASS_SYN, ConstantValue.MARS_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.MARS_SEMI_MAJOR_AXIS_STR, ConstantValue.MARS_SEMI_MAJOR_AXIS_DESC, ConstantValue.MARS_SEMI_MAJOR_AXIS_ID, ConstantValue.MARS_SEMI_MAJOR_AXIS_SYN, ConstantValue.MARS_SEMI_MAJOR_AXIS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.JUPITER_RADIUS_MEAN_STR, ConstantValue.JUPITER_RADIUS_MEAN_DESC, ConstantValue.JUPITER_RADIUS_MEAN_ID, ConstantValue.JUPITER_RADIUS_MEAN_SYN, ConstantValue.JUPITER_RADIUS_MEAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.JUPITER_MASS_STR, ConstantValue.JUPITER_MASS_DESC, ConstantValue.JUPITER_MASS_ID, ConstantValue.JUPITER_MASS_SYN, ConstantValue.JUPITER_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.JUPITER_SEMI_MAJOR_AXIS_STR, ConstantValue.JUPITER_SEMI_MAJOR_AXIS_DESC, ConstantValue.JUPITER_SEMI_MAJOR_AXIS_ID, ConstantValue.JUPITER_SEMI_MAJOR_AXIS_SYN, ConstantValue.JUPITER_SEMI_MAJOR_AXIS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.SATURN_RADIUS_MEAN_STR, ConstantValue.SATURN_RADIUS_MEAN_DESC, ConstantValue.SATURN_RADIUS_MEAN_ID, ConstantValue.SATURN_RADIUS_MEAN_SYN, ConstantValue.SATURN_RADIUS_MEAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.SATURN_MASS_STR, ConstantValue.SATURN_MASS_DESC, ConstantValue.SATURN_MASS_ID, ConstantValue.SATURN_MASS_SYN, ConstantValue.SATURN_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.SATURN_SEMI_MAJOR_AXIS_STR, ConstantValue.SATURN_SEMI_MAJOR_AXIS_DESC, ConstantValue.SATURN_SEMI_MAJOR_AXIS_ID, ConstantValue.SATURN_SEMI_MAJOR_AXIS_SYN, ConstantValue.SATURN_SEMI_MAJOR_AXIS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.URANUS_RADIUS_MEAN_STR, ConstantValue.URANUS_RADIUS_MEAN_DESC, ConstantValue.URANUS_RADIUS_MEAN_ID, ConstantValue.URANUS_RADIUS_MEAN_SYN, ConstantValue.URANUS_RADIUS_MEAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.URANUS_MASS_STR, ConstantValue.URANUS_MASS_DESC, ConstantValue.URANUS_MASS_ID, ConstantValue.URANUS_MASS_SYN, ConstantValue.URANUS_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.URANUS_SEMI_MAJOR_AXIS_STR, ConstantValue.URANUS_SEMI_MAJOR_AXIS_DESC, ConstantValue.URANUS_SEMI_MAJOR_AXIS_ID, ConstantValue.URANUS_SEMI_MAJOR_AXIS_SYN, ConstantValue.URANUS_SEMI_MAJOR_AXIS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.NEPTUNE_RADIUS_MEAN_STR, ConstantValue.NEPTUNE_RADIUS_MEAN_DESC, ConstantValue.NEPTUNE_RADIUS_MEAN_ID, ConstantValue.NEPTUNE_RADIUS_MEAN_SYN, ConstantValue.NEPTUNE_RADIUS_MEAN_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.NEPTUNE_MASS_STR, ConstantValue.NEPTUNE_MASS_DESC, ConstantValue.NEPTUNE_MASS_ID, ConstantValue.NEPTUNE_MASS_SYN, ConstantValue.NEPTUNE_MASS_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.NEPTUNE_SEMI_MAJOR_AXIS_STR, ConstantValue.NEPTUNE_SEMI_MAJOR_AXIS_DESC, ConstantValue.NEPTUNE_SEMI_MAJOR_AXIS_ID, ConstantValue.NEPTUNE_SEMI_MAJOR_AXIS_SYN, ConstantValue.NEPTUNE_SEMI_MAJOR_AXIS_SINCE, ConstantValue.TYPE_ID); /* boolean */ addKeyWord(ConstantValue.TRUE_STR, ConstantValue.TRUE_DESC, ConstantValue.TRUE_ID, ConstantValue.TRUE_SYN, ConstantValue.TRUE_SINCE, ConstantValue.TYPE_ID); addKeyWord(ConstantValue.FALSE_STR, ConstantValue.FALSE_DESC, ConstantValue.FALSE_ID, ConstantValue.FALSE_SYN, ConstantValue.FALSE_SINCE, ConstantValue.TYPE_ID); /* other */ addKeyWord(ConstantValue.NAN_STR, ConstantValue.NAN_DESC, ConstantValue.NAN_ID, ConstantValue.NAN_SYN, ConstantValue.NAN_SINCE, ConstantValue.TYPE_ID); /* * Random variables */ addKeyWord(RandomVariable.UNIFORM_STR, RandomVariable.UNIFORM_DESC, RandomVariable.UNIFORM_ID, RandomVariable.UNIFORM_SYN, RandomVariable.UNIFORM_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT_STR, RandomVariable.INT_DESC, RandomVariable.INT_ID, RandomVariable.INT_SYN, RandomVariable.INT_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT1_STR, RandomVariable.INT1_DESC, RandomVariable.INT1_ID, RandomVariable.INT1_SYN, RandomVariable.INT1_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT2_STR, RandomVariable.INT2_DESC, RandomVariable.INT2_ID, RandomVariable.INT2_SYN, RandomVariable.INT2_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT3_STR, RandomVariable.INT3_DESC, RandomVariable.INT3_ID, RandomVariable.INT3_SYN, RandomVariable.INT3_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT4_STR, RandomVariable.INT4_DESC, RandomVariable.INT4_ID, RandomVariable.INT4_SYN, RandomVariable.INT4_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT5_STR, RandomVariable.INT5_DESC, RandomVariable.INT5_ID, RandomVariable.INT5_SYN, RandomVariable.INT5_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT6_STR, RandomVariable.INT6_DESC, RandomVariable.INT6_ID, RandomVariable.INT6_SYN, RandomVariable.INT6_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT7_STR, RandomVariable.INT7_DESC, RandomVariable.INT7_ID, RandomVariable.INT7_SYN, RandomVariable.INT7_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT8_STR, RandomVariable.INT8_DESC, RandomVariable.INT8_ID, RandomVariable.INT8_SYN, RandomVariable.INT8_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.INT9_STR, RandomVariable.INT9_DESC, RandomVariable.INT9_ID, RandomVariable.INT9_SYN, RandomVariable.INT9_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_STR, RandomVariable.NAT0_DESC, RandomVariable.NAT0_ID, RandomVariable.NAT0_SYN, RandomVariable.NAT0_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_1_STR, RandomVariable.NAT0_1_DESC, RandomVariable.NAT0_1_ID, RandomVariable.NAT0_1_SYN, RandomVariable.NAT0_1_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_2_STR, RandomVariable.NAT0_2_DESC, RandomVariable.NAT0_2_ID, RandomVariable.NAT0_2_SYN, RandomVariable.NAT0_2_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_3_STR, RandomVariable.NAT0_3_DESC, RandomVariable.NAT0_3_ID, RandomVariable.NAT0_3_SYN, RandomVariable.NAT0_3_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_4_STR, RandomVariable.NAT0_4_DESC, RandomVariable.NAT0_4_ID, RandomVariable.NAT0_4_SYN, RandomVariable.NAT0_4_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_5_STR, RandomVariable.NAT0_5_DESC, RandomVariable.NAT0_5_ID, RandomVariable.NAT0_5_SYN, RandomVariable.NAT0_5_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_6_STR, RandomVariable.NAT0_6_DESC, RandomVariable.NAT0_6_ID, RandomVariable.NAT0_6_SYN, RandomVariable.NAT0_6_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_7_STR, RandomVariable.NAT0_7_DESC, RandomVariable.NAT0_7_ID, RandomVariable.NAT0_7_SYN, RandomVariable.NAT0_7_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_8_STR, RandomVariable.NAT0_8_DESC, RandomVariable.NAT0_8_ID, RandomVariable.NAT0_8_SYN, RandomVariable.NAT0_8_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT0_9_STR, RandomVariable.NAT0_9_DESC, RandomVariable.NAT0_9_ID, RandomVariable.NAT0_9_SYN, RandomVariable.NAT0_9_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_STR, RandomVariable.NAT1_DESC, RandomVariable.NAT1_ID, RandomVariable.NAT1_SYN, RandomVariable.NAT1_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_1_STR, RandomVariable.NAT1_1_DESC, RandomVariable.NAT1_1_ID, RandomVariable.NAT1_1_SYN, RandomVariable.NAT1_1_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_2_STR, RandomVariable.NAT1_2_DESC, RandomVariable.NAT1_2_ID, RandomVariable.NAT1_2_SYN, RandomVariable.NAT1_2_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_3_STR, RandomVariable.NAT1_3_DESC, RandomVariable.NAT1_3_ID, RandomVariable.NAT1_3_SYN, RandomVariable.NAT1_3_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_4_STR, RandomVariable.NAT1_4_DESC, RandomVariable.NAT1_4_ID, RandomVariable.NAT1_4_SYN, RandomVariable.NAT1_4_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_5_STR, RandomVariable.NAT1_5_DESC, RandomVariable.NAT1_5_ID, RandomVariable.NAT1_5_SYN, RandomVariable.NAT1_5_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_6_STR, RandomVariable.NAT1_6_DESC, RandomVariable.NAT1_6_ID, RandomVariable.NAT1_6_SYN, RandomVariable.NAT1_6_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_7_STR, RandomVariable.NAT1_7_DESC, RandomVariable.NAT1_7_ID, RandomVariable.NAT1_7_SYN, RandomVariable.NAT1_7_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_8_STR, RandomVariable.NAT1_8_DESC, RandomVariable.NAT1_8_ID, RandomVariable.NAT1_8_SYN, RandomVariable.NAT1_8_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NAT1_9_STR, RandomVariable.NAT1_9_DESC, RandomVariable.NAT1_9_ID, RandomVariable.NAT1_9_SYN, RandomVariable.NAT1_9_SINCE, RandomVariable.TYPE_ID); addKeyWord(RandomVariable.NOR_STR, RandomVariable.NOR_DESC, RandomVariable.NOR_ID, RandomVariable.NOR_SYN, RandomVariable.NOR_SINCE, RandomVariable.TYPE_ID); /* * BiteWise Operators */ addKeyWord(BitwiseOperator.COMPL_STR, BitwiseOperator.COMPL_DESC, BitwiseOperator.COMPL_ID, BitwiseOperator.COMPL_SYN, BitwiseOperator.COMPL_SINCE, BitwiseOperator.TYPE_ID); addKeyWord(BitwiseOperator.AND_STR, BitwiseOperator.AND_DESC, BitwiseOperator.AND_ID, BitwiseOperator.AND_SYN, BitwiseOperator.AND_SINCE, BitwiseOperator.TYPE_ID); addKeyWord(BitwiseOperator.XOR_STR, BitwiseOperator.XOR_DESC, BitwiseOperator.XOR_ID, BitwiseOperator.XOR_SYN, BitwiseOperator.XOR_SINCE, BitwiseOperator.TYPE_ID); addKeyWord(BitwiseOperator.OR_STR, BitwiseOperator.OR_DESC, BitwiseOperator.OR_ID, BitwiseOperator.OR_SYN, BitwiseOperator.OR_SINCE, BitwiseOperator.TYPE_ID); addKeyWord(BitwiseOperator.LEFT_SHIFT_STR, BitwiseOperator.LEFT_SHIFT_DESC, BitwiseOperator.LEFT_SHIFT_ID, BitwiseOperator.LEFT_SHIFT_SYN, BitwiseOperator.LEFT_SHIFT_SINCE, BitwiseOperator.TYPE_ID); addKeyWord(BitwiseOperator.RIGHT_SHIFT_STR, BitwiseOperator.RIGHT_SHIFT_DESC, BitwiseOperator.RIGHT_SHIFT_ID, BitwiseOperator.RIGHT_SHIFT_SYN, BitwiseOperator.RIGHT_SHIFT_SINCE, BitwiseOperator.TYPE_ID); /* * Units */ addKeyWord(Unit.PERC_STR, Unit.PERC_DESC, Unit.PERC_ID, Unit.PERC_SYN, Unit.PERC_SINCE, Unit.TYPE_ID); addKeyWord(Unit.PROMIL_STR, Unit.PROMIL_DESC, Unit.PROMIL_ID, Unit.PROMIL_SYN, Unit.PROMIL_SINCE, Unit.TYPE_ID); /* Metric prefixes */ addKeyWord(Unit.YOTTA_STR, Unit.YOTTA_DESC, Unit.YOTTA_ID, Unit.YOTTA_SYN, Unit.YOTTA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.YOTTA_SEPT_STR, Unit.YOTTA_DESC, Unit.YOTTA_ID, Unit.YOTTA_SEPT_SYN, Unit.YOTTA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.ZETTA_STR, Unit.ZETTA_DESC, Unit.ZETTA_ID, Unit.ZETTA_SYN, Unit.ZETTA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.ZETTA_SEXT_STR, Unit.ZETTA_DESC, Unit.ZETTA_ID, Unit.ZETTA_SEXT_SYN, Unit.ZETTA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.EXA_STR, Unit.EXA_DESC, Unit.EXA_ID, Unit.EXA_SYN, Unit.EXA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.EXA_QUINT_STR, Unit.EXA_DESC, Unit.EXA_ID, Unit.EXA_QUINT_SYN, Unit.EXA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.PETA_STR, Unit.PETA_DESC, Unit.PETA_ID, Unit.PETA_SYN, Unit.PETA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.PETA_QUAD_STR, Unit.PETA_DESC, Unit.PETA_ID, Unit.PETA_QUAD_SYN, Unit.PETA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.TERA_STR, Unit.TERA_DESC, Unit.TERA_ID, Unit.TERA_SYN, Unit.TERA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.TERA_TRIL_STR, Unit.TERA_DESC, Unit.TERA_ID, Unit.TERA_TRIL_SYN, Unit.TERA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.GIGA_STR, Unit.GIGA_DESC, Unit.GIGA_ID, Unit.GIGA_SYN, Unit.GIGA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.GIGA_BIL_STR, Unit.GIGA_DESC, Unit.GIGA_ID, Unit.GIGA_BIL_SYN, Unit.GIGA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MEGA_STR, Unit.MEGA_DESC, Unit.MEGA_ID, Unit.MEGA_SYN, Unit.MEGA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MEGA_MIL_STR, Unit.MEGA_DESC, Unit.MEGA_ID, Unit.MEGA_MIL_SYN, Unit.MEGA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILO_STR, Unit.KILO_DESC, Unit.KILO_ID, Unit.KILO_SYN, Unit.KILO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILO_TH_STR, Unit.KILO_DESC, Unit.KILO_ID, Unit.KILO_TH_SYN, Unit.KILO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.HECTO_STR, Unit.HECTO_DESC, Unit.HECTO_ID, Unit.HECTO_SYN, Unit.HECTO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.HECTO_HUND_STR, Unit.HECTO_DESC, Unit.HECTO_ID, Unit.HECTO_HUND_SYN, Unit.HECTO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.DECA_STR, Unit.DECA_DESC, Unit.DECA_ID, Unit.DECA_SYN, Unit.DECA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.DECA_TEN_STR, Unit.DECA_DESC, Unit.DECA_ID, Unit.DECA_TEN_SYN, Unit.DECA_SINCE, Unit.TYPE_ID); addKeyWord(Unit.DECI_STR, Unit.DECI_DESC, Unit.DECI_ID, Unit.DECI_SYN, Unit.DECI_SINCE, Unit.TYPE_ID); addKeyWord(Unit.CENTI_STR, Unit.CENTI_DESC, Unit.CENTI_ID, Unit.CENTI_SYN, Unit.CENTI_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MILLI_STR, Unit.MILLI_DESC, Unit.MILLI_ID, Unit.MILLI_SYN, Unit.MILLI_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MICRO_STR, Unit.MICRO_DESC, Unit.MICRO_ID, Unit.MICRO_SYN, Unit.MICRO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.NANO_STR, Unit.NANO_DESC, Unit.NANO_ID, Unit.NANO_SYN, Unit.NANO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.PICO_STR, Unit.PICO_DESC, Unit.PICO_ID, Unit.PICO_SYN, Unit.PICO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.FEMTO_STR, Unit.FEMTO_DESC, Unit.FEMTO_ID, Unit.FEMTO_SYN, Unit.FEMTO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.ATTO_STR, Unit.ATTO_DESC, Unit.ATTO_ID, Unit.ATTO_SYN, Unit.ATTO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.ZEPTO_STR, Unit.ZEPTO_DESC, Unit.ZEPTO_ID, Unit.ZEPTO_SYN, Unit.ZEPTO_SINCE, Unit.TYPE_ID); addKeyWord(Unit.YOCTO_STR, Unit.YOCTO_DESC, Unit.YOCTO_ID, Unit.YOCTO_SYN, Unit.YOCTO_SINCE, Unit.TYPE_ID); /* Units of length / distance */ addKeyWord(Unit.METRE_STR, Unit.METRE_DESC, Unit.METRE_ID, Unit.METRE_SYN, Unit.METRE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILOMETRE_STR, Unit.KILOMETRE_DESC, Unit.KILOMETRE_ID, Unit.KILOMETRE_SYN, Unit.KILOMETRE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.CENTIMETRE_STR, Unit.CENTIMETRE_DESC, Unit.CENTIMETRE_ID, Unit.CENTIMETRE_SYN, Unit.CENTIMETRE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MILLIMETRE_STR, Unit.MILLIMETRE_DESC, Unit.MILLIMETRE_ID, Unit.MILLIMETRE_SYN, Unit.MILLIMETRE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.INCH_STR, Unit.INCH_DESC, Unit.INCH_ID, Unit.INCH_SYN, Unit.INCH_SINCE, Unit.TYPE_ID); addKeyWord(Unit.YARD_STR, Unit.YARD_DESC, Unit.YARD_ID, Unit.YARD_SYN, Unit.YARD_SINCE, Unit.TYPE_ID); addKeyWord(Unit.FEET_STR, Unit.FEET_DESC, Unit.FEET_ID, Unit.FEET_SYN, Unit.FEET_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MILE_STR, Unit.MILE_DESC, Unit.MILE_ID, Unit.MILE_SYN, Unit.MILE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.NAUTICAL_MILE_STR, Unit.NAUTICAL_MILE_DESC, Unit.NAUTICAL_MILE_ID, Unit.NAUTICAL_MILE_SYN, Unit.NAUTICAL_MILE_SINCE, Unit.TYPE_ID); /* Units of area */ addKeyWord(Unit.METRE2_STR, Unit.METRE2_DESC, Unit.METRE2_ID, Unit.METRE2_SYN, Unit.METRE2_SINCE, Unit.TYPE_ID); addKeyWord(Unit.CENTIMETRE2_STR, Unit.CENTIMETRE2_DESC, Unit.CENTIMETRE2_ID, Unit.CENTIMETRE2_SYN, Unit.CENTIMETRE2_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MILLIMETRE2_STR, Unit.MILLIMETRE2_DESC, Unit.MILLIMETRE2_ID, Unit.MILLIMETRE2_SYN, Unit.MILLIMETRE2_SINCE, Unit.TYPE_ID); addKeyWord(Unit.ARE_STR, Unit.ARE_DESC, Unit.ARE_ID, Unit.ARE_SYN, Unit.ARE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.HECTARE_STR, Unit.HECTARE_DESC, Unit.HECTARE_ID, Unit.HECTARE_SYN, Unit.HECTARE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.ACRE_STR, Unit.ACRE_DESC, Unit.ACRE_ID, Unit.ACRE_SYN, Unit.ACRE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILOMETRE2_STR, Unit.KILOMETRE2_DESC, Unit.KILOMETRE2_ID, Unit.KILOMETRE2_SYN, Unit.KILOMETRE2_SINCE, Unit.TYPE_ID); /* Units of volume */ addKeyWord(Unit.MILLIMETRE3_STR, Unit.MILLIMETRE3_DESC, Unit.MILLIMETRE3_ID, Unit.MILLIMETRE3_SYN, Unit.MILLIMETRE3_SINCE, Unit.TYPE_ID); addKeyWord(Unit.CENTIMETRE3_STR, Unit.CENTIMETRE3_DESC, Unit.CENTIMETRE3_ID, Unit.CENTIMETRE3_SYN, Unit.CENTIMETRE3_SINCE, Unit.TYPE_ID); addKeyWord(Unit.METRE3_STR, Unit.METRE3_DESC, Unit.METRE3_ID, Unit.METRE3_SYN, Unit.METRE3_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILOMETRE3_STR, Unit.KILOMETRE3_DESC, Unit.KILOMETRE3_ID, Unit.KILOMETRE3_SYN, Unit.KILOMETRE3_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MILLILITRE_STR, Unit.MILLILITRE_DESC, Unit.MILLILITRE_ID, Unit.MILLILITRE_SYN, Unit.MILLILITRE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.LITRE_STR, Unit.LITRE_DESC, Unit.LITRE_ID, Unit.LITRE_SYN, Unit.LITRE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.GALLON_STR, Unit.GALLON_DESC, Unit.GALLON_ID, Unit.GALLON_SYN, Unit.GALLON_SINCE, Unit.TYPE_ID); addKeyWord(Unit.PINT_STR, Unit.PINT_DESC, Unit.PINT_ID, Unit.PINT_SYN, Unit.PINT_SINCE, Unit.TYPE_ID); /* Units of time */ addKeyWord(Unit.SECOND_STR, Unit.SECOND_DESC, Unit.SECOND_ID, Unit.SECOND_SYN, Unit.SECOND_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MILLISECOND_STR, Unit.MILLISECOND_DESC, Unit.MILLISECOND_ID, Unit.MILLISECOND_SYN, Unit.MILLISECOND_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MINUTE_STR, Unit.MINUTE_DESC, Unit.MINUTE_ID, Unit.MINUTE_SYN, Unit.MINUTE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.HOUR_STR, Unit.HOUR_DESC, Unit.HOUR_ID, Unit.HOUR_SYN, Unit.HOUR_SINCE, Unit.TYPE_ID); addKeyWord(Unit.DAY_STR, Unit.DAY_DESC, Unit.DAY_ID, Unit.DAY_SYN, Unit.DAY_SINCE, Unit.TYPE_ID); addKeyWord(Unit.WEEK_STR, Unit.WEEK_DESC, Unit.WEEK_ID, Unit.WEEK_SYN, Unit.WEEK_SINCE, Unit.TYPE_ID); addKeyWord(Unit.JULIAN_YEAR_STR, Unit.JULIAN_YEAR_DESC, Unit.JULIAN_YEAR_ID, Unit.JULIAN_YEAR_SYN, Unit.JULIAN_YEAR_SINCE, Unit.TYPE_ID); /* Units of mass */ addKeyWord(Unit.KILOGRAM_STR, Unit.KILOGRAM_DESC, Unit.KILOGRAM_ID, Unit.KILOGRAM_SYN, Unit.KILOGRAM_SINCE, Unit.TYPE_ID); addKeyWord(Unit.GRAM_STR, Unit.GRAM_DESC, Unit.GRAM_ID, Unit.GRAM_SYN, Unit.GRAM_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MILLIGRAM_STR, Unit.MILLIGRAM_DESC, Unit.MILLIGRAM_ID, Unit.MILLIGRAM_SYN, Unit.MILLIGRAM_SINCE, Unit.TYPE_ID); addKeyWord(Unit.DECAGRAM_STR, Unit.DECAGRAM_DESC, Unit.DECAGRAM_ID, Unit.DECAGRAM_SYN, Unit.DECAGRAM_SINCE, Unit.TYPE_ID); addKeyWord(Unit.TONNE_STR, Unit.TONNE_DESC, Unit.TONNE_ID, Unit.TONNE_SYN, Unit.TONNE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.OUNCE_STR, Unit.OUNCE_DESC, Unit.OUNCE_ID, Unit.OUNCE_SYN, Unit.OUNCE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.POUND_STR, Unit.POUND_DESC, Unit.POUND_ID, Unit.POUND_SYN, Unit.POUND_SINCE, Unit.TYPE_ID); /* Units of information */ addKeyWord(Unit.BIT_STR, Unit.BIT_DESC, Unit.BIT_ID, Unit.BIT_SYN, Unit.BIT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILOBIT_STR, Unit.KILOBIT_DESC, Unit.KILOBIT_ID, Unit.KILOBIT_SYN, Unit.KILOBIT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MEGABIT_STR, Unit.MEGABIT_DESC, Unit.MEGABIT_ID, Unit.MEGABIT_SYN, Unit.MEGABIT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.GIGABIT_STR, Unit.GIGABIT_DESC, Unit.GIGABIT_ID, Unit.GIGABIT_SYN, Unit.GIGABIT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.TERABIT_STR, Unit.TERABIT_DESC, Unit.TERABIT_ID, Unit.TERABIT_SYN, Unit.TERABIT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.PETABIT_STR, Unit.PETABIT_DESC, Unit.PETABIT_ID, Unit.PETABIT_SYN, Unit.PETABIT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.EXABIT_STR, Unit.EXABIT_DESC, Unit.EXABIT_ID, Unit.EXABIT_SYN, Unit.EXABIT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.ZETTABIT_STR, Unit.ZETTABIT_DESC, Unit.ZETTABIT_ID, Unit.ZETTABIT_SYN, Unit.ZETTABIT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.YOTTABIT_STR, Unit.YOTTABIT_DESC, Unit.YOTTABIT_ID, Unit.YOTTABIT_SYN, Unit.YOTTABIT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.BYTE_STR, Unit.BYTE_DESC, Unit.BYTE_ID, Unit.BYTE_SYN, Unit.BYTE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILOBYTE_STR, Unit.KILOBYTE_DESC, Unit.KILOBYTE_ID, Unit.KILOBYTE_SYN, Unit.KILOBYTE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MEGABYTE_STR, Unit.MEGABYTE_DESC, Unit.MEGABYTE_ID, Unit.MEGABYTE_SYN, Unit.MEGABYTE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.GIGABYTE_STR, Unit.GIGABYTE_DESC, Unit.GIGABYTE_ID, Unit.GIGABYTE_SYN, Unit.GIGABYTE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.TERABYTE_STR, Unit.TERABYTE_DESC, Unit.TERABYTE_ID, Unit.TERABYTE_SYN, Unit.TERABYTE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.PETABYTE_STR, Unit.PETABYTE_DESC, Unit.PETABYTE_ID, Unit.PETABYTE_SYN, Unit.PETABYTE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.EXABYTE_STR, Unit.EXABYTE_DESC, Unit.EXABYTE_ID, Unit.EXABYTE_SYN, Unit.EXABYTE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.ZETTABYTE_STR, Unit.ZETTABYTE_DESC, Unit.ZETTABYTE_ID, Unit.ZETTABYTE_SYN, Unit.ZETTABYTE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.YOTTABYTE_STR, Unit.YOTTABYTE_DESC, Unit.YOTTABYTE_ID, Unit.YOTTABYTE_SYN, Unit.YOTTABYTE_SINCE, Unit.TYPE_ID); /* Units of energy */ addKeyWord(Unit.JOULE_STR, Unit.JOULE_DESC, Unit.JOULE_ID, Unit.JOULE_SYN, Unit.JOULE_SINCE, Unit.TYPE_ID); addKeyWord(Unit.ELECTRONO_VOLT_STR, Unit.ELECTRONO_VOLT_DESC, Unit.ELECTRONO_VOLT_ID, Unit.ELECTRONO_VOLT_SYN, Unit.ELECTRONO_VOLT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILO_ELECTRONO_VOLT_STR, Unit.KILO_ELECTRONO_VOLT_DESC, Unit.KILO_ELECTRONO_VOLT_ID, Unit.KILO_ELECTRONO_VOLT_SYN, Unit.KILO_ELECTRONO_VOLT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MEGA_ELECTRONO_VOLT_STR, Unit.MEGA_ELECTRONO_VOLT_DESC, Unit.MEGA_ELECTRONO_VOLT_ID, Unit.MEGA_ELECTRONO_VOLT_SYN, Unit.MEGA_ELECTRONO_VOLT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.GIGA_ELECTRONO_VOLT_STR, Unit.GIGA_ELECTRONO_VOLT_DESC, Unit.GIGA_ELECTRONO_VOLT_ID, Unit.GIGA_ELECTRONO_VOLT_SYN, Unit.GIGA_ELECTRONO_VOLT_SINCE, Unit.TYPE_ID); addKeyWord(Unit.TERA_ELECTRONO_VOLT_STR, Unit.TERA_ELECTRONO_VOLT_DESC, Unit.TERA_ELECTRONO_VOLT_ID, Unit.TERA_ELECTRONO_VOLT_SYN, Unit.TERA_ELECTRONO_VOLT_SINCE, Unit.TYPE_ID); /* Units of speed */ addKeyWord(Unit.METRE_PER_SECOND_STR, Unit.METRE_PER_SECOND_DESC, Unit.METRE_PER_SECOND_ID, Unit.METRE_PER_SECOND_SYN, Unit.METRE_PER_SECOND_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILOMETRE_PER_HOUR_STR, Unit.KILOMETRE_PER_HOUR_DESC, Unit.KILOMETRE_PER_HOUR_ID, Unit.KILOMETRE_PER_HOUR_SYN, Unit.KILOMETRE_PER_HOUR_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MILE_PER_HOUR_STR, Unit.MILE_PER_HOUR_DESC, Unit.MILE_PER_HOUR_ID, Unit.MILE_PER_HOUR_SYN, Unit.MILE_PER_HOUR_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KNOT_STR, Unit.KNOT_DESC, Unit.KNOT_ID, Unit.KNOT_SYN, Unit.KNOT_SINCE, Unit.TYPE_ID); /* Units of acceleration */ addKeyWord(Unit.METRE_PER_SECOND2_STR, Unit.METRE_PER_SECOND2_DESC, Unit.METRE_PER_SECOND2_ID, Unit.METRE_PER_SECOND2_SYN, Unit.METRE_PER_SECOND2_SINCE, Unit.TYPE_ID); addKeyWord(Unit.KILOMETRE_PER_HOUR2_STR, Unit.KILOMETRE_PER_HOUR2_DESC, Unit.KILOMETRE_PER_HOUR2_ID, Unit.KILOMETRE_PER_HOUR2_SYN, Unit.KILOMETRE_PER_HOUR2_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MILE_PER_HOUR2_STR, Unit.MILE_PER_HOUR2_DESC, Unit.MILE_PER_HOUR2_ID, Unit.MILE_PER_HOUR2_SYN, Unit.MILE_PER_HOUR2_SINCE, Unit.TYPE_ID); /* Units of angle */ addKeyWord(Unit.RADIAN_ARC_STR, Unit.RADIAN_ARC_DESC, Unit.RADIAN_ARC_ID, Unit.RADIAN_ARC_SYN, Unit.RADIAN_ARC_SINCE, Unit.TYPE_ID); addKeyWord(Unit.DEGREE_ARC_STR, Unit.DEGREE_ARC_DESC, Unit.DEGREE_ARC_ID, Unit.DEGREE_ARC_SYN, Unit.DEGREE_ARC_SINCE, Unit.TYPE_ID); addKeyWord(Unit.MINUTE_ARC_STR, Unit.MINUTE_ARC_DESC, Unit.MINUTE_ARC_ID, Unit.MINUTE_ARC_SYN, Unit.MINUTE_ARC_SINCE, Unit.TYPE_ID); addKeyWord(Unit.SECOND_ARC_STR, Unit.SECOND_ARC_DESC, Unit.SECOND_ARC_ID, Unit.SECOND_ARC_SYN, Unit.SECOND_ARC_SINCE, Unit.TYPE_ID); /* User Defined Function specific parser keywords */ if (UDFExpression) addUDFSpecificParserKeyWords(); } /* * Other parser symbols key words */ addKeyWord(ParserSymbol.LEFT_PARENTHESES_STR, ParserSymbol.LEFT_PARENTHESES_DESC, ParserSymbol.LEFT_PARENTHESES_ID, ParserSymbol.LEFT_PARENTHESES_SYN, ParserSymbol.LEFT_PARENTHESES_SINCE, ParserSymbol.TYPE_ID); addKeyWord(ParserSymbol.RIGHT_PARENTHESES_STR, ParserSymbol.RIGHT_PARENTHESES_DESC, ParserSymbol.RIGHT_PARENTHESES_ID, ParserSymbol.RIGHT_PARENTHESES_SYN, ParserSymbol.RIGHT_PARENTHESES_SINCE, ParserSymbol.TYPE_ID); addKeyWord(ParserSymbol.COMMA_STR, ParserSymbol.COMMA_DESC, ParserSymbol.COMMA_ID, ParserSymbol.COMMA_SYN, ParserSymbol.COMMA_SINCE, ParserSymbol.TYPE_ID); addKeyWord(ParserSymbol.SEMI_STR, ParserSymbol.SEMI_DESC, ParserSymbol.COMMA_ID, ParserSymbol.SEMI_SYN, ParserSymbol.COMMA_SINCE, ParserSymbol.TYPE_ID); addKeyWord(ParserSymbol.DECIMAL_REG_EXP, ParserSymbol.NUMBER_REG_DESC, ParserSymbol.NUMBER_ID, ParserSymbol.NUMBER_SYN, ParserSymbol.NUMBER_SINCE, ParserSymbol.NUMBER_TYPE_ID); addKeyWord(ParserSymbol.BLANK_STR, ParserSymbol.BLANK_DESC, ParserSymbol.BLANK_ID, ParserSymbol.BLANK_SYN, ParserSymbol.BLANK_SINCE, ParserSymbol.TYPE_ID); } /** * Adds arguments key words to the keywords list */ private void addArgumentsKeyWords() { int argumentsNumber = argumentsList.size(); for (int argumentIndex = 0; argumentIndex 1) && (i < paramsNum - 1) ) syntax = syntax + ","; } syntax = syntax + ")"; addKeyWord(fun.getFunctionName(), fun.getDescription(), functionIndex, syntax, "", Function.TYPE_ID); } } /** * Adds constants key words to the keywords list */ private void addConstantsKeyWords() { int constantsNumber = constantsList.size(); for (int constantIndex = 0; constantIndex < constantsNumber; constantIndex++) { Constant c = constantsList.get(constantIndex); addKeyWord(c.getConstantName(), c.getDescription(), constantIndex, c.getConstantName(), "", Constant.TYPE_ID); } } /** * Final validation of key words */ private void validateParserKeyWords() { if (mXparser.overrideBuiltinTokens) { /* * Building list of user defined tokens */ List userDefinedTokens = new ArrayList(); for (Argument arg : argumentsList) userDefinedTokens.add( arg.getArgumentName() ); for (Function fun : functionsList) userDefinedTokens.add( fun.getFunctionName() ); for (Constant cons : constantsList) userDefinedTokens.add( cons.getConstantName() ); /* * If no user defined tokens then exit */ if (userDefinedTokens.isEmpty()) return; /* * Building list of built-in tokens to remove */ List keyWordsToOverride = new ArrayList(); for (KeyWord kw : keyWordsList) if (userDefinedTokens.contains(kw.wordString)) keyWordsToOverride.add(kw); /* * If nothing to remove then exit */ if (keyWordsToOverride.isEmpty()) return; /* * Performing final override */ for (KeyWord kw : keyWordsToOverride) keyWordsList.remove(kw); } } /** * Adds key word to the keyWords list * * @param wordString * @param wordDescription * @param wordId * @param wordTypeId */ private void addKeyWord(String wordString, String wordDescription, int wordId, String wordSyntax, String wordSince, int wordTypeId) { if ( (mXparser.tokensToRemove.size() > 0) || (mXparser.tokensToModify.size() > 0) ) if ( (wordTypeId == Function1Arg.TYPE_ID) || (wordTypeId == Function2Arg.TYPE_ID) || (wordTypeId == Function3Arg.TYPE_ID) || (wordTypeId == FunctionVariadic.TYPE_ID) || (wordTypeId == CalculusOperator.TYPE_ID) || (wordTypeId == ConstantValue.TYPE_ID) || (wordTypeId == RandomVariable.TYPE_ID) || (wordTypeId == Unit.TYPE_ID) ) { if (mXparser.tokensToRemove.size() > 0) if (mXparser.tokensToRemove.contains(wordString)) return; if (mXparser.tokensToModify.size() > 0) { for (TokenModification tm : mXparser.tokensToModify) if (tm.currentToken.equals(wordString)) { wordString = tm.newToken; if (tm.newTokenDescription != null) wordDescription = tm.newTokenDescription; wordSyntax = wordSyntax.replace(tm.currentToken, tm.newToken); } } } keyWordsList.add(new KeyWord(wordString, wordDescription, wordId, wordSyntax, wordSince, wordTypeId)); } /** * Checks whether unknown token represents number literal * provided in different numeral base system, where * base is between 1 and 36. * * @param token The token not know to the parser */ private void checkOtherNumberBases(Token token) { int dotPos = 0; int tokenStrLength = token.tokenStr.length(); /* find dot position */ if (tokenStrLength >= 2) { if ( token.tokenStr.charAt(1) == '.' ) dotPos = 1; } if ( (dotPos == 0) && (tokenStrLength >= 3) ) { if ( token.tokenStr.charAt(2) == '.' ) dotPos = 2; } if ( (dotPos == 0) && (tokenStrLength >= 4) ) { if ( token.tokenStr.charAt(3) == '.' ) dotPos = 3; } if (dotPos == 0) return; /* check if there is base indicator */ String baseInd = token.tokenStr.substring(0, dotPos).toLowerCase(); String numberLiteral = ""; if (tokenStrLength > dotPos+1) numberLiteral = token.tokenStr.substring(dotPos+1); int numeralSystemBase = 0; /* evaluate numeral system base */ if ( baseInd.equals("b") ) numeralSystemBase = 2; else if ( baseInd.equals("o") ) numeralSystemBase = 8; else if ( baseInd.equals("h") ) numeralSystemBase = 16; else if ( baseInd.equals("b1") ) numeralSystemBase = 1; else if ( baseInd.equals("b2") ) numeralSystemBase = 2; else if ( baseInd.equals("b3") ) numeralSystemBase = 3; else if ( baseInd.equals("b4") ) numeralSystemBase = 4; else if ( baseInd.equals("b5") ) numeralSystemBase = 5; else if ( baseInd.equals("b6") ) numeralSystemBase = 6; else if ( baseInd.equals("b7") ) numeralSystemBase = 7; else if ( baseInd.equals("b8") ) numeralSystemBase = 8; else if ( baseInd.equals("b9") ) numeralSystemBase = 9; else if ( baseInd.equals("b10") ) numeralSystemBase = 10; else if ( baseInd.equals("b11") ) numeralSystemBase = 11; else if ( baseInd.equals("b12") ) numeralSystemBase = 12; else if ( baseInd.equals("b13") ) numeralSystemBase = 13; else if ( baseInd.equals("b14") ) numeralSystemBase = 14; else if ( baseInd.equals("b15") ) numeralSystemBase = 15; else if ( baseInd.equals("b16") ) numeralSystemBase = 16; else if ( baseInd.equals("b17") ) numeralSystemBase = 17; else if ( baseInd.equals("b18") ) numeralSystemBase = 18; else if ( baseInd.equals("b19") ) numeralSystemBase = 19; else if ( baseInd.equals("b20") ) numeralSystemBase = 20; else if ( baseInd.equals("b21") ) numeralSystemBase = 21; else if ( baseInd.equals("b22") ) numeralSystemBase = 22; else if ( baseInd.equals("b23") ) numeralSystemBase = 23; else if ( baseInd.equals("b24") ) numeralSystemBase = 24; else if ( baseInd.equals("b25") ) numeralSystemBase = 25; else if ( baseInd.equals("b26") ) numeralSystemBase = 26; else if ( baseInd.equals("b27") ) numeralSystemBase = 27; else if ( baseInd.equals("b28") ) numeralSystemBase = 28; else if ( baseInd.equals("b29") ) numeralSystemBase = 29; else if ( baseInd.equals("b30") ) numeralSystemBase = 30; else if ( baseInd.equals("b31") ) numeralSystemBase = 31; else if ( baseInd.equals("b32") ) numeralSystemBase = 32; else if ( baseInd.equals("b33") ) numeralSystemBase = 33; else if ( baseInd.equals("b34") ) numeralSystemBase = 34; else if ( baseInd.equals("b35") ) numeralSystemBase = 35; else if ( baseInd.equals("b36") ) numeralSystemBase = 36; /* if base was found, perform conversion */ if ( (numeralSystemBase > 0) && (numeralSystemBase <= 36) ) { token.tokenTypeId = ParserSymbol.NUMBER_TYPE_ID; token.tokenId = ParserSymbol.NUMBER_ID; token.tokenValue = NumberTheory.convOthBase2Decimal(numberLiteral, numeralSystemBase); } } /** * Checks whether unknown token represents fraction * provided as fraction or mixed fraction * * @param token The token not know to the parser */ private void checkFraction(Token token) { int tokenStrLength = token.tokenStr.length(); if (tokenStrLength < 3) return; if (!mXparser.regexMatch(token.tokenStr, ParserSymbol.FRACTION)) return; int underscore1stPos = token.tokenStr.indexOf('_'); int underscore2ndPos = token.tokenStr.indexOf('_', underscore1stPos + 1); boolean mixedFraction = false; if (underscore2ndPos > 0) mixedFraction = true; double fractionValue; if (mixedFraction) { String wholeStr = token.tokenStr.substring(0, underscore1stPos); String numeratorStr = token.tokenStr.substring(underscore1stPos + 1, underscore2ndPos); String denominatorStr = token.tokenStr.substring(underscore2ndPos + 1); double whole = Double.parseDouble(wholeStr); double numerator = Double.parseDouble(numeratorStr); double denominator = Double.parseDouble(denominatorStr); if (denominator == 0) fractionValue = Double.NaN; else { fractionValue = whole + numerator / denominator; } } else { String numeratorStr = token.tokenStr.substring(0, underscore1stPos); String denominatorStr = token.tokenStr.substring(underscore1stPos + 1); double numerator = Double.parseDouble(numeratorStr); double denominator = Double.parseDouble(denominatorStr); if (denominator == 0) fractionValue = Double.NaN; else { fractionValue = numerator / denominator; } } token.tokenTypeId = ParserSymbol.NUMBER_TYPE_ID; token.tokenId = ParserSymbol.NUMBER_ID; token.tokenValue = fractionValue; } /** * Adds expression token * Method is called by the tokenExpressionString() * while parsing string expression * * @param tokenStr the token string * @param keyWord the key word */ private void addToken(String tokenStr, KeyWord keyWord) { Token token = new Token(); initialTokens.add(token); token.tokenStr = tokenStr; token.keyWord = keyWord.wordString; token.tokenTypeId = keyWord.wordTypeId; token.tokenId = keyWord.wordId; if (token.tokenTypeId == Argument.TYPE_ID) token.tokenValue = argumentsList.get(token.tokenId).argumentValue; else if (token.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) { token.tokenValue = Double.valueOf(token.tokenStr); token.keyWord = ParserSymbol.NUMBER_STR; } else if (token.tokenTypeId == Token.NOT_MATCHED) { checkOtherNumberBases(token); if (token.tokenTypeId == Token.NOT_MATCHED) checkFraction(token); } } private boolean isNotSpecialChar(char c) { if (c == '+') return false; if (c == '-') return false; if (c == '+') return false; if (c == '*') return false; if (c == '/') return false; if (c == '^') return false; if (c == ',') return false; if (c == ';') return false; if (c == '(') return false; if (c == ')') return false; if (c == '|') return false; if (c == '&') return false; if (c == '=') return false; if (c == '>') return false; if (c == '<') return false; if (c == '~') return false; if (c == '\\') return false; if (c == '#') return false; if (c == '@') return false; return true; } /** * Tokenizing expression string */ private void tokenizeExpressionString() { /* * Add parser and argument key words */ keyWordsList = new ArrayList(); addParserKeyWords(); validateParserKeyWords(); if (parserKeyWordsOnly == false) { addArgumentsKeyWords(); addFunctionsKeyWords(); addConstantsKeyWords(); } java.util.Collections.sort(keyWordsList, new DescKwLenComparator()); /* * Evaluate position after sorting for the following keywords types * number * plus operator * minus operator * * Above mentioned information is required * when distinguishing between numbers (regexp) and operators * * For example * * 1-2 : two numbers and one operator, but -2 is also a valid number * (-2)+3 : two number and one operator */ int numberKwId = ConstantValue.NaN; int plusKwId = ConstantValue.NaN; int minusKwId = ConstantValue.NaN; for (int kwId = 0; kwId < keyWordsList.size(); kwId++) { if ( keyWordsList.get(kwId).wordTypeId == ParserSymbol.NUMBER_TYPE_ID) numberKwId = kwId; if ( keyWordsList.get(kwId).wordTypeId == Operator.TYPE_ID) { if (keyWordsList.get(kwId).wordId == Operator.PLUS_ID) plusKwId = kwId; if (keyWordsList.get(kwId).wordId == Operator.MINUS_ID) minusKwId = kwId; } } initialTokens = new ArrayList(); int expLen = expressionString.length(); if (expLen == 0) return; /* * Clearing expression string from spaces */ String newExpressionString = ""; char c; char clag1 = 'a'; int blankCnt = 0; int newExpLen = 0; for (int i = 0; i < expLen; i++) { c = expressionString.charAt(i); if ( (c == ' ') || (c == '\n') || (c == '\r') || (c == '\t') || (c == '\f') ) { blankCnt++; } else if (blankCnt > 0) { if (newExpLen > 0) { if (isNotSpecialChar(clag1)) newExpressionString = newExpressionString + " "; } blankCnt = 0; } if (blankCnt == 0) { newExpressionString = newExpressionString + c; clag1 = c; newExpLen++; } } /* * words list and tokens list */ if (newExpressionString.length() == 0) return; int lastPos = 0; /* position of the key word previously added*/ int pos = 0; /* current position */ String tokenStr = ""; int matchStatusPrev = NOT_FOUND; /* unknown key word (previous) */ int matchStatus = NOT_FOUND; /* unknown key word (current) */ KeyWord kw = null; String sub = ""; String kwStr = ""; char precedingChar; char followingChar; char firstChar; /* * Check all available positions in the expression tokens list */ do { /* * 1st step * * compare with the regExp for real numbers * find the longest word which could be matched * with the given regExp */ int numEnd = -1; /* * Number has to start with digit or dot */ firstChar = newExpressionString.charAt(pos); if ( (firstChar == '+') || (firstChar == '-') || (firstChar == '.') || (firstChar == '0') || (firstChar == '1') || (firstChar == '2') || (firstChar == '3') || (firstChar == '4') || (firstChar == '5') || (firstChar == '6') || (firstChar == '7') || (firstChar == '8') || (firstChar == '9') ) { for (int i = pos; i < newExpressionString.length(); i++) { /* * Escaping if encountering char that can not * be included in number */ if (i > pos) { c = newExpressionString.charAt(i); if ( (c != '+') && (c != '-') && (c != '0') && (c != '1') && (c != '2') && (c != '3') && (c != '4') && (c != '5') && (c != '6') && (c != '7') && (c != '8') && (c != '9') && (c != '.') && (c != 'e') && (c != 'E') ) break; } /* * Checking if substring represents number */ String str = newExpressionString.substring(pos, i+1); if ( mXparser.regexMatch(str, ParserSymbol.DECIMAL_REG_EXP) ) numEnd = i; } } /* * If number was found */ if (numEnd >= 0) if (pos > 0) { precedingChar = newExpressionString.charAt(pos-1); if ( ( precedingChar != ' ' ) && ( precedingChar != ',' ) && ( precedingChar != ';' ) && ( precedingChar != '|' ) && ( precedingChar != '&' ) && ( precedingChar != '+' ) && ( precedingChar != '-' ) && ( precedingChar != '*' ) && ( precedingChar != '\\' ) && ( precedingChar != '/' ) && ( precedingChar != '(' ) && ( precedingChar != ')' ) && ( precedingChar != '=' ) && ( precedingChar != '>' ) && ( precedingChar != '<' ) && ( precedingChar != '~' ) && ( precedingChar != '^' ) && ( precedingChar != '#' ) && ( precedingChar != '%' ) && ( precedingChar != '@' ) && ( precedingChar != '!' ) ) numEnd = -1; } if (numEnd >= 0) if (numEnd < newExpressionString.length()-1) { followingChar = newExpressionString.charAt(numEnd+1); if ( ( followingChar != ' ' ) && ( followingChar != ',' ) && ( followingChar != ';' ) && ( followingChar != '|' ) && ( followingChar != '&' ) && ( followingChar != '+' ) && ( followingChar != '-' ) && ( followingChar != '*' ) && ( followingChar != '\\' ) && ( followingChar != '/' ) && ( followingChar != '(' ) && ( followingChar != ')' ) && ( followingChar != '=' ) && ( followingChar != '>' ) && ( followingChar != '<' ) && ( followingChar != '~' ) && ( followingChar != '^' ) && ( followingChar != '#' ) && ( followingChar != '%' ) && ( followingChar != '@' ) && ( followingChar != '!' ) ) numEnd = -1; } if (numEnd >= 0) { /* * If preceding word was unknown * * For example: * 'abc-2' * * number starts with '-', preceding word 'abc' * is not known by the parser */ if ( (matchStatusPrev == NOT_FOUND) && (pos > 0) ) { /* * add preceding word to the list of tokens * as unknown key word word */ tokenStr = newExpressionString.substring(lastPos, pos); addToken(tokenStr, new KeyWord()); } /* * Check leading operators ('-' or '+') * * For example: * '2-1' : 1(num) -(op) 2(num) = 1(num) * -1+2 : -1(num) +(op) 2(num) = 1(num) */ firstChar = newExpressionString.charAt(pos); boolean leadingOp = true; if ( (firstChar == '-') || (firstChar == '+') ) { if (initialTokens.size() > 0) { Token lastToken = initialTokens.get(initialTokens.size()-1); if ( ((lastToken.tokenTypeId == Operator.TYPE_ID) && (lastToken.tokenId != Operator.FACT_ID) && (lastToken.tokenId != Operator.PERC_ID)) || (lastToken.tokenTypeId == BinaryRelation.TYPE_ID) || (lastToken.tokenTypeId == BooleanOperator.TYPE_ID) || (lastToken.tokenTypeId == BitwiseOperator.TYPE_ID) || ((lastToken.tokenTypeId == ParserSymbol.TYPE_ID) && (lastToken.tokenId == ParserSymbol.LEFT_PARENTHESES_ID) )) leadingOp = false; else leadingOp = true; } else leadingOp = false; } else leadingOp = false; /* * If leading operator was found */ if (leadingOp == true) { /* * Add leading operator to the tokens list */ if (firstChar == '-') addToken("-", keyWordsList.get(minusKwId)); if (firstChar == '+') addToken("+", keyWordsList.get(plusKwId)); pos++; } /* * Add found number to the tokens list */ tokenStr = newExpressionString.substring(pos, numEnd+1); addToken(tokenStr, keyWordsList.get(numberKwId)); /* * change current position (just after the number ends) */ pos = numEnd+1; lastPos = pos; /* * Mark match status indicators */ matchStatus = FOUND; matchStatusPrev = FOUND; } else { /* * If there is no number which starts with current position * Check for known key words */ int kwId = -1; matchStatus = NOT_FOUND; do { kwId++; kw = keyWordsList.get(kwId); kwStr = kw.wordString; if (pos + kwStr.length() <= newExpressionString.length()) { sub = newExpressionString.substring(pos, pos + kwStr.length() ); if (sub.equals(kwStr)) matchStatus = FOUND; /* * If key word is known by the parser */ if (matchStatus == FOUND) { /* * If key word is in the form of identifier * then check preceding and following characters */ if ( (kw.wordTypeId == Argument.TYPE_ID) || (kw.wordTypeId == RecursiveArgument.TYPE_ID_RECURSIVE) || (kw.wordTypeId == Function1Arg.TYPE_ID) || (kw.wordTypeId == Function2Arg.TYPE_ID) || (kw.wordTypeId == Function3Arg.TYPE_ID) || (kw.wordTypeId == FunctionVariadic.TYPE_ID) || (kw.wordTypeId == ConstantValue.TYPE_ID) || (kw.wordTypeId == Constant.TYPE_ID) || (kw.wordTypeId == RandomVariable.TYPE_ID) || (kw.wordTypeId == Unit.TYPE_ID) || (kw.wordTypeId == Function.TYPE_ID) || (kw.wordTypeId == CalculusOperator.TYPE_ID) ) { /* * Checking preceding character */ if (pos > 0) { precedingChar = newExpressionString.charAt(pos-1); if ( ( precedingChar != ' ' ) && ( precedingChar != ',' ) && ( precedingChar != ';' ) && ( precedingChar != '|' ) && ( precedingChar != '&' ) && ( precedingChar != '+' ) && ( precedingChar != '-' ) && ( precedingChar != '*' ) && ( precedingChar != '\\' ) && ( precedingChar != '/' ) && ( precedingChar != '(' ) && ( precedingChar != ')' ) && ( precedingChar != '=' ) && ( precedingChar != '>' ) && ( precedingChar != '<' ) && ( precedingChar != '~' ) && ( precedingChar != '^' ) && ( precedingChar != '#' ) && ( precedingChar != '%' ) && ( precedingChar != '@' ) && ( precedingChar != '!' ) ) matchStatus = NOT_FOUND; } /* * Checking following character */ if ( (matchStatus == FOUND) && ( pos + kwStr.length() < newExpressionString.length() ) ) { followingChar = newExpressionString.charAt(pos + kwStr.length()); if ( ( followingChar != ' ' ) && ( followingChar != ',' ) && ( followingChar != ';' ) && ( followingChar != '|' ) && ( followingChar != '&' ) && ( followingChar != '+' ) && ( followingChar != '-' ) && ( followingChar != '*' ) && ( followingChar != '\\' ) && ( followingChar != '/' ) && ( followingChar != '(' ) && ( followingChar != ')' ) && ( followingChar != '=' ) && ( followingChar != '>' ) && ( followingChar != '<' ) && ( followingChar != '~' ) && ( followingChar != '^' ) && ( followingChar != '#' ) && ( followingChar != '%' ) && ( followingChar != '@' ) && ( followingChar != '!' ) ) matchStatus = NOT_FOUND; } } } } } while ( (kwId < keyWordsList.size()-1) && (matchStatus == NOT_FOUND) ); /* * If key word known by the parser was found */ if (matchStatus == FOUND) { /* * if preceding word was not known by the parser */ if ( (matchStatusPrev == NOT_FOUND) && (pos > 0) ) { /* * Add preceding word to the tokens list * as unknown key word */ tokenStr = newExpressionString.substring(lastPos, pos); addToken(tokenStr, new KeyWord()); } matchStatusPrev = FOUND; /* * Add current (known by the parser) * key word to the tokens list */ tokenStr = newExpressionString.substring(pos, pos+kwStr.length()); if ( !( (kw.wordTypeId == ParserSymbol.TYPE_ID) && (kw.wordId == ParserSymbol.BLANK_ID) ) ) addToken(tokenStr, kw); /* * Remember position where last added word ends + 1 */ lastPos = pos+kwStr.length(); /* * Change current position; */ pos = pos + kwStr.length(); } else { /* * Update preceding word indicator */ matchStatusPrev = NOT_FOUND; /* * Increment position if possible */ if (pos < newExpressionString.length()) pos++; } } /* * while there is still something to analyse */ } while (pos < newExpressionString.length()); /* * If key word was not known by the parser * and end with the string end * it needs to be added to the tokens list * as unknown key word */ if (matchStatus == NOT_FOUND) { tokenStr = newExpressionString.substring(lastPos, pos); addToken(tokenStr, new KeyWord()); } /* * Evaluate tokens levels * * token level identifies the sequance of parsing */ evaluateTokensLevels(); } /** * Evaluates tokens levels */ private void evaluateTokensLevels() { int tokenLevel = 0; Stack tokenStack = new Stack(); boolean precedingFunction = false; if (initialTokens.size() > 0) for (int tokenIndex = 0; tokenIndex < initialTokens.size(); tokenIndex++) { Token token = initialTokens.get(tokenIndex); if ( ( token.tokenTypeId == Function1Arg.TYPE_ID ) || ( token.tokenTypeId == Function2Arg.TYPE_ID ) || ( token.tokenTypeId == Function3Arg.TYPE_ID ) || ( token.tokenTypeId == Function.TYPE_ID ) || ( token.tokenTypeId == CalculusOperator.TYPE_ID ) || ( token.tokenTypeId == RecursiveArgument.TYPE_ID_RECURSIVE ) || ( token.tokenTypeId == FunctionVariadic.TYPE_ID ) ) { tokenLevel++; precedingFunction = true; } else if ((token.tokenTypeId == ParserSymbol.TYPE_ID) && (token.tokenId == ParserSymbol.LEFT_PARENTHESES_ID)) { tokenLevel++; TokenStackElement stackEl = new TokenStackElement(); stackEl.tokenId = token.tokenId; stackEl.tokenIndex = tokenIndex; stackEl.tokenLevel = tokenLevel; stackEl.tokenTypeId = token.tokenTypeId; stackEl.precedingFunction = precedingFunction; tokenStack.push(stackEl); precedingFunction = false; } else precedingFunction = false; token.tokenLevel = tokenLevel; if ((token.tokenTypeId == ParserSymbol.TYPE_ID) && (token.tokenId == ParserSymbol.RIGHT_PARENTHESES_ID)) { tokenLevel--; if (!tokenStack.isEmpty()) { TokenStackElement stackEl = tokenStack.pop(); if (stackEl.precedingFunction == true) tokenLevel--; } } } } /** * copy initial tokens lito to tokens list */ private void copyInitialTokens() { tokensList = new ArrayList(); for (Token token : initialTokens) { tokensList.add(token.clone()); } } private final String FUNCTION = "function"; private final String ARGUMENT = "argument"; private final String UNITCONST = "unit/const"; private final String ERROR = "error"; /** * Tokenizes expression string and returns tokens list, * including: string, type, level. * * @return Copy of initial tokens. * * @see Token * @see mXparser#consolePrintTokens(List) */ public List getCopyOfInitialTokens() { List tokensListCopy = new ArrayList(); if (expressionString.length() == 0) return tokensListCopy; tokenizeExpressionString(); if (initialTokens.size() == 0) return tokensListCopy; Token token; for (int i = 0; i < initialTokens.size(); i++) { token = initialTokens.get(i); if (token.tokenTypeId == Token.NOT_MATCHED) { if (mXparser.regexMatch(token.tokenStr, ParserSymbol.unitOnlyTokenRegExp)) { token.looksLike = UNITCONST; } else if (mXparser.regexMatch(token.tokenStr, ParserSymbol.nameOnlyTokenRegExp)) { token.looksLike = ARGUMENT; if (i < initialTokens.size()-1) { Token tokenNext = initialTokens.get(i+1); if ( (tokenNext.tokenTypeId == ParserSymbol.TYPE_ID) && (tokenNext.tokenId == ParserSymbol.LEFT_PARENTHESES_ID) ) token.looksLike = FUNCTION; } } else { token.looksLike = ERROR; } } tokensListCopy.add(token.clone()); } return tokensListCopy; } /** * Returns missing user defined arguments names, i.e. * sin(x) + cos(y) where x and y are not defined * function will return x and y. * * @return Array of missing user defined arguments names * - distinct strings. */ public String[] getMissingUserDefinedArguments() { List tokens = getCopyOfInitialTokens(); List missingArguments = new ArrayList(); for (Token t : tokens) if ( t.looksLike.equals(ARGUMENT) ) if ( !missingArguments.contains(t.tokenStr) ) missingArguments.add(t.tokenStr); int n = missingArguments.size(); String[] missArgs = new String[n]; for (int i = 0; i < n; i++) missArgs[i] = missingArguments.get(i); return missArgs; } /** * Returns missing user defined units names, i.e. * 2*[w] + [q] where [w] and [q] are not defined * function will return [w] and [q]. * * @return Array of missing user defined units names * - distinct strings. */ public String[] getMissingUserDefinedUnits() { List tokens = getCopyOfInitialTokens(); List missingUnits = new ArrayList(); for (Token t : tokens) if ( t.looksLike.equals(UNITCONST) ) if ( !missingUnits.contains(t.tokenStr) ) missingUnits.add(t.tokenStr); int n = missingUnits.size(); String[] missUnits = new String[n]; for (int i = 0; i < n; i++) missUnits[i] = missingUnits.get(i); return missUnits; } /** * Returns missing user defined functions names, i.e. * sin(x) + fun(x,y) where fun is not defined * function will return fun. * * @return Array of missing user defined functions names * - distinct strings. */ public String[] getMissingUserDefinedFunctions() { List tokens = getCopyOfInitialTokens(); List missingFunctions = new ArrayList(); for (Token t : tokens) if ( t.looksLike.equals(FUNCTION) ) if ( !missingFunctions.contains(t.tokenStr) ) missingFunctions.add(t.tokenStr); int n = missingFunctions.size(); String[] missFun = new String[n]; for (int i = 0; i < n; i++) missFun[i] = missingFunctions.get(i); return missFun; } /** * Gets initial tokens and returns copied list * * @see Function */ List getInitialTokens() { return initialTokens; } /* * Text adjusting. */ private static final String getLeftSpaces(String maxStr, String str) { String spc = ""; for (int i=0; i "); for (int i=lPos; i<=rPos; i++) { Token token = tokensList.get(i); if (token.tokenTypeId == ParserSymbol.NUMBER_TYPE_ID) mXparser.consolePrint(token.tokenValue + " "); else mXparser.consolePrint(token.tokenStr + " "); } mXparser.consolePrint(" ... "); } /** * shows known keywords */ void showKeyWords() { int keyWordsNumber = keyWordsList.size(); String maxStr = "KEY_WORD"; mXparser.consolePrintln("KEY WORDS:"); mXparser.consolePrintln(" -------------------------------------------"); mXparser.consolePrintln("| IDX | KEY_WORD | ID | TYPE_ID |"); mXparser.consolePrintln(" -------------------------------------------"); for (int keyWordIndex=0; keyWordIndex(); String helpStr = "Help content: \n\n"; addParserKeyWords(); validateParserKeyWords(); if (parserKeyWordsOnly == false) { addArgumentsKeyWords(); addFunctionsKeyWords(); addConstantsKeyWords(); } helpStr = helpStr + getLeftSpaces("12345","#") + " " + getRightSpaces("01234567890123456789", "key word") + getRightSpaces(" ","type") + getRightSpaces("0123456789012345678901234567890123456789012345", "syntax") + getRightSpaces("012345", "since") + "description" + "\n"; helpStr = helpStr + getLeftSpaces("12345","-") + " " + getRightSpaces("01234567890123456789", "--------") + getRightSpaces(" ","----") + getRightSpaces("0123456789012345678901234567890123456789012345", "------") + getRightSpaces("012345", "-----") + "-----------" + "\n"; java.util.Collections.sort(keyWordsList, new KwTypeComparator() ); int keyWordsNumber = keyWordsList.size(); String type, kw; String line; for (int keyWordIndex=0; keyWordIndex") + getRightSpaces("0123456789012345678901234567890123456789012345", keyWord.syntax) + getRightSpaces("012345", keyWord.since) + keyWord.description + "\n"; if ( (line.toLowerCase().indexOf(word.toLowerCase()) >= 0) ){ helpStr = helpStr + line; } } return helpStr; } /** * Returns list of key words known to the parser * * @return List of keywords known to the parser. * * @see KeyWord * @see KeyWord#wordTypeId * @see Expression#getHelp() */ public List getKeyWords() { return getKeyWords(""); } /** * Returns list of key words known to the parser * * @param query Give any string to filter list of key words against this string. * User more precise syntax: str=tokenString, desc=tokenDescription, * syn=TokenSyntax, sin=tokenSince, wid=wordId, tid=wordTypeId * to narrow the result. * * @return List of keywords known to the parser filter against query string. * * @see KeyWord * @see KeyWord#wordTypeId * @see Expression#getHelp(String) */ public List getKeyWords(String query) { keyWordsList = new ArrayList(); List kwyWordsToReturn = new ArrayList(); addParserKeyWords(); validateParserKeyWords(); if (parserKeyWordsOnly == false) { addArgumentsKeyWords(); addFunctionsKeyWords(); addConstantsKeyWords(); } java.util.Collections.sort(keyWordsList, new KwTypeComparator() ); String line; for (KeyWord kw : keyWordsList) { line = "str=" + kw.wordString + " " + "desc=" + kw.description + " " + "syn=" + kw.syntax + " " + "sin=" + kw.since + " " + "wid=" + kw.wordId + " " + "tid=" + kw.wordTypeId ; if ( (line.toLowerCase().indexOf(query.toLowerCase()) >= 0) ) kwyWordsToReturn.add(kw); } return kwyWordsToReturn; } /* * shows tokens */ void showTokens() { showTokens(tokensList); } /* * show tokens */ static final void showTokens(List tokensList) { String maxStr = "TokenTypeId"; mXparser.consolePrintln(" --------------------"); mXparser.consolePrintln("| Expression tokens: |"); mXparser.consolePrintln(" ---------------------------------------------------------------------------------------------------------------"); mXparser.consolePrintln("| TokenIdx | Token | KeyW | TokenId | TokenTypeId | TokenLevel | TokenValue | LooksLike |"); mXparser.consolePrintln(" ---------------------------------------------------------------------------------------------------------------"); if (tokensList == null) { mXparser.consolePrintln("NULL tokens list"); return; } int tokensNumber = tokensList.size(); for (int tokenIndex=0; tokenIndex < tokensNumber; tokenIndex++){ String tokenIndexStr = getLeftSpaces(maxStr, Integer.toString(tokenIndex) ); String tokenStr = getLeftSpaces(maxStr, tokensList.get(tokenIndex).tokenStr ); String keyWordStr = getLeftSpaces(maxStr, tokensList.get(tokenIndex).keyWord ); String tokenIdStr = getLeftSpaces(maxStr, Integer.toString(tokensList.get(tokenIndex).tokenId) ); String tokenTypeIdStr = getLeftSpaces(maxStr, Integer.toString(tokensList.get(tokenIndex).tokenTypeId) ); String tokenLevelStr = getLeftSpaces(maxStr, Integer.toString(tokensList.get(tokenIndex).tokenLevel) ); String tokenValueStr = getLeftSpaces(maxStr, Double.toString(tokensList.get(tokenIndex).tokenValue) ); String tokenLooksLikeStr = getLeftSpaces(maxStr, tokensList.get(tokenIndex).looksLike ); mXparser.consolePrintln( "| " + tokenIndexStr + " | " + tokenStr + " | " + keyWordStr + " | " + tokenIdStr + " | " + tokenTypeIdStr + " | " + tokenLevelStr + " | " + tokenValueStr + " | " + tokenLooksLikeStr + " |"); } mXparser.consolePrintln(" ---------------------------------------------------------------------------------------------------------------"); } /** * shows initial tokens */ void showInitialTokens() { showTokens(initialTokens); } /* * show arguments */ private void showArguments() { for (Argument a : argumentsList) { boolean vMode = a.getVerboseMode(); a.setSilentMode(); printSystemInfo(a.getArgumentName() + " = " + a.getArgumentValue() + "\n", WITH_EXP_STR); if (vMode == true) a.setVerboseMode(); } } /** * * @param info * @param withExpressionString */ private void printSystemInfo(String info, boolean withExpressionString) { if (withExpressionString) mXparser.consolePrint( /*"[" + this + "]" + */ "[" + description + "]" + "[" + expressionString + "] " + info); else mXparser.consolePrint(/*"[" + this + "]" + */ info); } /** * Expression cloning. */ @Override protected Expression clone() { Expression newExp = new Expression(this); if ( (initialTokens != null) && (initialTokens.size() > 0) ) newExp.initialTokens = createInitialTokens(0, initialTokens.size()-1, initialTokens); return newExp; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy