From dd3ec71c34e3088807f3fdae6be1020a7abc3a3b Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Tue, 3 Jan 2017 11:08:29 +0200 Subject: [PATCH] Original muparser doesn't support thousand separator for C locale because by default used ',' as group separator. In contrary we use ';' as gorup separator and should support C locale thousand separator ','. --HG-- branch : develop --- src/libs/qmuparser/qmuparsererror.h | 4 +- src/libs/qmuparser/qmuparsertest.cpp | 235 ++++++++++---------- src/libs/qmuparser/qmuparsertokenreader.cpp | 2 +- 3 files changed, 122 insertions(+), 119 deletions(-) diff --git a/src/libs/qmuparser/qmuparsererror.h b/src/libs/qmuparser/qmuparsererror.h index 98e4f22fa..460cda689 100644 --- a/src/libs/qmuparser/qmuparsererror.h +++ b/src/libs/qmuparser/qmuparsererror.h @@ -50,7 +50,7 @@ enum EErrorCodes ecUNEXPECTED_OPERATOR = 0, ///< Unexpected binary operator found ecUNASSIGNABLE_TOKEN = 1, ///< Token cant be identified. ecUNEXPECTED_EOF = 2, ///< Unexpected end of formula. (Example: "2+sin(") - ecUNEXPECTED_ARG_SEP = 3, ///< An unexpected comma has been found. (Example: "1,23") + ecUNEXPECTED_ARG_SEP = 3, ///< An unexpected semicolon has been found. (Example: "1;23") ecUNEXPECTED_ARG = 4, ///< An unexpected argument has been found ecUNEXPECTED_VAL = 5, ///< An unexpected value token has been found ecUNEXPECTED_VAR = 6, ///< An unexpected variable token has been found @@ -62,7 +62,7 @@ enum EErrorCodes ecUNEXPECTED_FUN = 12, ///< Unexpected function found. (Example: "sin(8)cos(9)") ecUNTERMINATED_STRING = 13, ///< unterminated string constant. (Example: "3*valueof("hello)") ecTOO_MANY_PARAMS = 14, ///< Too many function parameters - ecTOO_FEW_PARAMS = 15, ///< Too few function parameters. (Example: "ite(1<2,2)") + ecTOO_FEW_PARAMS = 15, ///< Too few function parameters. (Example: "ite(1<2;2)") ecOPRT_TYPE_CONFLICT = 16, ///< binary operators may only be applied to value items of the same type ecSTR_RESULT = 17, ///< result is a string diff --git a/src/libs/qmuparser/qmuparsertest.cpp b/src/libs/qmuparser/qmuparsertest.cpp index e20d56c6f..b17b727a5 100644 --- a/src/libs/qmuparser/qmuparsertest.cpp +++ b/src/libs/qmuparser/qmuparsertest.cpp @@ -162,8 +162,8 @@ int QmuParserTester::TestStrArg() iStat += EqnTest ( "a-(atof(\"10\")*b)", -19, true ); // string + numeric arguments iStat += EqnTest ( "strfun1(\"100\")", 100, true ); - iStat += EqnTest ( "strfun2(\"100\",1)", 101, true ); - iStat += EqnTest ( "strfun3(\"99\",1,2)", 102, true ); + iStat += EqnTest ( "strfun2(\"100\";1)", 101, true ); + iStat += EqnTest ( "strfun3(\"99\";1;2)", 102, true ); if ( iStat == 0 ) { @@ -197,8 +197,8 @@ int QmuParserTester::TestBulkMode() EQN_TEST_BULK("a", 1, 1, 1, 1, false) EQN_TEST_BULK("a", 1, 2, 3, 4, true) EQN_TEST_BULK("b=a", 1, 2, 3, 4, true) - EQN_TEST_BULK("b=a, b*10", 10, 20, 30, 40, true) - EQN_TEST_BULK("b=a, b*10, a", 1, 2, 3, 4, true) + EQN_TEST_BULK("b=a; b*10", 10, 20, 30, 40, true) + EQN_TEST_BULK("b=a; b*10; a", 1, 2, 3, 4, true) EQN_TEST_BULK("a+b", 3, 4, 5, 6, true) EQN_TEST_BULK("c*(a+b)", 9, 12, 15, 18, true) #undef EQN_TEST_BULK @@ -262,7 +262,7 @@ int QmuParserTester::TestBinOprt() iStat += EqnTest ( "2*(a=b)", 4, true ); iStat += EqnTest ( "2*(a=b+1)", 6, true ); iStat += EqnTest ( "(a=b+1)*2", 6, true ); - iStat += EqnTest ( "a=c, a*10", 30, true); + iStat += EqnTest ( "a=c; a*10", 30, true); iStat += EqnTest ( "2^2^3", 256, true ); iStat += EqnTest ( "1/2/3", 1.0 / 6.0, true ); @@ -401,11 +401,11 @@ int QmuParserTester::TestSyntax() int iStat = 0; qWarning() << "testing syntax engine..."; - iStat += ThrowTest ( "1,", ecUNEXPECTED_EOF ); // incomplete hex definition - iStat += ThrowTest ( "a,", ecUNEXPECTED_EOF ); // incomplete hex definition - iStat += ThrowTest ( "sin(8),", ecUNEXPECTED_EOF ); // incomplete hex definition - iStat += ThrowTest ( "(sin(8)),", ecUNEXPECTED_EOF ); // incomplete hex definition - iStat += ThrowTest ( "a{m},", ecUNEXPECTED_EOF ); // incomplete hex definition + iStat += ThrowTest ( "1;", ecUNEXPECTED_EOF ); // incomplete hex definition + iStat += ThrowTest ( "a;", ecUNEXPECTED_EOF ); // incomplete hex definition + iStat += ThrowTest ( "sin(8);", ecUNEXPECTED_EOF ); // incomplete hex definition + iStat += ThrowTest ( "(sin(8));", ecUNEXPECTED_EOF ); // incomplete hex definition + iStat += ThrowTest ( "a{m};", ecUNEXPECTED_EOF ); // incomplete hex definition iStat += EqnTest ( "(1+ 2*a)", 3, true ); // Spaces within formula iStat += EqnTest ( "sqrt((4))", 2, true ); // Multiple brackets @@ -413,7 +413,7 @@ int QmuParserTester::TestSyntax() iStat += EqnTest ( "sqrt(2+(2))", 2, true ); // Multiple brackets iStat += EqnTest ( "sqrt(a+(3))", 2, true ); // Multiple brackets iStat += EqnTest ( "sqrt((3)+a)", 2, true ); // Multiple brackets - iStat += EqnTest ( "order(1,2)", 1, true ); // May not cause name collision with operator "or" + iStat += EqnTest ( "order(1;2)", 1, true ); // May not cause name collision with operator "or" iStat += EqnTest ( "(2+", 0, false ); // missing closing bracket iStat += EqnTest ( "2++4", 0, false ); // unexpected operator iStat += EqnTest ( "2+-4", 0, false ); // unexpected operator @@ -426,9 +426,9 @@ int QmuParserTester::TestSyntax() iStat += EqnTest ( "5t6", 0, false ); // unknown token iStat += EqnTest ( "5 t 6", 0, false ); // unknown token iStat += EqnTest ( "8*", 0, false ); // unexpected end of formula - iStat += EqnTest ( ",3", 0, false ); // unexpected comma - iStat += EqnTest ( "3,5", 0, false ); // unexpected comma - iStat += EqnTest ( "sin(8,8)", 0, false ); // too many function args + iStat += EqnTest ( ";3", 0, false ); // unexpected semicolon + iStat += EqnTest ( "3;5", 0, false ); // unexpected semicolon + iStat += EqnTest ( "sin(8;8)", 0, false ); // too many function args iStat += EqnTest ( "(7,8)", 0, false ); // too many function args iStat += EqnTest ( "sin)", 0, false ); // unexpected closing bracket iStat += EqnTest ( "a)", 0, false ); // unexpected closing bracket @@ -588,84 +588,84 @@ int QmuParserTester::TestMultiArg() qWarning() << "testing multiarg functions..."; // Compound expressions - iStat += EqnTest ( "1,2,3", 3, true ); - iStat += EqnTest ( "a,b,c", 3, true ); - iStat += EqnTest ( "a=10,b=20,c=a*b", 200, true ); - iStat += EqnTest ( "1,\n2,\n3", 3, true ); - iStat += EqnTest ( "a,\nb,\nc", 3, true ); - iStat += EqnTest ( "a=10,\nb=20,\nc=a*b", 200, true ); - iStat += EqnTest ( "1,\r\n2,\r\n3", 3, true ); - iStat += EqnTest ( "a,\r\nb,\r\nc", 3, true ); - iStat += EqnTest ( "a=10,\r\nb=20,\r\nc=a*b", 200, true ); + iStat += EqnTest ( "1;2;3", 3, true ); + iStat += EqnTest ( "a;b;c", 3, true ); + iStat += EqnTest ( "a=10;b=20;c=a*b", 200, true ); + iStat += EqnTest ( "1;\n2;\n3", 3, true ); + iStat += EqnTest ( "a;\nb;\nc", 3, true ); + iStat += EqnTest ( "a=10;\nb=20;\nc=a*b", 200, true ); + iStat += EqnTest ( "1;\r\n2;\r\n3", 3, true ); + iStat += EqnTest ( "a;\r\nb;\r\nc", 3, true ); + iStat += EqnTest ( "a=10;\r\nb=20;\r\nc=a*b", 200, true ); // picking the right argument iStat += EqnTest ( "f1of1(1)", 1, true ); - iStat += EqnTest ( "f1of2(1, 2)", 1, true ); - iStat += EqnTest ( "f2of2(1, 2)", 2, true ); - iStat += EqnTest ( "f1of3(1, 2, 3)", 1, true ); - iStat += EqnTest ( "f2of3(1, 2, 3)", 2, true ); - iStat += EqnTest ( "f3of3(1, 2, 3)", 3, true ); - iStat += EqnTest ( "f1of4(1, 2, 3, 4)", 1, true ); - iStat += EqnTest ( "f2of4(1, 2, 3, 4)", 2, true ); - iStat += EqnTest ( "f3of4(1, 2, 3, 4)", 3, true ); - iStat += EqnTest ( "f4of4(1, 2, 3, 4)", 4, true ); - iStat += EqnTest ( "f1of5(1, 2, 3, 4, 5)", 1, true ); - iStat += EqnTest ( "f2of5(1, 2, 3, 4, 5)", 2, true ); - iStat += EqnTest ( "f3of5(1, 2, 3, 4, 5)", 3, true ); - iStat += EqnTest ( "f4of5(1, 2, 3, 4, 5)", 4, true ); - iStat += EqnTest ( "f5of5(1, 2, 3, 4, 5)", 5, true ); + iStat += EqnTest ( "f1of2(1; 2)", 1, true ); + iStat += EqnTest ( "f2of2(1; 2)", 2, true ); + iStat += EqnTest ( "f1of3(1; 2; 3)", 1, true ); + iStat += EqnTest ( "f2of3(1; 2; 3)", 2, true ); + iStat += EqnTest ( "f3of3(1; 2; 3)", 3, true ); + iStat += EqnTest ( "f1of4(1; 2; 3; 4)", 1, true ); + iStat += EqnTest ( "f2of4(1; 2; 3; 4)", 2, true ); + iStat += EqnTest ( "f3of4(1; 2; 3; 4)", 3, true ); + iStat += EqnTest ( "f4of4(1; 2; 3; 4)", 4, true ); + iStat += EqnTest ( "f1of5(1; 2; 3; 4; 5)", 1, true ); + iStat += EqnTest ( "f2of5(1; 2; 3; 4; 5)", 2, true ); + iStat += EqnTest ( "f3of5(1; 2; 3; 4; 5)", 3, true ); + iStat += EqnTest ( "f4of5(1; 2; 3; 4; 5)", 4, true ); + iStat += EqnTest ( "f5of5(1; 2; 3; 4; 5)", 5, true ); // Too few arguments / Too many arguments iStat += EqnTest ( "1+ping()", 11, true ); iStat += EqnTest ( "ping()+1", 11, true ); iStat += EqnTest ( "2*ping()", 20, true ); iStat += EqnTest ( "ping()*2", 20, true ); - iStat += EqnTest ( "ping(1,2)", 0, false ); - iStat += EqnTest ( "1+ping(1,2)", 0, false ); - iStat += EqnTest ( "f1of1(1,2)", 0, false ); + iStat += EqnTest ( "ping(1;2)", 0, false ); + iStat += EqnTest ( "1+ping(1;2)", 0, false ); + iStat += EqnTest ( "f1of1(1;2)", 0, false ); iStat += EqnTest ( "f1of1()", 0, false ); - iStat += EqnTest ( "f1of2(1, 2, 3)", 0, false ); + iStat += EqnTest ( "f1of2(1; 2; 3)", 0, false ); iStat += EqnTest ( "f1of2(1)", 0, false ); - iStat += EqnTest ( "f1of3(1, 2, 3, 4)", 0, false ); + iStat += EqnTest ( "f1of3(1; 2; 3; 4)", 0, false ); iStat += EqnTest ( "f1of3(1)", 0, false ); - iStat += EqnTest ( "f1of4(1, 2, 3, 4, 5)", 0, false ); + iStat += EqnTest ( "f1of4(1; 2; 3; 4; 5)", 0, false ); iStat += EqnTest ( "f1of4(1)", 0, false ); - iStat += EqnTest ( "(1,2,3)", 0, false ); - iStat += EqnTest ( "1,2,3", 0, false ); - iStat += EqnTest ( "(1*a,2,3)", 0, false ); - iStat += EqnTest ( "1,2*a,3", 0, false ); + iStat += EqnTest ( "(1;2;3)", 0, false ); + iStat += EqnTest ( "1;2;3", 0, false ); + iStat += EqnTest ( "(1*a;2;3)", 0, false ); + iStat += EqnTest ( "1;2*a;3", 0, false ); // correct calculation of arguments - iStat += EqnTest ( "min(a, 1)", 1, true ); - iStat += EqnTest ( "min(3*2, 1)", 1, true ); - iStat += EqnTest ( "min(3*2, 1)", 6, false ); - iStat += EqnTest ( "firstArg(2,3,4)", 2, true ); - iStat += EqnTest ( "lastArg(2,3,4)", 4, true ); - iStat += EqnTest ( "min(3*a+1, 1)", 1, true ); - iStat += EqnTest ( "max(3*a+1, 1)", 4, true ); - iStat += EqnTest ( "max(3*a+1, 1)*2", 8, true ); - iStat += EqnTest ( "2*max(3*a+1, 1)+2", 10, true ); + iStat += EqnTest ( "min(a; 1)", 1, true ); + iStat += EqnTest ( "min(3*2; 1)", 1, true ); + iStat += EqnTest ( "min(3*2; 1)", 6, false ); + iStat += EqnTest ( "firstArg(2;3;4)", 2, true ); + iStat += EqnTest ( "lastArg(2;3;4)", 4, true ); + iStat += EqnTest ( "min(3*a+1; 1)", 1, true ); + iStat += EqnTest ( "max(3*a+1; 1)", 4, true ); + iStat += EqnTest ( "max(3*a+1; 1)*2", 8, true ); + iStat += EqnTest ( "2*max(3*a+1; 1)+2", 10, true ); // functions with Variable argument count iStat += EqnTest ( "sum(a)", 1, true ); - iStat += EqnTest ( "sum(1,2,3)", 6, true ); - iStat += EqnTest ( "sum(a,b,c)", 6, true ); - iStat += EqnTest ( "sum(1,-max(1,2),3)*2", 4, true ); - iStat += EqnTest ( "2*sum(1,2,3)", 12, true ); - iStat += EqnTest ( "2*sum(1,2,3)+2", 14, true ); - iStat += EqnTest ( "2*sum(-1,2,3)+2", 10, true ); - iStat += EqnTest ( "2*sum(-1,2,-(-a))+2", 6, true ); - iStat += EqnTest ( "2*sum(-1,10,-a)+2", 18, true ); - iStat += EqnTest ( "2*sum(1,2,3)*2", 24, true ); - iStat += EqnTest ( "sum(1,-max(1,2),3)*2", 4, true ); - iStat += EqnTest ( "sum(1*3, 4, a+2)", 10, true ); - iStat += EqnTest ( "sum(1*3, 2*sum(1,2,2), a+2)", 16, true ); - iStat += EqnTest ( "sum(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2)", 24, true ); + iStat += EqnTest ( "sum(1;2;3)", 6, true ); + iStat += EqnTest ( "sum(a;b;c)", 6, true ); + iStat += EqnTest ( "sum(1;-max(1;2);3)*2", 4, true ); + iStat += EqnTest ( "2*sum(1;2;3)", 12, true ); + iStat += EqnTest ( "2*sum(1;2;3)+2", 14, true ); + iStat += EqnTest ( "2*sum(-1;2;3)+2", 10, true ); + iStat += EqnTest ( "2*sum(-1;2;-(-a))+2", 6, true ); + iStat += EqnTest ( "2*sum(-1;10;-a)+2", 18, true ); + iStat += EqnTest ( "2*sum(1;2;3)*2", 24, true ); + iStat += EqnTest ( "sum(1;-max(1;2);3)*2", 4, true ); + iStat += EqnTest ( "sum(1*3; 4; a+2)", 10, true ); + iStat += EqnTest ( "sum(1*3; 2*sum(1;2;2); a+2)", 16, true ); + iStat += EqnTest ( "sum(1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;2)", 24, true ); // some failures iStat += EqnTest ( "sum()", 0, false ); - iStat += EqnTest ( "sum(,)", 0, false ); - iStat += EqnTest ( "sum(1,2,)", 0, false ); - iStat += EqnTest ( "sum(,1,2)", 0, false ); + iStat += EqnTest ( "sum(;)", 0, false ); + iStat += EqnTest ( "sum(1;2;)", 0, false ); + iStat += EqnTest ( "sum(;1;2)", 0, false ); if ( iStat == 0 ) { @@ -768,7 +768,7 @@ int QmuParserTester::TestPostFix() iStat += EqnTest ( "f1of1(1000){m}", 1, true ); iStat += EqnTest ( "-f1of1(1000){m}", -1, true ); iStat += EqnTest ( "-f1of1(-1000){m}", 1, true ); - iStat += EqnTest ( "f4of4(0,0,0,1000){m}", 1, true ); + iStat += EqnTest ( "f4of4(0;0;0;1000){m}", 1, true ); iStat += EqnTest ( "2+(a*1000){m}", 3, true ); // can postfix operators "m" und "meg" be told apart properly? @@ -818,6 +818,9 @@ int QmuParserTester::TestExpression() iStat += EqnTest ( "2*a/3", 2.0 / 3.0, true ); // Addition auf cmVARMUL + iStat += EqnTest ( "b--3", b - (-3), true ); + iStat += EqnTest ( "b-3", b - 3, true ); + iStat += EqnTest ( "3-b", 3 - b, true ); iStat += EqnTest ( "3+b", b + 3, true ); iStat += EqnTest ( "b+3", b + 3, true ); iStat += EqnTest ( "b*3+2", b * 3 + 2, true ); @@ -931,19 +934,19 @@ int QmuParserTester::TestIfThenElse() iStat += EqnTest ( "sum((a>b) ? 1 : 2)", 2, true ); iStat += EqnTest ( "sum((1) ? 1 : 2)", 1, true ); - iStat += EqnTest ( "sum((a>b) ? 1 : 2, 100)", 102, true ); - iStat += EqnTest ( "sum((1) ? 1 : 2, 100)", 101, true ); - iStat += EqnTest ( "sum(3, (a>b) ? 3 : 10)", 13, true ); - iStat += EqnTest ( "sum(3, (ab) ? 3 : 10)", 130, true ); - iStat += EqnTest ( "10*sum(3, (ab) ? 3 : 10)*10", 130, true ); - iStat += EqnTest ( "sum(3, (ab) ? sum(3, (ab) ? sum(3, (ab) ? sum(3, (ab) ? 1 : 2; 100)", 102, true ); + iStat += EqnTest ( "sum((1) ? 1 : 2; 100)", 101, true ); + iStat += EqnTest ( "sum(3; (a>b) ? 3 : 10)", 13, true ); + iStat += EqnTest ( "sum(3; (ab) ? 3 : 10)", 130, true ); + iStat += EqnTest ( "10*sum(3; (ab) ? 3 : 10)*10", 130, true ); + iStat += EqnTest ( "sum(3; (ab) ? sum(3; (ab) ? sum(3; (ab) ? sum(3; (ab)&&(ab)&&(a