From 9d617ce4c8a0d65155c6b2d4bbff273519b6e573 Mon Sep 17 00:00:00 2001 From: Eivind Kvedalen Date: Mon, 14 Mar 2016 22:34:22 +0100 Subject: [PATCH] Expressions: Changed precedence of ?, :, EQ, NEQ, LT, GT, GTE, and LTE. --- src/App/ExpressionParser.tab.c | 428 ++++++++-------- src/App/ExpressionParser.y | 3 +- .../Spreadsheet/App/ExpressionParser.tab.c | 460 +++++++++--------- src/Mod/Spreadsheet/App/ExpressionParser.y | 3 +- src/Mod/Spreadsheet/TestSpreadsheet.py | 14 + 5 files changed, 459 insertions(+), 449 deletions(-) diff --git a/src/App/ExpressionParser.tab.c b/src/App/ExpressionParser.tab.c index 97abced29..a222fbb91 100644 --- a/src/App/ExpressionParser.tab.c +++ b/src/App/ExpressionParser.tab.c @@ -383,7 +383,7 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 37 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 195 +#define YYLAST 171 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 39 @@ -410,9 +410,9 @@ static const yytype_uint8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 2, 2, 2, 2, - 31, 32, 24, 23, 33, 2, 35, 25, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 27, 34, - 2, 2, 2, 26, 2, 2, 2, 2, 2, 2, + 31, 32, 26, 25, 33, 2, 35, 27, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 24, 34, + 2, 2, 2, 23, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 37, 2, 38, 30, 2, 2, 2, 2, 2, @@ -440,13 +440,13 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 67, 67, 68, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 87, 88, - 89, 92, 93, 94, 95, 98, 99, 100, 103, 104, - 105, 106, 107, 108, 111, 112, 113, 114, 115, 116, - 117, 120, 124, 129, 134, 142, 143, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 170, 171, 174, 175 + 0, 68, 68, 69, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, + 90, 93, 94, 95, 96, 99, 100, 101, 104, 105, + 106, 107, 108, 109, 112, 113, 114, 115, 116, 117, + 118, 121, 125, 130, 135, 143, 144, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 171, 172, 175, 176 }; #endif @@ -458,7 +458,7 @@ static const char *const yytname[] = "$end", "error", "$undefined", "FUNC", "ONE", "NUM", "IDENTIFIER", "UNIT", "INTEGER", "CONSTANT", "CELLADDRESS", "EQ", "NEQ", "LT", "GT", "GTE", "LTE", "STRING", "MINUSSIGN", "PROPERTY_REF", "DOCUMENT", - "OBJECT", "EXPONENT", "'+'", "'*'", "'/'", "'?'", "':'", "NEG", "POS", + "OBJECT", "EXPONENT", "'?'", "':'", "'+'", "'*'", "'/'", "NEG", "POS", "'^'", "'('", "')'", "','", "';'", "'.'", "'#'", "'['", "']'", "$accept", "input", "exp", "basic_num", "num", "args", "cond", "unit_exp", "identifier", "integer", "path", "subpath", "document", "object", YY_NULLPTR @@ -472,7 +472,7 @@ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 43, 42, 47, 63, 58, 278, 279, + 275, 276, 277, 63, 58, 43, 42, 47, 278, 279, 94, 40, 41, 44, 59, 46, 35, 91, 93 }; # endif @@ -491,19 +491,19 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 56, 72, -12, -85, 32, -85, -85, 1, -21, -29, - 72, 72, 56, 22, 135, 1, -85, 29, -9, -85, - -85, 20, 64, -85, 72, 135, 38, 1, 104, 80, - -12, 1, -9, 61, 61, 93, 68, -85, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 56, 72, -85, - 72, 1, 1, 15, 126, 24, -85, 72, 72, 82, - 48, -85, -85, -85, -85, 75, -85, 77, 81, -85, - -85, 135, 135, 135, 135, 135, 135, 155, 155, 161, - 161, 82, -85, 115, 82, 82, 23, -85, 59, -85, - -85, 67, -85, -85, 135, 135, 104, 178, 85, 87, - 89, 72, -85, 24, -85, 96, 97, 99, 104, 104, - 104, 61, -85, 106, 109, 117, -85, -85, -85, 104, - 104, 104, -85, -85, -85 + 56, 74, -11, -85, -22, -85, -85, 1, -14, -29, + 74, 74, 56, 22, 124, 1, -85, 5, 4, -85, + -85, -9, 20, -85, 74, 124, 137, 1, 96, 139, + -11, 1, 4, 26, 26, 82, 136, -85, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 56, 74, -85, + 74, 1, 1, 15, 115, 66, -85, 74, 74, 39, + 53, -85, -85, -85, -85, 32, -85, 37, 65, -85, + -85, 124, 124, 124, 124, 124, 124, 41, 41, 26, + 26, 39, -85, 104, 39, 39, 81, -85, 89, -85, + -85, 69, -85, -85, 124, 124, 96, 140, 75, 76, + 88, 74, -85, 66, -85, 95, 103, 117, 96, 96, + 96, 134, -85, 92, 118, 123, -85, -85, -85, 96, + 96, 96, -85, -85, -85 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -529,8 +529,8 @@ static const yytype_uint8 yydefact[] = /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -85, -85, 0, -35, -85, -85, -85, 2, -85, 57, - -51, -84, -85, 101 + -85, -85, 0, -35, -85, -85, -85, 2, -85, 68, + -51, -84, -85, 113 }; /* YYDEFGOTO[NTERM-NUM]. */ @@ -546,49 +546,45 @@ static const yytype_int8 yydefgoto[] = static const yytype_int8 yytable[] = { 14, 25, 18, 90, 93, 30, -68, -66, 5, 32, - 33, 34, 104, 27, -69, 51, 52, 49, 87, 23, - 3, 53, 37, 6, 116, 117, 118, 23, 3, 59, - 88, 6, 31, 86, 92, 122, 123, 124, 71, 72, + 33, 34, 104, 28, -67, 29, 27, 49, 87, 23, + 3, -69, 37, 6, 116, 117, 118, 54, 50, 59, + 51, 52, 31, 86, 53, 122, 123, 124, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 82, 81, - 83, 102, 112, 84, 85, 50, 54, 94, 95, 1, - 2, 3, 4, 5, 6, 7, 8, 28, -67, 29, - 56, 57, 58, 9, 10, 1, 23, 3, 4, 11, - 6, 7, 8, 96, 64, 97, 65, 12, 66, 9, - 10, 48, 51, 52, 28, 11, 29, 67, 53, 55, - 70, 111, 103, 24, 38, 39, 40, 41, 42, 43, - 60, 44, 53, 98, 61, 99, 45, 46, 47, 100, - 108, 62, 109, 48, 110, 69, 38, 39, 40, 41, - 42, 43, 88, 44, 113, 114, 8, 115, 45, 46, - 47, 119, 101, 89, 120, 48, 38, 39, 40, 41, - 42, 43, 121, 44, 107, 91, 0, 0, 45, 46, - 47, 0, 0, 0, 0, 48, 38, 39, 40, 41, - 42, 43, 38, 39, 40, 41, 42, 43, 0, 46, - 47, 0, 64, 0, 105, 48, 66, 0, 0, 0, - 0, 48, 0, 0, 0, 106 + 83, 102, 112, 84, 85, 55, 48, 94, 95, 1, + 2, 3, 4, 5, 6, 7, 8, 46, 47, 53, + 98, 48, 88, 9, 10, 99, 92, 1, 23, 3, + 4, 11, 6, 7, 8, 23, 3, 12, 96, 6, + 97, 9, 10, 38, 39, 40, 41, 42, 43, 11, + 44, 111, 60, 100, 103, 24, 61, 45, 46, 47, + 108, 109, 48, 62, 69, 38, 39, 40, 41, 42, + 43, 88, 44, 110, 28, 8, 29, 119, 101, 45, + 46, 47, 89, 113, 48, 38, 39, 40, 41, 42, + 43, 114, 44, 64, 64, 65, 105, 66, 66, 45, + 46, 47, 44, 120, 48, 115, 67, 106, 121, 45, + 46, 47, 51, 52, 48, 107, 53, 91, 70, 56, + 57, 58 }; -static const yytype_int8 yycheck[] = +static const yytype_uint8 yycheck[] = { 0, 1, 0, 54, 55, 4, 35, 36, 7, 7, - 10, 11, 96, 25, 35, 24, 25, 15, 53, 4, - 5, 30, 0, 8, 108, 109, 110, 4, 5, 27, - 6, 8, 31, 18, 10, 119, 120, 121, 38, 39, + 10, 11, 96, 35, 36, 37, 27, 15, 53, 4, + 5, 35, 0, 8, 108, 109, 110, 36, 23, 27, + 26, 27, 31, 18, 30, 119, 120, 121, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 47, - 50, 86, 103, 51, 52, 26, 36, 57, 58, 3, - 4, 5, 6, 7, 8, 9, 10, 35, 36, 37, - 32, 33, 34, 17, 18, 3, 4, 5, 6, 23, - 8, 9, 10, 35, 4, 37, 6, 31, 8, 17, - 18, 30, 24, 25, 35, 23, 37, 17, 30, 35, - 32, 101, 35, 31, 11, 12, 13, 14, 15, 16, - 6, 18, 30, 38, 10, 38, 23, 24, 25, 38, - 35, 17, 35, 30, 35, 32, 11, 12, 13, 14, - 15, 16, 6, 18, 38, 38, 10, 38, 23, 24, - 25, 35, 27, 17, 35, 30, 11, 12, 13, 14, - 15, 16, 35, 18, 97, 54, -1, -1, 23, 24, - 25, -1, -1, -1, -1, 30, 11, 12, 13, 14, - 15, 16, 11, 12, 13, 14, 15, 16, -1, 24, - 25, -1, 4, -1, 6, 30, 8, -1, -1, -1, - -1, 30, -1, -1, -1, 17 + 50, 86, 103, 51, 52, 35, 30, 57, 58, 3, + 4, 5, 6, 7, 8, 9, 10, 26, 27, 30, + 38, 30, 6, 17, 18, 38, 10, 3, 4, 5, + 6, 25, 8, 9, 10, 4, 5, 31, 35, 8, + 37, 17, 18, 11, 12, 13, 14, 15, 16, 25, + 18, 101, 6, 38, 35, 31, 10, 25, 26, 27, + 35, 35, 30, 17, 32, 11, 12, 13, 14, 15, + 16, 6, 18, 35, 35, 10, 37, 35, 24, 25, + 26, 27, 17, 38, 30, 11, 12, 13, 14, 15, + 16, 38, 18, 4, 4, 6, 6, 8, 8, 25, + 26, 27, 18, 35, 30, 38, 17, 17, 35, 25, + 26, 27, 26, 27, 30, 97, 30, 54, 32, 32, + 33, 34 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -596,16 +592,16 @@ static const yytype_int8 yycheck[] = static const yytype_uint8 yystos[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 17, - 18, 23, 31, 40, 41, 42, 43, 45, 46, 47, - 49, 51, 52, 4, 31, 41, 44, 25, 35, 37, + 18, 25, 31, 40, 41, 42, 43, 45, 46, 47, + 49, 51, 52, 4, 31, 41, 44, 27, 35, 37, 4, 31, 46, 41, 41, 41, 46, 0, 11, 12, - 13, 14, 15, 16, 18, 23, 24, 25, 30, 46, - 26, 24, 25, 30, 36, 35, 32, 33, 34, 46, + 13, 14, 15, 16, 18, 25, 26, 27, 30, 46, + 23, 26, 27, 30, 36, 35, 32, 33, 34, 46, 6, 10, 17, 50, 4, 6, 8, 17, 48, 32, 32, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 46, 41, 41, 46, 46, 18, 42, 6, 17, 49, 52, 10, 49, 41, 41, 35, 37, 38, 38, - 38, 27, 42, 35, 50, 6, 17, 48, 35, 35, + 38, 24, 42, 35, 50, 6, 17, 48, 35, 35, 35, 41, 49, 38, 38, 38, 50, 50, 50, 35, 35, 35, 50, 50, 50 }; @@ -1055,27 +1051,27 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) switch (yytype) { case 41: /* exp */ -#line 60 "ExpressionParser.y" /* yacc.c:1257 */ +#line 61 "ExpressionParser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1061 "ExpressionParser.tab.c" /* yacc.c:1257 */ +#line 1057 "ExpressionParser.tab.c" /* yacc.c:1257 */ break; case 44: /* args */ -#line 61 "ExpressionParser.y" /* yacc.c:1257 */ +#line 62 "ExpressionParser.y" /* yacc.c:1257 */ { std::vector::const_iterator i = ((*yyvaluep).arguments).begin(); while (i != ((*yyvaluep).arguments).end()) { delete *i; ++i; } } -#line 1067 "ExpressionParser.tab.c" /* yacc.c:1257 */ +#line 1063 "ExpressionParser.tab.c" /* yacc.c:1257 */ break; case 45: /* cond */ -#line 60 "ExpressionParser.y" /* yacc.c:1257 */ +#line 61 "ExpressionParser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1073 "ExpressionParser.tab.c" /* yacc.c:1257 */ +#line 1069 "ExpressionParser.tab.c" /* yacc.c:1257 */ break; case 46: /* unit_exp */ -#line 60 "ExpressionParser.y" /* yacc.c:1257 */ +#line 61 "ExpressionParser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1079 "ExpressionParser.tab.c" /* yacc.c:1257 */ +#line 1075 "ExpressionParser.tab.c" /* yacc.c:1257 */ break; @@ -1337,431 +1333,431 @@ yyreduce: switch (yyn) { case 2: -#line 67 "ExpressionParser.y" /* yacc.c:1646 */ +#line 68 "ExpressionParser.y" /* yacc.c:1646 */ { ScanResult = (yyvsp[0].expr); valueExpression = true; } -#line 1343 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1339 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 3: -#line 68 "ExpressionParser.y" /* yacc.c:1646 */ +#line 69 "ExpressionParser.y" /* yacc.c:1646 */ { ScanResult = (yyvsp[0].expr); unitExpression = true; } -#line 1349 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1345 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 4: -#line 71 "ExpressionParser.y" /* yacc.c:1646 */ +#line 72 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 1355 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1351 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 5: -#line 72 "ExpressionParser.y" /* yacc.c:1646 */ +#line 73 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new StringExpression(DocumentObject, (yyvsp[0].string)); } -#line 1361 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1357 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 6: -#line 73 "ExpressionParser.y" /* yacc.c:1646 */ +#line 74 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new VariableExpression(DocumentObject, (yyvsp[0].path)); } -#line 1367 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1363 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 7: -#line 74 "ExpressionParser.y" /* yacc.c:1646 */ +#line 75 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[0].expr), OperatorExpression::NEG, new NumberExpression(DocumentObject, -1)); } -#line 1373 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1369 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 8: -#line 75 "ExpressionParser.y" /* yacc.c:1646 */ +#line 76 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[0].expr), OperatorExpression::POS, new NumberExpression(DocumentObject, 1)); } -#line 1379 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1375 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 9: -#line 76 "ExpressionParser.y" /* yacc.c:1646 */ +#line 77 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::ADD, (yyvsp[0].expr)); } -#line 1385 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1381 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 10: -#line 77 "ExpressionParser.y" /* yacc.c:1646 */ +#line 78 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::SUB, (yyvsp[0].expr)); } -#line 1391 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1387 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 11: -#line 78 "ExpressionParser.y" /* yacc.c:1646 */ +#line 79 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::MUL, (yyvsp[0].expr)); } -#line 1397 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1393 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 12: -#line 79 "ExpressionParser.y" /* yacc.c:1646 */ +#line 80 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::DIV, (yyvsp[0].expr)); } -#line 1403 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1399 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 13: -#line 80 "ExpressionParser.y" /* yacc.c:1646 */ +#line 81 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::DIV, (yyvsp[0].expr)); } -#line 1409 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1405 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 14: -#line 81 "ExpressionParser.y" /* yacc.c:1646 */ +#line 82 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::POW, (yyvsp[0].expr)); } -#line 1415 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1411 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 15: -#line 82 "ExpressionParser.y" /* yacc.c:1646 */ +#line 83 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[-1].expr); } -#line 1421 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1417 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 16: -#line 83 "ExpressionParser.y" /* yacc.c:1646 */ +#line 84 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new FunctionExpression(DocumentObject, (yyvsp[-2].func), (yyvsp[-1].arguments)); } -#line 1427 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1423 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 17: -#line 84 "ExpressionParser.y" /* yacc.c:1646 */ +#line 85 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new ConditionalExpression(DocumentObject, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 1433 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1429 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 18: -#line 87 "ExpressionParser.y" /* yacc.c:1646 */ +#line 88 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new NumberExpression(DocumentObject, (yyvsp[0].fvalue)); } -#line 1439 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1435 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 19: -#line 88 "ExpressionParser.y" /* yacc.c:1646 */ +#line 89 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new NumberExpression(DocumentObject, (yyvsp[0].fvalue)); } -#line 1445 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1441 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 20: -#line 89 "ExpressionParser.y" /* yacc.c:1646 */ +#line 90 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new NumberExpression(DocumentObject, (double)(yyvsp[0].ivalue)); } -#line 1451 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1447 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 21: -#line 92 "ExpressionParser.y" /* yacc.c:1646 */ +#line 93 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 1457 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1453 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 22: -#line 93 "ExpressionParser.y" /* yacc.c:1646 */ +#line 94 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new ConstantExpression(DocumentObject, (yyvsp[0].constant).name, (yyvsp[0].constant).fvalue); } -#line 1463 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1459 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 23: -#line 94 "ExpressionParser.y" /* yacc.c:1646 */ +#line 95 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-1].expr), OperatorExpression::UNIT, (yyvsp[0].expr)); } -#line 1469 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1465 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 24: -#line 95 "ExpressionParser.y" /* yacc.c:1646 */ +#line 96 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, new ConstantExpression(DocumentObject, (yyvsp[-1].constant).name, (yyvsp[-1].constant).fvalue), OperatorExpression::UNIT, (yyvsp[0].expr)); } -#line 1475 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1471 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 25: -#line 98 "ExpressionParser.y" /* yacc.c:1646 */ +#line 99 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.arguments).push_back((yyvsp[0].expr)); } -#line 1481 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1477 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 26: -#line 99 "ExpressionParser.y" /* yacc.c:1646 */ +#line 100 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[-2].arguments).push_back((yyvsp[0].expr)); (yyval.arguments) = (yyvsp[-2].arguments); } -#line 1487 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1483 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 27: -#line 100 "ExpressionParser.y" /* yacc.c:1646 */ +#line 101 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[-2].arguments).push_back((yyvsp[0].expr)); (yyval.arguments) = (yyvsp[-2].arguments); } -#line 1493 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1489 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 28: -#line 103 "ExpressionParser.y" /* yacc.c:1646 */ +#line 104 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::EQ, (yyvsp[0].expr)); } -#line 1499 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1495 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 29: -#line 104 "ExpressionParser.y" /* yacc.c:1646 */ +#line 105 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::NEQ, (yyvsp[0].expr)); } -#line 1505 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1501 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 30: -#line 105 "ExpressionParser.y" /* yacc.c:1646 */ +#line 106 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::LT, (yyvsp[0].expr)); } -#line 1511 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1507 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 31: -#line 106 "ExpressionParser.y" /* yacc.c:1646 */ +#line 107 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::GT, (yyvsp[0].expr)); } -#line 1517 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1513 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 32: -#line 107 "ExpressionParser.y" /* yacc.c:1646 */ +#line 108 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::GTE, (yyvsp[0].expr)); } -#line 1523 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1519 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 33: -#line 108 "ExpressionParser.y" /* yacc.c:1646 */ +#line 109 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::LTE, (yyvsp[0].expr)); } -#line 1529 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1525 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 34: -#line 111 "ExpressionParser.y" /* yacc.c:1646 */ +#line 112 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new UnitExpression(DocumentObject, (yyvsp[0].quantity).scaler, (yyvsp[0].quantity).unitStr ); } -#line 1535 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1531 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 35: -#line 112 "ExpressionParser.y" /* yacc.c:1646 */ +#line 113 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, new NumberExpression(DocumentObject, (yyvsp[-2].fvalue)), OperatorExpression::DIV, (yyvsp[0].expr)); } -#line 1541 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1537 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 36: -#line 113 "ExpressionParser.y" /* yacc.c:1646 */ +#line 114 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::DIV, (yyvsp[0].expr)); } -#line 1547 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1543 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 37: -#line 114 "ExpressionParser.y" /* yacc.c:1646 */ +#line 115 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::MUL, (yyvsp[0].expr)); } -#line 1553 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1549 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 38: -#line 115 "ExpressionParser.y" /* yacc.c:1646 */ +#line 116 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::POW, (yyvsp[0].expr)); } -#line 1559 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1555 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 39: -#line 116 "ExpressionParser.y" /* yacc.c:1646 */ +#line 117 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-3].expr), OperatorExpression::POW, new OperatorExpression(DocumentObject, (yyvsp[0].expr), OperatorExpression::NEG, new NumberExpression(DocumentObject, -1))); } -#line 1565 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1561 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 40: -#line 117 "ExpressionParser.y" /* yacc.c:1646 */ +#line 118 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[-1].expr); } -#line 1571 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1567 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 41: -#line 120 "ExpressionParser.y" /* yacc.c:1646 */ +#line 121 "ExpressionParser.y" /* yacc.c:1646 */ { /* Path to property within document object */ (yyval.path) = ObjectIdentifier(DocumentObject); (yyval.path).addComponents((yyvsp[0].components)); } -#line 1580 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1576 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 42: -#line 124 "ExpressionParser.y" /* yacc.c:1646 */ +#line 125 "ExpressionParser.y" /* yacc.c:1646 */ { /* Path to property within document object */ (yyval.path) = ObjectIdentifier(DocumentObject); (yyval.path).setDocumentObjectName((yyvsp[-2].string_or_identifier), true); (yyval.path).addComponents((yyvsp[0].components)); } -#line 1590 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1586 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 43: -#line 129 "ExpressionParser.y" /* yacc.c:1646 */ +#line 130 "ExpressionParser.y" /* yacc.c:1646 */ { /* Path to property from an external document, within a named document object */ (yyval.path) = ObjectIdentifier(DocumentObject); (yyval.path).setDocumentName((yyvsp[-2].string_or_identifier), true); (yyval.path).addComponents((yyvsp[0].components)); } -#line 1600 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1596 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 44: -#line 134 "ExpressionParser.y" /* yacc.c:1646 */ +#line 135 "ExpressionParser.y" /* yacc.c:1646 */ { /* Path to property from an external document, within a named document object */ (yyval.path) = ObjectIdentifier(DocumentObject); (yyval.path).setDocumentName((yyvsp[-4].string_or_identifier), true); (yyval.path).setDocumentObjectName((yyvsp[-2].string_or_identifier), true); (yyval.path).addComponents((yyvsp[0].components)); } -#line 1611 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1607 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 45: -#line 142 "ExpressionParser.y" /* yacc.c:1646 */ +#line 143 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.ivalue) = (yyvsp[0].ivalue); } -#line 1617 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1613 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 46: -#line 143 "ExpressionParser.y" /* yacc.c:1646 */ +#line 144 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.ivalue) = (yyvsp[0].fvalue); } -#line 1623 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1619 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 47: -#line 147 "ExpressionParser.y" /* yacc.c:1646 */ +#line 148 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1629 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1625 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 48: -#line 148 "ExpressionParser.y" /* yacc.c:1646 */ +#line 149 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1635 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1631 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 49: -#line 149 "ExpressionParser.y" /* yacc.c:1646 */ +#line 150 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::ArrayComponent((yyvsp[-3].string), (yyvsp[-1].ivalue))); } -#line 1641 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1637 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 50: -#line 150 "ExpressionParser.y" /* yacc.c:1646 */ +#line 151 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::ArrayComponent((yyvsp[-5].string), (yyvsp[-3].ivalue))); (yyval.components) = (yyvsp[0].components); } -#line 1647 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1643 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 51: -#line 151 "ExpressionParser.y" /* yacc.c:1646 */ +#line 152 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-3].string), ObjectIdentifier::String((yyvsp[-1].string), true))); } -#line 1653 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1649 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 52: -#line 152 "ExpressionParser.y" /* yacc.c:1646 */ +#line 153 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-3].string), (yyvsp[-1].string))); } -#line 1659 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1655 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 53: -#line 153 "ExpressionParser.y" /* yacc.c:1646 */ +#line 154 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-5].string), ObjectIdentifier::String((yyvsp[-3].string), true))); (yyval.components) = (yyvsp[0].components); } -#line 1665 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1661 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 54: -#line 154 "ExpressionParser.y" /* yacc.c:1646 */ +#line 155 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-5].string), (yyvsp[-3].string))); (yyval.components) = (yyvsp[0].components); } -#line 1671 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1667 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 55: -#line 155 "ExpressionParser.y" /* yacc.c:1646 */ +#line 156 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[-2].string))); (yyval.components) = (yyvsp[0].components); } -#line 1677 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1673 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 56: -#line 158 "ExpressionParser.y" /* yacc.c:1646 */ +#line 159 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1683 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1679 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 57: -#line 159 "ExpressionParser.y" /* yacc.c:1646 */ +#line 160 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1689 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1685 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 58: -#line 160 "ExpressionParser.y" /* yacc.c:1646 */ +#line 161 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1695 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1691 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 59: -#line 161 "ExpressionParser.y" /* yacc.c:1646 */ +#line 162 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::ArrayComponent((yyvsp[-3].string), (yyvsp[-1].ivalue))); } -#line 1701 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1697 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 60: -#line 162 "ExpressionParser.y" /* yacc.c:1646 */ +#line 163 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::ArrayComponent((yyvsp[-5].string), (yyvsp[-3].ivalue))); (yyval.components) = (yyvsp[0].components); } -#line 1707 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1703 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 61: -#line 163 "ExpressionParser.y" /* yacc.c:1646 */ +#line 164 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-3].string), ObjectIdentifier::String((yyvsp[-1].string), true))); } -#line 1713 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1709 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 62: -#line 164 "ExpressionParser.y" /* yacc.c:1646 */ +#line 165 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-3].string), (yyvsp[-1].string))); } -#line 1719 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1715 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 63: -#line 165 "ExpressionParser.y" /* yacc.c:1646 */ +#line 166 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-5].string), ObjectIdentifier::String((yyvsp[-3].string), true))); (yyval.components) = (yyvsp[0].components); } -#line 1725 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1721 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 64: -#line 166 "ExpressionParser.y" /* yacc.c:1646 */ +#line 167 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-5].string), (yyvsp[-3].string))); (yyval.components) = (yyvsp[0].components); } -#line 1731 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1727 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 65: -#line 167 "ExpressionParser.y" /* yacc.c:1646 */ +#line 168 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[-2].string))); (yyval.components) = (yyvsp[0].components); } -#line 1737 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1733 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 66: -#line 170 "ExpressionParser.y" /* yacc.c:1646 */ +#line 171 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.string_or_identifier) = ObjectIdentifier::String((yyvsp[0].string), true); } -#line 1743 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1739 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 67: -#line 171 "ExpressionParser.y" /* yacc.c:1646 */ +#line 172 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.string_or_identifier) = ObjectIdentifier::String((yyvsp[0].string)); } -#line 1749 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1745 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 68: -#line 174 "ExpressionParser.y" /* yacc.c:1646 */ +#line 175 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.string_or_identifier) = ObjectIdentifier::String((yyvsp[0].string), true); } -#line 1755 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1751 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 69: -#line 175 "ExpressionParser.y" /* yacc.c:1646 */ +#line 176 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.string_or_identifier) = ObjectIdentifier::String((yyvsp[0].string), true); } -#line 1761 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1757 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; -#line 1765 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1761 "ExpressionParser.tab.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -1989,5 +1985,5 @@ yyreturn: #endif return yyresult; } -#line 178 "ExpressionParser.y" /* yacc.c:1906 */ +#line 179 "ExpressionParser.y" /* yacc.c:1906 */ diff --git a/src/App/ExpressionParser.y b/src/App/ExpressionParser.y index 76e5aabbf..652e979f5 100644 --- a/src/App/ExpressionParser.y +++ b/src/App/ExpressionParser.y @@ -49,9 +49,10 @@ std::stack functions; /**< Function %left NUM %left INTEGER %left CONSTANT + %left EQ NEQ LT GT GTE LTE + %left '?' ':' %left MINUSSIGN '+' %left '*' '/' - %left '?' ':' EQ NEQ LT GT GTE LTE %left NEG /* negation--unary minus */ %left POS /* unary plus */ %right '^' /* exponentiation */ diff --git a/src/Mod/Spreadsheet/App/ExpressionParser.tab.c b/src/Mod/Spreadsheet/App/ExpressionParser.tab.c index 14e18da16..9b8c34b65 100644 --- a/src/Mod/Spreadsheet/App/ExpressionParser.tab.c +++ b/src/Mod/Spreadsheet/App/ExpressionParser.tab.c @@ -383,7 +383,7 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 40 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 214 +#define YYLAST 200 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 39 @@ -410,9 +410,9 @@ static const yytype_uint8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 2, 2, 2, 2, - 31, 32, 24, 23, 33, 2, 35, 25, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 27, 34, - 2, 2, 2, 26, 2, 2, 2, 2, 2, 2, + 31, 32, 26, 25, 33, 2, 35, 27, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 24, 34, + 2, 2, 2, 23, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 37, 2, 38, 30, 2, 2, 2, 2, 2, @@ -440,14 +440,14 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 68, 68, 69, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 88, 89, - 90, 93, 94, 95, 96, 99, 100, 101, 102, 105, - 106, 107, 108, 111, 112, 113, 114, 115, 116, 119, - 120, 121, 122, 123, 124, 125, 128, 132, 137, 142, - 150, 151, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 178, 179, 182, 183 + 0, 69, 69, 70, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 89, 90, + 91, 94, 95, 96, 97, 100, 101, 102, 103, 106, + 107, 108, 109, 112, 113, 114, 115, 116, 117, 120, + 121, 122, 123, 124, 125, 126, 129, 133, 138, 143, + 151, 152, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 179, 180, 183, 184 }; #endif @@ -459,7 +459,7 @@ static const char *const yytname[] = "$end", "error", "$undefined", "FUNC", "ONE", "NUM", "IDENTIFIER", "UNIT", "INTEGER", "CONSTANT", "CELLADDRESS", "EQ", "NEQ", "LT", "GT", "GTE", "LTE", "STRING", "MINUSSIGN", "PROPERTY_REF", "DOCUMENT", - "OBJECT", "EXPONENT", "'+'", "'*'", "'/'", "'?'", "':'", "NEG", "POS", + "OBJECT", "EXPONENT", "'?'", "':'", "'+'", "'*'", "'/'", "NEG", "POS", "'^'", "'('", "')'", "','", "';'", "'.'", "'#'", "'['", "']'", "$accept", "input", "exp", "basic_num", "num", "args", "range", "cond", "unit_exp", "identifier", "integer", "path", "subpath", "document", "object", YY_NULLPTR @@ -473,7 +473,7 @@ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 43, 42, 47, 63, 58, 278, 279, + 275, 276, 277, 63, 58, 43, 42, 47, 278, 279, 94, 40, 41, 44, 59, 46, 35, 91, 93 }; # endif @@ -492,20 +492,20 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 61, 77, -18, -100, 92, -100, -100, 8, -12, -22, - 108, 108, 61, 27, 164, 8, -100, 7, 30, -100, - -100, 38, 1, -100, 62, -19, 108, 164, 169, -100, - 8, 155, 20, -18, 8, 30, 58, 58, 122, 118, + 61, 90, -14, -100, 54, -100, -100, 8, -21, -28, + 108, 108, 61, 23, 158, 8, -100, 10, 75, -100, + -100, 18, 1, -100, 37, -8, 108, 158, 166, -100, + 8, 71, 20, -14, 8, 75, 30, 30, 116, 165, -100, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 61, 108, -100, 108, 8, 8, 17, 175, 28, 143, - 160, -100, 108, 108, 60, 24, -100, -100, -100, -100, - 53, -100, 55, 69, -100, -100, 164, 164, 164, 164, - 164, 164, 184, 184, 90, 90, 60, -100, 144, 60, - 60, 68, -100, 40, -100, -100, 74, -100, -100, -100, - -100, -100, -100, 164, 164, 155, 115, 80, 87, 89, - 108, -100, 28, -100, 103, 106, 113, 155, 155, 155, - 58, -100, 95, 128, 129, -100, -100, -100, 155, 155, - 155, -100, -100, -100 + 61, 108, -100, 108, 8, 8, 17, 130, 28, 49, + 70, -100, 108, 108, 55, 69, -100, -100, -100, -100, + 59, -100, 65, 97, -100, -100, 158, 158, 158, 158, + 158, 158, 93, 93, 30, 30, 55, -100, 138, 55, + 55, 153, -100, 87, -100, -100, 74, -100, -100, -100, + -100, -100, -100, 158, 158, 71, 173, 102, 103, 109, + 108, -100, 28, -100, 107, 117, 121, 71, 71, 71, + 57, -100, 125, 131, 132, -100, -100, -100, 71, 71, + 71, -100, -100, -100 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -533,7 +533,7 @@ static const yytype_uint8 yydefact[] = static const yytype_int8 yypgoto[] = { -100, -100, 0, -51, -100, -100, -100, -100, 2, -100, - -10, -54, -99, -100, 116 + 72, -54, -99, -100, 118 }; /* YYDEFGOTO[NTERM-NUM]. */ @@ -548,54 +548,52 @@ static const yytype_int8 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 14, 27, 18, 95, 98, 92, 113, 30, 60, 35, - 36, 37, 33, -73, -71, 5, -74, 52, 125, 126, - 127, 23, 3, -74, 69, 6, 70, 40, 71, 131, + 14, 27, 18, 95, 98, 92, 113, -73, -71, 35, + 36, 37, 33, 30, -74, 5, 60, 52, 125, 126, + 127, 23, 3, 40, 69, 6, 70, -74, 71, 131, 132, 133, 64, 53, 93, 91, 58, 72, 97, 34, 111, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 87, 86, 88, 54, 55, 89, 90, 121, 105, - 56, 106, 103, 104, 1, 2, 3, 4, 5, 6, - 7, 8, 23, 3, 57, 31, 6, 32, 9, 10, - 1, 23, 3, 24, 11, 6, 7, 25, 51, 59, - 56, 107, 12, 108, 9, 10, 116, 31, -72, 32, - 11, 41, 42, 43, 44, 45, 46, 109, 26, 112, - 120, 1, 23, 3, 4, 117, 6, 7, 8, 69, - 51, 114, 118, 71, 119, 9, 10, 31, -72, 32, - 128, 11, 115, 41, 42, 43, 44, 45, 46, 26, - 47, 122, 54, 55, 123, 48, 49, 50, 56, 99, - 75, 124, 51, 100, 74, 41, 42, 43, 44, 45, - 46, 65, 47, 129, 130, 66, 101, 48, 49, 50, - 102, 110, 67, 96, 51, 41, 42, 43, 44, 45, - 46, 93, 47, 0, 0, 8, 0, 48, 49, 50, - 0, 0, 94, 0, 51, 41, 42, 43, 44, 45, - 46, 61, 62, 63, 0, 0, 0, 0, 49, 50, - 0, 0, 0, 0, 51 + 85, 87, 86, 88, 57, 99, 89, 90, 121, 100, + 51, 59, 103, 104, 1, 2, 3, 4, 5, 6, + 7, 8, 31, -72, 32, 47, 101, 65, 9, 10, + 102, 66, 48, 49, 50, 56, 11, 51, 67, 31, + -72, 32, 12, 1, 23, 3, 24, 107, 6, 7, + 25, 54, 55, 108, 105, 56, 106, 9, 10, 112, + 120, 1, 23, 3, 4, 11, 6, 7, 8, 49, + 50, 26, 31, 51, 32, 9, 10, 41, 42, 43, + 44, 45, 46, 11, 47, 109, 93, 117, 118, 26, + 8, 48, 49, 50, 119, 122, 51, 94, 74, 41, + 42, 43, 44, 45, 46, 123, 47, 23, 3, 124, + 128, 6, 110, 48, 49, 50, 129, 130, 51, 41, + 42, 43, 44, 45, 46, 96, 47, 69, 116, 114, + 0, 71, 0, 48, 49, 50, 0, 0, 51, 0, + 115, 54, 55, 0, 0, 56, 0, 75, 61, 62, + 63 }; static const yytype_int16 yycheck[] = { - 0, 1, 0, 57, 58, 56, 105, 25, 27, 7, - 10, 11, 4, 35, 36, 7, 35, 15, 117, 118, - 119, 4, 5, 35, 4, 8, 6, 0, 8, 128, - 129, 130, 30, 26, 6, 18, 35, 17, 10, 31, + 0, 1, 0, 57, 58, 56, 105, 35, 36, 7, + 10, 11, 4, 27, 35, 7, 24, 15, 117, 118, + 119, 4, 5, 0, 4, 8, 6, 35, 8, 128, + 129, 130, 30, 23, 6, 18, 35, 17, 10, 31, 91, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 50, 53, 24, 25, 54, 55, 112, 35, - 30, 37, 62, 63, 3, 4, 5, 6, 7, 8, - 9, 10, 4, 5, 36, 35, 8, 37, 17, 18, - 3, 4, 5, 6, 23, 8, 9, 10, 30, 27, - 30, 38, 31, 38, 17, 18, 106, 35, 36, 37, - 23, 11, 12, 13, 14, 15, 16, 38, 31, 35, - 110, 3, 4, 5, 6, 35, 8, 9, 10, 4, - 30, 6, 35, 8, 35, 17, 18, 35, 36, 37, - 35, 23, 17, 11, 12, 13, 14, 15, 16, 31, - 18, 38, 24, 25, 38, 23, 24, 25, 30, 6, - 32, 38, 30, 10, 32, 11, 12, 13, 14, 15, - 16, 6, 18, 35, 35, 10, 6, 23, 24, 25, - 10, 27, 17, 57, 30, 11, 12, 13, 14, 15, - 16, 6, 18, -1, -1, 10, -1, 23, 24, 25, - -1, -1, 17, -1, 30, 11, 12, 13, 14, 15, - 16, 32, 33, 34, -1, -1, -1, -1, 24, 25, - -1, -1, -1, -1, 30 + 50, 51, 50, 53, 36, 6, 54, 55, 112, 10, + 30, 24, 62, 63, 3, 4, 5, 6, 7, 8, + 9, 10, 35, 36, 37, 18, 6, 6, 17, 18, + 10, 10, 25, 26, 27, 30, 25, 30, 17, 35, + 36, 37, 31, 3, 4, 5, 6, 38, 8, 9, + 10, 26, 27, 38, 35, 30, 37, 17, 18, 35, + 110, 3, 4, 5, 6, 25, 8, 9, 10, 26, + 27, 31, 35, 30, 37, 17, 18, 11, 12, 13, + 14, 15, 16, 25, 18, 38, 6, 35, 35, 31, + 10, 25, 26, 27, 35, 38, 30, 17, 32, 11, + 12, 13, 14, 15, 16, 38, 18, 4, 5, 38, + 35, 8, 24, 25, 26, 27, 35, 35, 30, 11, + 12, 13, 14, 15, 16, 57, 18, 4, 106, 6, + -1, 8, -1, 25, 26, 27, -1, -1, 30, -1, + 17, 26, 27, -1, -1, 30, -1, 32, 32, 33, + 34 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -603,17 +601,17 @@ static const yytype_int16 yycheck[] = static const yytype_uint8 yystos[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10, 17, - 18, 23, 31, 40, 41, 42, 43, 46, 47, 48, + 18, 25, 31, 40, 41, 42, 43, 46, 47, 48, 50, 52, 53, 4, 6, 10, 31, 41, 44, 45, - 25, 35, 37, 4, 31, 47, 41, 41, 41, 47, - 0, 11, 12, 13, 14, 15, 16, 18, 23, 24, - 25, 30, 47, 26, 24, 25, 30, 36, 35, 27, - 27, 32, 33, 34, 47, 6, 10, 17, 51, 4, + 27, 35, 37, 4, 31, 47, 41, 41, 41, 47, + 0, 11, 12, 13, 14, 15, 16, 18, 25, 26, + 27, 30, 47, 23, 26, 27, 30, 36, 35, 24, + 24, 32, 33, 34, 47, 6, 10, 17, 51, 4, 6, 8, 17, 49, 32, 32, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 47, 41, 41, 47, 47, 18, 42, 6, 17, 50, 53, 10, 50, 6, 10, 6, 10, 41, 41, 35, 37, 38, 38, 38, - 27, 42, 35, 51, 6, 17, 49, 35, 35, 35, + 24, 42, 35, 51, 6, 17, 49, 35, 35, 35, 41, 50, 38, 38, 38, 51, 51, 51, 35, 35, 35, 51, 51, 51 }; @@ -1065,27 +1063,27 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) switch (yytype) { case 41: /* exp */ -#line 61 "ExpressionParser.y" /* yacc.c:1257 */ +#line 62 "ExpressionParser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1071 "ExpressionParser.tab.c" /* yacc.c:1257 */ +#line 1069 "ExpressionParser.tab.c" /* yacc.c:1257 */ break; case 44: /* args */ -#line 62 "ExpressionParser.y" /* yacc.c:1257 */ +#line 63 "ExpressionParser.y" /* yacc.c:1257 */ { std::vector::const_iterator i = ((*yyvaluep).arguments).begin(); while (i != ((*yyvaluep).arguments).end()) { delete *i; ++i; } } -#line 1077 "ExpressionParser.tab.c" /* yacc.c:1257 */ +#line 1075 "ExpressionParser.tab.c" /* yacc.c:1257 */ break; case 46: /* cond */ -#line 61 "ExpressionParser.y" /* yacc.c:1257 */ +#line 62 "ExpressionParser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1083 "ExpressionParser.tab.c" /* yacc.c:1257 */ +#line 1081 "ExpressionParser.tab.c" /* yacc.c:1257 */ break; case 47: /* unit_exp */ -#line 61 "ExpressionParser.y" /* yacc.c:1257 */ +#line 62 "ExpressionParser.y" /* yacc.c:1257 */ { delete ((*yyvaluep).expr); } -#line 1089 "ExpressionParser.tab.c" /* yacc.c:1257 */ +#line 1087 "ExpressionParser.tab.c" /* yacc.c:1257 */ break; @@ -1347,461 +1345,461 @@ yyreduce: switch (yyn) { case 2: -#line 68 "ExpressionParser.y" /* yacc.c:1646 */ +#line 69 "ExpressionParser.y" /* yacc.c:1646 */ { ScanResult = (yyvsp[0].expr); valueExpression = true; } -#line 1353 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1351 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 3: -#line 69 "ExpressionParser.y" /* yacc.c:1646 */ +#line 70 "ExpressionParser.y" /* yacc.c:1646 */ { ScanResult = (yyvsp[0].expr); unitExpression = true; } -#line 1359 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1357 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 4: -#line 72 "ExpressionParser.y" /* yacc.c:1646 */ +#line 73 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 1365 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1363 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 5: -#line 73 "ExpressionParser.y" /* yacc.c:1646 */ +#line 74 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new StringExpression(DocumentObject, (yyvsp[0].string)); } -#line 1371 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1369 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 6: -#line 74 "ExpressionParser.y" /* yacc.c:1646 */ +#line 75 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new VariableExpression(DocumentObject, (yyvsp[0].path)); } -#line 1377 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1375 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 7: -#line 75 "ExpressionParser.y" /* yacc.c:1646 */ +#line 76 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[0].expr), OperatorExpression::NEG, new NumberExpression(DocumentObject, -1)); } -#line 1383 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1381 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 8: -#line 76 "ExpressionParser.y" /* yacc.c:1646 */ +#line 77 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[0].expr), OperatorExpression::POS, new NumberExpression(DocumentObject, 1)); } -#line 1389 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1387 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 9: -#line 77 "ExpressionParser.y" /* yacc.c:1646 */ +#line 78 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::ADD, (yyvsp[0].expr)); } -#line 1395 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1393 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 10: -#line 78 "ExpressionParser.y" /* yacc.c:1646 */ +#line 79 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::SUB, (yyvsp[0].expr)); } -#line 1401 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1399 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 11: -#line 79 "ExpressionParser.y" /* yacc.c:1646 */ +#line 80 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::MUL, (yyvsp[0].expr)); } -#line 1407 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1405 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 12: -#line 80 "ExpressionParser.y" /* yacc.c:1646 */ +#line 81 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::DIV, (yyvsp[0].expr)); } -#line 1413 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1411 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 13: -#line 81 "ExpressionParser.y" /* yacc.c:1646 */ +#line 82 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::DIV, (yyvsp[0].expr)); } -#line 1419 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1417 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 14: -#line 82 "ExpressionParser.y" /* yacc.c:1646 */ +#line 83 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::POW, (yyvsp[0].expr)); } -#line 1425 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1423 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 15: -#line 83 "ExpressionParser.y" /* yacc.c:1646 */ +#line 84 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[-1].expr); } -#line 1431 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1429 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 16: -#line 84 "ExpressionParser.y" /* yacc.c:1646 */ +#line 85 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new AggregateFunctionExpression(DocumentObject, (yyvsp[-2].func), (yyvsp[-1].arguments)); } -#line 1437 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1435 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 17: -#line 85 "ExpressionParser.y" /* yacc.c:1646 */ +#line 86 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new ConditionalExpression(DocumentObject, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 1443 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1441 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 18: -#line 88 "ExpressionParser.y" /* yacc.c:1646 */ +#line 89 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new NumberExpression(DocumentObject, (yyvsp[0].fvalue)); } -#line 1449 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1447 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 19: -#line 89 "ExpressionParser.y" /* yacc.c:1646 */ +#line 90 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new NumberExpression(DocumentObject, (yyvsp[0].fvalue)); } -#line 1455 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1453 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 20: -#line 90 "ExpressionParser.y" /* yacc.c:1646 */ +#line 91 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new NumberExpression(DocumentObject, (double)(yyvsp[0].ivalue)); } -#line 1461 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1459 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 21: -#line 93 "ExpressionParser.y" /* yacc.c:1646 */ +#line 94 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[0].expr); } -#line 1467 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1465 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 22: -#line 94 "ExpressionParser.y" /* yacc.c:1646 */ +#line 95 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new ConstantExpression(DocumentObject, (yyvsp[0].constant).name, (yyvsp[0].constant).fvalue); } -#line 1473 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1471 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 23: -#line 95 "ExpressionParser.y" /* yacc.c:1646 */ +#line 96 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-1].expr), OperatorExpression::UNIT, (yyvsp[0].expr)); } -#line 1479 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1477 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 24: -#line 96 "ExpressionParser.y" /* yacc.c:1646 */ +#line 97 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, new ConstantExpression(DocumentObject, (yyvsp[-1].constant).name, (yyvsp[-1].constant).fvalue), OperatorExpression::UNIT, (yyvsp[0].expr)); } -#line 1485 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1483 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 25: -#line 99 "ExpressionParser.y" /* yacc.c:1646 */ +#line 100 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.arguments).push_back((yyvsp[0].expr)); } -#line 1491 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1489 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 26: -#line 100 "ExpressionParser.y" /* yacc.c:1646 */ +#line 101 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.arguments).push_back((yyvsp[0].expr)); } -#line 1497 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1495 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 27: -#line 101 "ExpressionParser.y" /* yacc.c:1646 */ +#line 102 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[-2].arguments).push_back((yyvsp[0].expr)); (yyval.arguments) = (yyvsp[-2].arguments); } -#line 1503 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1501 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 28: -#line 102 "ExpressionParser.y" /* yacc.c:1646 */ +#line 103 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[-2].arguments).push_back((yyvsp[0].expr)); (yyval.arguments) = (yyvsp[-2].arguments); } -#line 1509 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1507 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 29: -#line 105 "ExpressionParser.y" /* yacc.c:1646 */ +#line 106 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new RangeExpression(DocumentObject, (yyvsp[-2].string), (yyvsp[0].string)); } -#line 1515 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1513 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 30: -#line 106 "ExpressionParser.y" /* yacc.c:1646 */ +#line 107 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new RangeExpression(DocumentObject, (yyvsp[-2].string), (yyvsp[0].string)); } -#line 1521 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1519 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 31: -#line 107 "ExpressionParser.y" /* yacc.c:1646 */ +#line 108 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new RangeExpression(DocumentObject, (yyvsp[-2].string), (yyvsp[0].string)); } -#line 1527 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1525 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 32: -#line 108 "ExpressionParser.y" /* yacc.c:1646 */ +#line 109 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new RangeExpression(DocumentObject, (yyvsp[-2].string), (yyvsp[0].string)); } -#line 1533 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1531 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 33: -#line 111 "ExpressionParser.y" /* yacc.c:1646 */ +#line 112 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::EQ, (yyvsp[0].expr)); } -#line 1539 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1537 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 34: -#line 112 "ExpressionParser.y" /* yacc.c:1646 */ +#line 113 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::NEQ, (yyvsp[0].expr)); } -#line 1545 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1543 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 35: -#line 113 "ExpressionParser.y" /* yacc.c:1646 */ +#line 114 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::LT, (yyvsp[0].expr)); } -#line 1551 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1549 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 36: -#line 114 "ExpressionParser.y" /* yacc.c:1646 */ +#line 115 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::GT, (yyvsp[0].expr)); } -#line 1557 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1555 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 37: -#line 115 "ExpressionParser.y" /* yacc.c:1646 */ +#line 116 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::GTE, (yyvsp[0].expr)); } -#line 1563 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1561 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 38: -#line 116 "ExpressionParser.y" /* yacc.c:1646 */ +#line 117 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::LTE, (yyvsp[0].expr)); } -#line 1569 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1567 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 39: -#line 119 "ExpressionParser.y" /* yacc.c:1646 */ +#line 120 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new UnitExpression(DocumentObject, (yyvsp[0].quantity).scaler, (yyvsp[0].quantity).unitStr ); } -#line 1575 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1573 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 40: -#line 120 "ExpressionParser.y" /* yacc.c:1646 */ +#line 121 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, new NumberExpression(DocumentObject, (yyvsp[-2].fvalue)), OperatorExpression::DIV, (yyvsp[0].expr)); } -#line 1581 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1579 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 41: -#line 121 "ExpressionParser.y" /* yacc.c:1646 */ +#line 122 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::DIV, (yyvsp[0].expr)); } -#line 1587 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1585 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 42: -#line 122 "ExpressionParser.y" /* yacc.c:1646 */ +#line 123 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::MUL, (yyvsp[0].expr)); } -#line 1593 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1591 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 43: -#line 123 "ExpressionParser.y" /* yacc.c:1646 */ +#line 124 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-2].expr), OperatorExpression::POW, (yyvsp[0].expr)); } -#line 1599 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1597 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 44: -#line 124 "ExpressionParser.y" /* yacc.c:1646 */ +#line 125 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = new OperatorExpression(DocumentObject, (yyvsp[-3].expr), OperatorExpression::POW, new OperatorExpression(DocumentObject, (yyvsp[0].expr), OperatorExpression::NEG, new NumberExpression(DocumentObject, -1))); } -#line 1605 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1603 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 45: -#line 125 "ExpressionParser.y" /* yacc.c:1646 */ +#line 126 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.expr) = (yyvsp[-1].expr); } -#line 1611 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1609 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 46: -#line 128 "ExpressionParser.y" /* yacc.c:1646 */ +#line 129 "ExpressionParser.y" /* yacc.c:1646 */ { /* Path to property within document object */ (yyval.path) = ObjectIdentifier(DocumentObject); (yyval.path).addComponents((yyvsp[0].components)); } -#line 1620 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1618 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 47: -#line 132 "ExpressionParser.y" /* yacc.c:1646 */ +#line 133 "ExpressionParser.y" /* yacc.c:1646 */ { /* Path to property within document object */ (yyval.path) = ObjectIdentifier(DocumentObject); (yyval.path).setDocumentObjectName((yyvsp[-2].string_or_identifier), true); (yyval.path).addComponents((yyvsp[0].components)); } -#line 1630 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1628 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 48: -#line 137 "ExpressionParser.y" /* yacc.c:1646 */ +#line 138 "ExpressionParser.y" /* yacc.c:1646 */ { /* Path to property from an external document, within a named document object */ (yyval.path) = ObjectIdentifier(DocumentObject); (yyval.path).setDocumentName((yyvsp[-2].string_or_identifier), true); (yyval.path).addComponents((yyvsp[0].components)); } -#line 1640 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1638 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 49: -#line 142 "ExpressionParser.y" /* yacc.c:1646 */ +#line 143 "ExpressionParser.y" /* yacc.c:1646 */ { /* Path to property from an external document, within a named document object */ (yyval.path) = ObjectIdentifier(DocumentObject); (yyval.path).setDocumentName((yyvsp[-4].string_or_identifier), true); (yyval.path).setDocumentObjectName((yyvsp[-2].string_or_identifier), true); (yyval.path).addComponents((yyvsp[0].components)); } -#line 1651 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1649 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 50: -#line 150 "ExpressionParser.y" /* yacc.c:1646 */ +#line 151 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.ivalue) = (yyvsp[0].ivalue); } -#line 1657 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1655 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 51: -#line 151 "ExpressionParser.y" /* yacc.c:1646 */ +#line 152 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.ivalue) = (yyvsp[0].fvalue); } -#line 1663 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1661 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 52: -#line 155 "ExpressionParser.y" /* yacc.c:1646 */ +#line 156 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1669 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1667 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 53: -#line 156 "ExpressionParser.y" /* yacc.c:1646 */ +#line 157 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1675 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1673 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 54: -#line 157 "ExpressionParser.y" /* yacc.c:1646 */ +#line 158 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::ArrayComponent((yyvsp[-3].string), (yyvsp[-1].ivalue))); } -#line 1681 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1679 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 55: -#line 158 "ExpressionParser.y" /* yacc.c:1646 */ +#line 159 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::ArrayComponent((yyvsp[-5].string), (yyvsp[-3].ivalue))); (yyval.components) = (yyvsp[0].components); } -#line 1687 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1685 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 56: -#line 159 "ExpressionParser.y" /* yacc.c:1646 */ +#line 160 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-3].string), ObjectIdentifier::String((yyvsp[-1].string), true))); } -#line 1693 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1691 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 57: -#line 160 "ExpressionParser.y" /* yacc.c:1646 */ +#line 161 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-3].string), (yyvsp[-1].string))); } -#line 1699 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1697 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 58: -#line 161 "ExpressionParser.y" /* yacc.c:1646 */ +#line 162 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-5].string), ObjectIdentifier::String((yyvsp[-3].string), true))); (yyval.components) = (yyvsp[0].components); } -#line 1705 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1703 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 59: -#line 162 "ExpressionParser.y" /* yacc.c:1646 */ +#line 163 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-5].string), (yyvsp[-3].string))); (yyval.components) = (yyvsp[0].components); } -#line 1711 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1709 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 60: -#line 163 "ExpressionParser.y" /* yacc.c:1646 */ +#line 164 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[-2].string))); (yyval.components) = (yyvsp[0].components); } -#line 1717 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1715 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 61: -#line 166 "ExpressionParser.y" /* yacc.c:1646 */ +#line 167 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1723 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1721 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 62: -#line 167 "ExpressionParser.y" /* yacc.c:1646 */ +#line 168 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1729 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1727 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 63: -#line 168 "ExpressionParser.y" /* yacc.c:1646 */ +#line 169 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[0].string))); } -#line 1735 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1733 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 64: -#line 169 "ExpressionParser.y" /* yacc.c:1646 */ +#line 170 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::ArrayComponent((yyvsp[-3].string), (yyvsp[-1].ivalue))); } -#line 1741 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1739 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 65: -#line 170 "ExpressionParser.y" /* yacc.c:1646 */ +#line 171 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::ArrayComponent((yyvsp[-5].string), (yyvsp[-3].ivalue))); (yyval.components) = (yyvsp[0].components); } -#line 1747 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1745 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 66: -#line 171 "ExpressionParser.y" /* yacc.c:1646 */ +#line 172 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-3].string), ObjectIdentifier::String((yyvsp[-1].string), true))); } -#line 1753 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1751 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 67: -#line 172 "ExpressionParser.y" /* yacc.c:1646 */ +#line 173 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-3].string), (yyvsp[-1].string))); } -#line 1759 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1757 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 68: -#line 173 "ExpressionParser.y" /* yacc.c:1646 */ +#line 174 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-5].string), ObjectIdentifier::String((yyvsp[-3].string), true))); (yyval.components) = (yyvsp[0].components); } -#line 1765 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1763 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 69: -#line 174 "ExpressionParser.y" /* yacc.c:1646 */ +#line 175 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::MapComponent((yyvsp[-5].string), (yyvsp[-3].string))); (yyval.components) = (yyvsp[0].components); } -#line 1771 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1769 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 70: -#line 175 "ExpressionParser.y" /* yacc.c:1646 */ +#line 176 "ExpressionParser.y" /* yacc.c:1646 */ { (yyvsp[0].components).push_front(ObjectIdentifier::Component::SimpleComponent((yyvsp[-2].string))); (yyval.components) = (yyvsp[0].components); } -#line 1777 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1775 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 71: -#line 178 "ExpressionParser.y" /* yacc.c:1646 */ +#line 179 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.string_or_identifier) = ObjectIdentifier::String((yyvsp[0].string), true); } -#line 1783 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1781 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 72: -#line 179 "ExpressionParser.y" /* yacc.c:1646 */ +#line 180 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.string_or_identifier) = ObjectIdentifier::String((yyvsp[0].string)); } -#line 1789 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1787 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 73: -#line 182 "ExpressionParser.y" /* yacc.c:1646 */ +#line 183 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.string_or_identifier) = ObjectIdentifier::String((yyvsp[0].string), true); } -#line 1795 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1793 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; case 74: -#line 183 "ExpressionParser.y" /* yacc.c:1646 */ +#line 184 "ExpressionParser.y" /* yacc.c:1646 */ { (yyval.string_or_identifier) = ObjectIdentifier::String((yyvsp[0].string), true); } -#line 1801 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1799 "ExpressionParser.tab.c" /* yacc.c:1646 */ break; -#line 1805 "ExpressionParser.tab.c" /* yacc.c:1646 */ +#line 1803 "ExpressionParser.tab.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -2029,5 +2027,5 @@ yyreturn: #endif return yyresult; } -#line 186 "ExpressionParser.y" /* yacc.c:1906 */ +#line 187 "ExpressionParser.y" /* yacc.c:1906 */ diff --git a/src/Mod/Spreadsheet/App/ExpressionParser.y b/src/Mod/Spreadsheet/App/ExpressionParser.y index 750a14101..50357b7e6 100644 --- a/src/Mod/Spreadsheet/App/ExpressionParser.y +++ b/src/Mod/Spreadsheet/App/ExpressionParser.y @@ -50,9 +50,10 @@ std::stack functions; /**< Function %left NUM %left INTEGER %left CONSTANT + %left EQ NEQ LT GT GTE LTE + %left '?' ':' %left MINUSSIGN '+' %left '*' '/' - %left '?' ':' EQ NEQ LT GT GTE LTE %left NEG /* negation--unary minus */ %left POS /* unary plus */ %right '^' /* exponentiation */ diff --git a/src/Mod/Spreadsheet/TestSpreadsheet.py b/src/Mod/Spreadsheet/TestSpreadsheet.py index 6d3f6d0a8..ea1354993 100644 --- a/src/Mod/Spreadsheet/TestSpreadsheet.py +++ b/src/Mod/Spreadsheet/TestSpreadsheet.py @@ -78,6 +78,20 @@ class SpreadsheetCases(unittest.TestCase): self.assertEqual(sheet.A23, 1) self.assertEqual(sheet.A24, 1) + def testPrecedence(self): + """ Precedence -- test precedence for relational operators and conditional operator. """ + sheet = self.doc.addObject('Spreadsheet::Sheet','Spreadsheet') + sheet.set('A1', '=1 < 2 ? 3 : 4') + sheet.set('A2', '=1 + 2 < 3 + 4 ? 5 + 6 : 7 + 8') + sheet.set('A3', '=1 + 2 * 1 < 3 + 4 ? 5 * 2 + 6 * 3 + 2 ^ 4 : 7 * 2 + 8 * 3 + 2 ^ 3') + self.doc.recompute() + self.assertEqual(sheet.getContents("A1"), "=1 < 2 ? 3 : 4") + self.assertEqual(sheet.getContents("A2"), "=1 + 2 < 3 + 4 ? 5 + 6 : 7 + 8") + self.assertEqual(sheet.getContents("A3"), "=1 + 2 * 1 < 3 + 4 ? 5 * 2 + 6 * 3 + 2 ^ 4 : 7 * 2 + 8 * 3 + 2 ^ 3") + self.assertEqual(sheet.A1, 3) + self.assertEqual(sheet.A2, 11) + self.assertEqual(sheet.A3, 44) + def testRemoveRows(self): """ Removing rows -- check renaming of internal cells """ sheet = self.doc.addObject('Spreadsheet::Sheet','Spreadsheet')