Skip to content

Commit

Permalink
Fixed: checkSyntax does not works fully correctly with implied multip…
Browse files Browse the repository at this point in the history
…lication expression string, but disabled implied multiplication option #259
  • Loading branch information
mariuszgromada committed May 20, 2022
1 parent 196c454 commit 3fa6e9d
Show file tree
Hide file tree
Showing 8 changed files with 264 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ namespace org.mariuszgromada.math.mxparser {
* <a href="https://play.google.com/store/apps/details?id=org.mathparser.scalar.pro" target="_blank">Scalar Pro</a><br>
* <a href="https://mathspace.pl" target="_blank">MathSpace.pl</a><br>
*
* @version 5.0.0
* @version 5.0.3
*
* @see RecursiveArgument
* @see Expression
Expand Down
106 changes: 69 additions & 37 deletions CURRENT/c-sharp/src/org/mariuszgromada/math/mxparser/Expression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ namespace org.mariuszgromada.math.mxparser {
* <a href="https://play.google.com/store/apps/details?id=org.mathparser.scalar.pro" target="_blank">Scalar Pro</a><br>
* <a href="https://mathspace.pl" target="_blank">MathSpace.pl</a><br>
*
* @version 5.0.2
* @version 5.0.3
*
* @see Argument
* @see RecursiveArgument
Expand Down Expand Up @@ -337,6 +337,11 @@ public class Expression : PrimitiveElement {
* Implied multiplication mode
*/
private bool impliedMultiplicationMode = mXparser.impliedMultiplicationMode;
/**
* Fires an error when impliedMultiplicationMode is on
* and there is a missing multiplication operator
*/
private bool impliedMultiplicationError = false;
/**
* Internal parameter for calculus expressions
* to avoid decrease in accuracy.
Expand Down Expand Up @@ -5313,6 +5318,10 @@ private bool checkSyntax(String level, bool functionWithBodyExt) {
* IF there are no lex error
*/
tokenizeExpressionString();
if (!impliedMultiplicationMode && impliedMultiplicationError) {
syntax = SYNTAX_ERROR_OR_STATUS_UNKNOWN;
errorMessage = errorMessage + level + "Multiplication operator missing - try Implied Multiplication Mode." + "\n";
}
/*
* Duplicated tokens?
*/
Expand Down Expand Up @@ -7467,76 +7476,98 @@ private void initialTokensAdd(Token token) {
return;
}
/* Start: Implied Multiplication related part*/
if (impliedMultiplicationMode) {
Token precedingToken = initialTokens[initialTokens.Count - 1];
if (token.isSpecialTokenName()) {
/* Special constant case [...]
* Excluding: '([a]', ';[a]', ',[a]', '+[a]', ....
*/
if (!precedingToken.isLeftParenthesis() &&
!precedingToken.isBinaryOperator() &&
!precedingToken.isParameterSeparator() &&
!precedingToken.isUnaryLeftOperator()) {
Token precedingToken = initialTokens[initialTokens.Count - 1];
if (token.isSpecialTokenName()) {
/* Special constant case [...]
* Excluding: '([a]', ';[a]', ',[a]', '+[a]', ....
*/
if (!precedingToken.isLeftParenthesis() &&
!precedingToken.isBinaryOperator() &&
!precedingToken.isParameterSeparator() &&
!precedingToken.isUnaryLeftOperator()) {
if (impliedMultiplicationMode) {
initialTokens.Add(Token.makeMultiplyToken());
initialTokens.Add(token);
return;
}
else impliedMultiplicationError = true;
}
else if (precedingToken.isSpecialTokenName()) {
if (!token.isRightParenthesis() &&
!token.isBinaryOperator() &&
!token.isParameterSeparator() &&
!token.isUnaryRightOperator()) {
}
else if (precedingToken.isSpecialTokenName()) {
if (!token.isRightParenthesis() &&
!token.isBinaryOperator() &&
!token.isParameterSeparator() &&
!token.isUnaryRightOperator()) {
if (impliedMultiplicationMode) {
initialTokens.Add(Token.makeMultiplyToken());
initialTokens.Add(token);
return;
}
else impliedMultiplicationError = true;
}
else if (token.isLeftParenthesis()) {
// ')(' case
if (precedingToken.isRightParenthesis()) {
}
else if (token.isLeftParenthesis()) {
// ')(' case
if (precedingToken.isRightParenthesis()) {
if (impliedMultiplicationMode) {
initialTokens.Add(Token.makeMultiplyToken());
initialTokens.Add(token);
return;
}
// '2(' case
if (precedingToken.isNumber()) {
else impliedMultiplicationError = true;
}
// '2(' case
if (precedingToken.isNumber()) {
if (impliedMultiplicationMode) {
initialTokens.Add(Token.makeMultiplyToken());
initialTokens.Add(token);
return;
}
// 'e(', 'pi(' cases
if (precedingToken.isIdentifier()) {
else impliedMultiplicationError = true;
}
// 'e(', 'pi(' cases
if (precedingToken.isIdentifier()) {
if (impliedMultiplicationMode) {
initialTokens.Add(Token.makeMultiplyToken());
initialTokens.Add(token);
return;
}
} else if (precedingToken.isRightParenthesis()) {
// ')2', ')h.1212', ')1_2_3' cases
if (token.isNumber()) {
else impliedMultiplicationError = true;
}
} else if (precedingToken.isRightParenthesis()) {
// ')2', ')h.1212', ')1_2_3' cases
if (token.isNumber()) {
if (impliedMultiplicationMode) {
initialTokens.Add(Token.makeMultiplyToken());
initialTokens.Add(token);
return;
}
// ')x', ')sin(x)', ')[sdf]' cases
if (!token.isParameterSeparator() &&
!token.isBinaryOperator() &&
!token.isUnaryRightOperator() &&
!token.isRightParenthesis()) {
else impliedMultiplicationError = true;
}
// ')x', ')sin(x)', ')[sdf]' cases
if (!token.isParameterSeparator() &&
!token.isBinaryOperator() &&
!token.isUnaryRightOperator() &&
!token.isRightParenthesis()) {
if (impliedMultiplicationMode) {
initialTokens.Add(Token.makeMultiplyToken());
initialTokens.Add(token);
return;
}
} else if (token.isUnicodeRootOperator()) {
/* Unicode root operator */
if (!precedingToken.isLeftParenthesis() &&
!precedingToken.isBinaryOperator() &&
!precedingToken.isParameterSeparator() &&
!precedingToken.isUnaryLeftOperator()) {
else impliedMultiplicationError = true;
}
} else if (token.isUnicodeRootOperator()) {
/* Unicode root operator */
if (!precedingToken.isLeftParenthesis() &&
!precedingToken.isBinaryOperator() &&
!precedingToken.isParameterSeparator() &&
!precedingToken.isUnaryLeftOperator()) {
if (impliedMultiplicationMode) {
initialTokens.Add(Token.makeMultiplyToken());
initialTokens.Add(token);
return;
}
else impliedMultiplicationError = true;
}
}
/* End: Implied Multiplication related part*/
Expand Down Expand Up @@ -7989,6 +8020,7 @@ private static bool isBlankChar(char c) {
* Tokenizing expressiong string
*/
private void tokenizeExpressionString() {
impliedMultiplicationError = false;
/*
* Add parser and argument key words
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ namespace org.mariuszgromada.math.mxparser {
* <a href="https://play.google.com/store/apps/details?id=org.mathparser.scalar.pro" target="_blank">Scalar Pro</a><br>
* <a href="https://mathspace.pl" target="_blank">MathSpace.pl</a><br>
*
* @version 5.0.0
* @version 5.0.3
*
* @see RecursiveArgument
* @see Expression
Expand Down
62 changes: 61 additions & 1 deletion CURRENT/c-sharp/tests-and-release/4-Unit-Tests/SyntaxTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ namespace org.mariuszgromada.math.mxparser.test {
* <a href="https://play.google.com/store/apps/details?id=org.mathparser.scalar.pro" target="_blank">Scalar Pro</a><br>
* <a href="https://mathspace.pl" target="_blank">MathSpace.pl</a><br>
*
* @version 5.0.0
* @version 5.0.3
*
*/
[TestClass]
Expand Down Expand Up @@ -4673,5 +4673,65 @@ public void testSyn0304() {
TestCommonTools.consolePrintTestSynEnd(syn, reg, testResult, e);
Assert.IsTrue(testResult);
}
[TestMethod]
public void testSyn0305() {
TestCommonTools.testSynSettingsInit();
bool testResult = false;
String expStr = "2pi+3e";
TestCommonTools.consolePrintTestSynStart(305, expStr);
Expression e = new Expression(expStr);
e.enableImpliedMultiplicationMode();
bool syn = e.checkSyntax();
bool reg = true;
if (syn == reg)
testResult = true;
TestCommonTools.consolePrintTestSynEnd(syn, reg, testResult, e);
Assert.IsTrue(testResult);
}
[TestMethod]
public void testSyn0306() {
TestCommonTools.testSynSettingsInit();
bool testResult = false;
String expStr = "2pi+3e";
TestCommonTools.consolePrintTestSynStart(306, expStr);
Expression e = new Expression(expStr);
e.disableImpliedMultiplicationMode();
bool syn = e.checkSyntax();
bool reg = false;
if (syn == reg)
testResult = true;
TestCommonTools.consolePrintTestSynEnd(syn, reg, testResult, e);
Assert.IsTrue(testResult);
}
[TestMethod]
public void testSyn0307() {
TestCommonTools.testSynSettingsInit();
bool testResult = false;
String expStr = "2(3+4)5";
TestCommonTools.consolePrintTestSynStart(307, expStr);
Expression e = new Expression(expStr);
e.enableImpliedMultiplicationMode();
bool syn = e.checkSyntax();
bool reg = true;
if (syn == reg)
testResult = true;
TestCommonTools.consolePrintTestSynEnd(syn, reg, testResult, e);
Assert.IsTrue(testResult);
}
[TestMethod]
public void testSyn0308() {
TestCommonTools.testSynSettingsInit();
bool testResult = false;
String expStr = "2(3+4)5";
TestCommonTools.consolePrintTestSynStart(308, expStr);
Expression e = new Expression(expStr);
e.disableImpliedMultiplicationMode();
bool syn = e.checkSyntax();
bool reg = false;
if (syn == reg)
testResult = true;
TestCommonTools.consolePrintTestSynEnd(syn, reg, testResult, e);
Assert.IsTrue(testResult);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@
* <a href="https://play.google.com/store/apps/details?id=org.mathparser.scalar.pro" target="_blank">Scalar Pro</a><br>
* <a href="https://mathspace.pl" target="_blank">MathSpace.pl</a><br>
*
* @version 5.0.0
* @version 5.0.3
*
* @see RecursiveArgument
* @see Expression
Expand Down
Loading

0 comments on commit 3fa6e9d

Please sign in to comment.