From 6d29e571369686fd2ec71cabec9f71a5040db59f Mon Sep 17 00:00:00 2001 From: Churkin Aleksey Date: Wed, 13 May 2026 14:16:20 +0300 Subject: [PATCH 1/3] compiler: allow unnamed -> named tuples conversions on name match It's useful to be able to not repeat yourself. If tuple names exactly match variable names we want to assign we should allow to write unnamed tuple. See tests for more details. --- doc/source/reference/language/tuples.rst | 42 + .../tutorials/11_tuples_and_variants.rst | 27 + include/daScript/ast/ast_expressions.h | 1 + include/daScript/ast/ast_infer_type.h | 3 + src/ast/ast.cpp | 1 + src/ast/ast_infer_type.cpp | 21 + src/ast/ast_infer_type_function.cpp | 41 + src/ast/ast_infer_type_make.cpp | 17 + src/builtin/module_builtin_ast_serialize.cpp | 5 +- src/parser/ds2_lexer.cpp | 12 +- src/parser/ds2_parser.cpp | 92 +- src/parser/ds2_parser.ypp | 2 + src/parser/ds_parser.cpp | 92 +- src/parser/ds_parser.ypp | 2 + src/parser/lex2.yy.h | 6 +- src/parser/parser_impl.cpp | 12 + src/parser/parser_impl.h | 1 + .../failed_tuple_shorthand_mismatch.das | 11 + tests/language/tuple.das | 60 + tutorials/language/11_tuples_and_variants.das | 26 + utils/dasFormatter/ds_parser.cpp | 5146 +++++++++-------- utils/dasFormatter/ds_parser.ypp | 2 + 22 files changed, 2948 insertions(+), 2674 deletions(-) create mode 100644 tests/language/failed_tuple_shorthand_mismatch.das diff --git a/doc/source/reference/language/tuples.rst b/doc/source/reference/language/tuples.rst index 93e589241b..9a1317f883 100644 --- a/doc/source/reference/language/tuples.rst +++ b/doc/source/reference/language/tuples.rst @@ -42,6 +42,48 @@ tuple directly: Mixing named and positional fields in the same literal is **not** supported — either every field is named or none are. +Shorthand promotion +------------------- + +When every element of a positional tuple literal is a bare variable reference, +the compiler may promote it to a named tuple by taking the field names from the +variables. This only fires when the target type is unambiguously a named tuple +and the variable names match the field names in order: + +.. code-block:: das + + let eid = 7 + let distSq = 2.5 + var t : tuple = (eid, distSq) // ok, promoted + var arr : array> + arr |> push((eid, distSq)) // ok, promoted + +Promotion is a fallback: if a matching overload already exists for the unnamed +tuple type, that overload wins and no promotion happens. If you want the named +overload, use the explicit named-field literal: + +.. code-block:: das + + def overload_pick(x : tuple) { return 1 } + def overload_pick(x : tuple) { return 2 } + let x = 1 + let y = 2.0 + overload_pick((x, y)) // returns 1: unnamed overload wins + overload_pick((x=x, y=y)) // returns 2: explicit named literal + +A name mismatch fails compilation rather than silently constructing the +unnamed tuple: + +.. code-block:: das + + let foo = 1 + let bar = 1.1 + var arr : array> + // arr |> push((foo, bar)) // error: function_not_found + +Promotion does not fire when any element is not a bare variable reference, e.g. +``(a, a+1)`` stays unnamed. + Tuple elements can be accessed via nameless fields, i.e. _ followed by the 0 base field index: .. code-block:: das diff --git a/doc/source/reference/tutorials/11_tuples_and_variants.rst b/doc/source/reference/tutorials/11_tuples_and_variants.rst index 60745b8d11..bac396a2ad 100644 --- a/doc/source/reference/tutorials/11_tuples_and_variants.rst +++ b/doc/source/reference/tutorials/11_tuples_and_variants.rst @@ -58,6 +58,33 @@ Give a tuple named fields for readability:: let p = Point2D(x=3.0, y=4.0) print("{p.x}, {p.y}\n") +Shorthand: unnamed → named promotion +==================================== + +When the target type is a named tuple and every element of a positional literal +is a bare variable reference whose name matches the field name in order, the +compiler promotes the literal to the named tuple — no need to repeat the +field names:: + + let eid = 7 + let distSq = 2.5 + var hit : tuple = (eid, distSq) // ok, promoted + + var hits : array> + hits |> push((eid, distSq)) // ok, promoted + +Promotion is fallback-only: if an unnamed-tuple overload already matches, it +wins. Use the explicit ``(name = value)`` literal to force the named overload:: + + def overload_pick(x : tuple) { return 1 } + def overload_pick(x : tuple) { return 2 } + overload_pick((x, y)) // 1 — unnamed overload wins + overload_pick((x=x, y=y)) // 2 — explicit named literal + +A name mismatch fails compilation (no silent fallback to unnamed). Mixed +expressions like ``(a, a + 1)`` are not bare variable references and never +promote. + Destructuring ============= diff --git a/include/daScript/ast/ast_expressions.h b/include/daScript/ast/ast_expressions.h index f8536f10ca..68ba40812b 100644 --- a/include/daScript/ast/ast_expressions.h +++ b/include/daScript/ast/ast_expressions.h @@ -1494,6 +1494,7 @@ namespace das virtual void gc_collect ( gc_root * target, gc_root * from ) override; bool isKeyValue = false; vector recordNames; + vector shorthandRecordNames; }; struct DAS_API ExprArrayComprehension : Expression { diff --git a/include/daScript/ast/ast_infer_type.h b/include/daScript/ast/ast_infer_type.h index ae26bba7c5..3197972a10 100644 --- a/include/daScript/ast/ast_infer_type.h +++ b/include/daScript/ast/ast_infer_type.h @@ -202,6 +202,8 @@ namespace das { void findMatchingFunctionsAndGenerics(MatchingFunctions &resultFunctions, MatchingFunctions &resultGenerics, const string &name, const vector &types, bool inferBlock = false, bool visCheck = true) const; + bool trySeedTupleShorthand(ExprLooksLikeCall *expr, bool visCheck); + void reportDualFunctionNotFound(const string &name, const string &extra, const LineInfo &at, const MatchingFunctions &candidateFunctions, const vector &types, const vector &types2, bool inferAuto, bool inferBlocks, bool reportDetails, @@ -500,6 +502,7 @@ namespace das { virtual void preVisit(ExprLet *expr) override; virtual void preVisitLet(ExprLet *expr, const VariablePtr &var, bool last) override; + virtual void preVisitLetInit(ExprLet *expr, const VariablePtr &var, Expression *init) override; bool isEmptyInit(const VariablePtr &var) const; virtual VariablePtr visitLet(ExprLet *expr, const VariablePtr &var, bool last) override; ExpressionPtr promoteToCloneToMove(const VariablePtr &var); diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp index aa42de2792..b51df0e138 100644 --- a/src/ast/ast.cpp +++ b/src/ast/ast.cpp @@ -2869,6 +2869,7 @@ namespace das { cexpr->values.push_back(val->clone()); } cexpr->recordNames = recordNames; + cexpr->shorthandRecordNames = shorthandRecordNames; if ( makeType ) { cexpr->makeType = new TypeDecl(*makeType); } diff --git a/src/ast/ast_infer_type.cpp b/src/ast/ast_infer_type.cpp index 6bc18aa7d5..4b32cd29d0 100644 --- a/src/ast/ast_infer_type.cpp +++ b/src/ast/ast_infer_type.cpp @@ -389,9 +389,26 @@ namespace das { } } } + + static void seedTupleShorthandFromTargetType(const TypeDeclPtr &targetType, Expression *init) { + if (!targetType || !init) return; + if (targetType->baseType != Type::tTuple) return; + if (!init->rtti_isMakeTuple()) return; + auto mkt = static_cast(init); + if (mkt->shorthandRecordNames.empty() || mkt->recordType) return; + if (targetType->argNames.size() != mkt->shorthandRecordNames.size()) return; + for (size_t i = 0, n = targetType->argNames.size(); i != n; ++i) { + if (targetType->argNames[i] != mkt->shorthandRecordNames[i]) return; + } + mkt->recordType = new TypeDecl(*targetType); + mkt->recordType->ref = false; + mkt->recordType->constant = false; + } + void InferTypes::preVisitGlobalLetInit(const VariablePtr &var, Expression *init) { Visitor::preVisitGlobalLetInit(var, init); globalVar = var; + seedTupleShorthandFromTargetType(var->type, init); } ExpressionPtr InferTypes::visitGlobalLetInit(const VariablePtr &var, Expression *init) { globalVar = nullptr; @@ -4935,6 +4952,10 @@ namespace das { local.push_back(var); } } + void InferTypes::preVisitLetInit(ExprLet *expr, const VariablePtr &var, Expression *init) { + Visitor::preVisitLetInit(expr, var, init); + seedTupleShorthandFromTargetType(var->type, init); + } VariablePtr InferTypes::visitLet(ExprLet *expr, const VariablePtr &var, bool last) { if (var->type && var->type->isExprType()) { return Visitor::visitLet(expr, var, last); diff --git a/src/ast/ast_infer_type_function.cpp b/src/ast/ast_infer_type_function.cpp index 2986bbb75e..de576da91e 100644 --- a/src/ast/ast_infer_type_function.cpp +++ b/src/ast/ast_infer_type_function.cpp @@ -1083,6 +1083,42 @@ namespace das { int32_t *depth; }; + bool InferTypes::trySeedTupleShorthand(ExprLooksLikeCall *expr, bool visCheck) { + vector shorthandIndices; + for (size_t ai = 0, ais = expr->arguments.size(); ai != ais; ++ai) { + auto arg = expr->arguments[ai]; + if (!arg || !arg->rtti_isMakeTuple() || !arg->type) continue; + auto mkt = static_cast(arg); + if (mkt->shorthandRecordNames.empty() || mkt->recordType) continue; + if (mkt->type->baseType != Type::tTuple) continue; + if (mkt->type->argTypes.size() != mkt->shorthandRecordNames.size()) continue; + if (!mkt->type->argNames.empty()) continue; + shorthandIndices.push_back(ai); + } + if (shorthandIndices.empty()) return false; + vector hypTypes; + hypTypes.reserve(expr->arguments.size()); + for (auto arg : expr->arguments) hypTypes.push_back(arg ? arg->type : nullptr); + for (size_t idx : shorthandIndices) { + auto mkt = static_cast(expr->arguments[idx]); + auto hyp = new TypeDecl(*mkt->type); + hyp->argNames = mkt->shorthandRecordNames; + hypTypes[idx] = hyp; + } + MatchingFunctions hypFns, hypGens; + findMatchingFunctionsAndGenerics(hypFns, hypGens, expr->name, hypTypes, true, visCheck); + applyLSP(hypTypes, hypFns); + if (hypFns.size() + hypGens.size() != 1) return false; + for (size_t idx : shorthandIndices) { + auto mkt = static_cast(expr->arguments[idx]); + mkt->recordType = new TypeDecl(*mkt->type); + mkt->recordType->argNames = mkt->shorthandRecordNames; + mkt->recordType->ref = false; + mkt->recordType->constant = false; + } + return true; + } + FunctionPtr InferTypes::inferFunctionCall(ExprLooksLikeCall *expr, InferCallError cerr, Function *lookupFunction, bool failOnMissingCtor, bool visCheck) { if ( inferDepth > 1 ) { error("infer expression depth exceeded maximum allowed", "", "", @@ -1100,6 +1136,11 @@ namespace das { if (!lookupFunction) { findMatchingFunctionsAndGenerics(functions, generics, expr->name, types, true, visCheck); applyLSP(types, functions); + if (functions.empty() && generics.empty() && trySeedTupleShorthand(expr, visCheck)) { + reportAstChanged(); + if (func) func->notInferred(); + return nullptr; + } } else { functions.push_back(lookupFunction); } diff --git a/src/ast/ast_infer_type_make.cpp b/src/ast/ast_infer_type_make.cpp index 7836085ff7..7f4aef0389 100644 --- a/src/ast/ast_infer_type_make.cpp +++ b/src/ast/ast_infer_type_make.cpp @@ -1121,6 +1121,23 @@ namespace das { return Visitor::visit(expr); } } + if (expr->recordType && expr->recordType->baseType == Type::tTuple + && !expr->shorthandRecordNames.empty() + && expr->recordNames.empty() + && expr->recordType->argNames.size() == expr->shorthandRecordNames.size()) { + bool matches = true; + for (size_t i = 0, n = expr->shorthandRecordNames.size(); i != n; ++i) { + if (expr->shorthandRecordNames[i] != expr->recordType->argNames[i]) { + matches = false; + break; + } + } + if (matches) { + expr->recordNames = expr->shorthandRecordNames; + expr->shorthandRecordNames.clear(); + reportAstChanged(); + } + } if (expr->recordType) { if (!expr->recordType->isTuple()) { error("internal error. ExprMakeTuple with non-tuple record type", "", "", diff --git a/src/builtin/module_builtin_ast_serialize.cpp b/src/builtin/module_builtin_ast_serialize.cpp index 4406180532..0fdfb93175 100644 --- a/src/builtin/module_builtin_ast_serialize.cpp +++ b/src/builtin/module_builtin_ast_serialize.cpp @@ -1891,7 +1891,7 @@ namespace das { void SerializeVisitor::preVisit ( ExprMakeTuple * expr ) { serializeMakeArray(expr); - ser << expr->isKeyValue << expr->recordNames; + ser << expr->isKeyValue << expr->recordNames << expr->shorthandRecordNames; } void SerializeVisitor::preVisit ( ExprArrayComprehension * expr ) { @@ -2668,8 +2668,7 @@ namespace das { } uint32_t AstSerializer::getVersion () { - // bumped for per-loop annotations on ExprFor/ExprWhile. - static constexpr uint32_t currentVersion = 82; + static constexpr uint32_t currentVersion = 83; return currentVersion; } diff --git a/src/parser/ds2_lexer.cpp b/src/parser/ds2_lexer.cpp index fd1b5a5243..df733ae3d2 100644 --- a/src/parser/ds2_lexer.cpp +++ b/src/parser/ds2_lexer.cpp @@ -1,6 +1,6 @@ -#line 1 "ds2_lexer.cpp" +#line 2 "ds2_lexer.cpp" -#line 3 "ds2_lexer.cpp" +#line 4 "ds2_lexer.cpp" #define YY_INT_ALIGNED short int @@ -1219,11 +1219,11 @@ void das_accept_cpp_comment ( vector & crdi, yyscan_t scanner, #define YY_EXTRA_TYPE das::DasParserState * -#line 1222 "ds2_lexer.cpp" +#line 1223 "ds2_lexer.cpp" #define YY_NO_UNISTD_H 1 /* %option debug */ -#line 1226 "ds2_lexer.cpp" +#line 1227 "ds2_lexer.cpp" #define INITIAL 0 #define normal 1 @@ -1508,7 +1508,7 @@ YY_DECL #line 78 "ds2_lexer.lpp" -#line 1511 "ds2_lexer.cpp" +#line 1512 "ds2_lexer.cpp" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -3261,7 +3261,7 @@ YY_RULE_SETUP #line 786 "ds2_lexer.lpp" ECHO; YY_BREAK -#line 3264 "ds2_lexer.cpp" +#line 3265 "ds2_lexer.cpp" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(include): yyterminate(); diff --git a/src/parser/ds2_parser.cpp b/src/parser/ds2_parser.cpp index d65cbd480a..ad8ade50b0 100644 --- a/src/parser/ds2_parser.cpp +++ b/src/parser/ds2_parser.cpp @@ -1125,51 +1125,51 @@ static const yytype_int16 yyrline[] = 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, - 2173, 2179, 2180, 2181, 2182, 2183, 2196, 2205, 2206, 2207, - 2208, 2209, 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, - 2218, 2221, 2221, 2221, 2224, 2229, 2233, 2237, 2237, 2237, - 2242, 2245, 2249, 2249, 2249, 2254, 2257, 2258, 2259, 2260, - 2261, 2262, 2263, 2264, 2265, 2267, 2271, 2272, 2277, 2283, - 2289, 2298, 2301, 2304, 2313, 2314, 2315, 2316, 2317, 2318, - 2319, 2323, 2327, 2331, 2335, 2339, 2343, 2347, 2351, 2355, - 2362, 2363, 2367, 2368, 2369, 2373, 2374, 2378, 2379, 2380, - 2384, 2385, 2389, 2401, 2404, 2405, 2409, 2409, 2428, 2427, - 2442, 2441, 2458, 2470, 2479, 2489, 2490, 2491, 2492, 2493, - 2497, 2500, 2509, 2510, 2514, 2517, 2521, 2534, 2543, 2544, - 2548, 2551, 2555, 2568, 2569, 2573, 2579, 2585, 2594, 2597, - 2604, 2607, 2613, 2614, 2615, 2619, 2620, 2624, 2631, 2636, - 2645, 2651, 2662, 2669, 2678, 2681, 2684, 2691, 2694, 2699, - 2710, 2713, 2718, 2730, 2731, 2735, 2736, 2737, 2741, 2744, - 2747, 2747, 2767, 2770, 2770, 2788, 2793, 2801, 2802, 2806, - 2809, 2822, 2839, 2840, 2841, 2846, 2846, 2872, 2876, 2877, - 2878, 2882, 2892, 2895, 2901, 2902, 2906, 2907, 2911, 2912, - 2916, 2918, 2923, 2916, 2939, 2940, 2944, 2945, 2949, 2955, - 2956, 2957, 2958, 2962, 2963, 2964, 2968, 2971, 2977, 2979, - 2984, 2977, 3005, 3012, 3017, 3026, 3032, 3043, 3044, 3045, - 3046, 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, - 3056, 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, - 3066, 3067, 3068, 3069, 3073, 3074, 3075, 3076, 3077, 3078, - 3079, 3080, 3084, 3095, 3099, 3106, 3118, 3125, 3131, 3140, - 3145, 3155, 3165, 3175, 3188, 3189, 3190, 3191, 3192, 3196, - 3200, 3200, 3200, 3214, 3215, 3219, 3223, 3230, 3234, 3238, - 3242, 3249, 3252, 3270, 3271, 3275, 3276, 3277, 3278, 3279, - 3279, 3279, 3283, 3288, 3295, 3302, 3302, 3309, 3309, 3316, - 3320, 3324, 3329, 3334, 3339, 3344, 3348, 3352, 3357, 3361, - 3365, 3370, 3370, 3370, 3376, 3383, 3383, 3383, 3388, 3388, - 3388, 3394, 3394, 3394, 3399, 3404, 3404, 3404, 3409, 3409, - 3409, 3418, 3423, 3423, 3423, 3428, 3428, 3428, 3437, 3442, - 3442, 3442, 3447, 3447, 3447, 3456, 3456, 3456, 3462, 3462, - 3462, 3471, 3474, 3485, 3501, 3503, 3508, 3513, 3501, 3539, - 3541, 3546, 3552, 3539, 3578, 3580, 3585, 3590, 3578, 3631, - 3632, 3633, 3634, 3635, 3636, 3637, 3641, 3642, 3643, 3644, - 3645, 3649, 3656, 3663, 3669, 3675, 3682, 3689, 3695, 3704, - 3707, 3713, 3721, 3726, 3733, 3738, 3744, 3745, 3749, 3750, - 3754, 3754, 3754, 3762, 3762, 3762, 3769, 3769, 3769, 3780, - 3780, 3780, 3787, 3787, 3787, 3798, 3804, 3804, 3804, 3818, - 3837, 3837, 3837, 3847, 3847, 3847, 3861, 3861, 3861, 3875, - 3884, 3884, 3884, 3904, 3911, 3911, 3911, 3921, 3924, 3935, - 3941, 3964, 3972, 3992, 4017, 4018, 4022, 4023, 4028, 4031, - 4041 + 2173, 2179, 2180, 2181, 2182, 2183, 2198, 2207, 2208, 2209, + 2210, 2211, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, + 2220, 2223, 2223, 2223, 2226, 2231, 2235, 2239, 2239, 2239, + 2244, 2247, 2251, 2251, 2251, 2256, 2259, 2260, 2261, 2262, + 2263, 2264, 2265, 2266, 2267, 2269, 2273, 2274, 2279, 2285, + 2291, 2300, 2303, 2306, 2315, 2316, 2317, 2318, 2319, 2320, + 2321, 2325, 2329, 2333, 2337, 2341, 2345, 2349, 2353, 2357, + 2364, 2365, 2369, 2370, 2371, 2375, 2376, 2380, 2381, 2382, + 2386, 2387, 2391, 2403, 2406, 2407, 2411, 2411, 2430, 2429, + 2444, 2443, 2460, 2472, 2481, 2491, 2492, 2493, 2494, 2495, + 2499, 2502, 2511, 2512, 2516, 2519, 2523, 2536, 2545, 2546, + 2550, 2553, 2557, 2570, 2571, 2575, 2581, 2587, 2596, 2599, + 2606, 2609, 2615, 2616, 2617, 2621, 2622, 2626, 2633, 2638, + 2647, 2653, 2664, 2671, 2680, 2683, 2686, 2693, 2696, 2701, + 2712, 2715, 2720, 2732, 2733, 2737, 2738, 2739, 2743, 2746, + 2749, 2749, 2769, 2772, 2772, 2790, 2795, 2803, 2804, 2808, + 2811, 2824, 2841, 2842, 2843, 2848, 2848, 2874, 2878, 2879, + 2880, 2884, 2894, 2897, 2903, 2904, 2908, 2909, 2913, 2914, + 2918, 2920, 2925, 2918, 2941, 2942, 2946, 2947, 2951, 2957, + 2958, 2959, 2960, 2964, 2965, 2966, 2970, 2973, 2979, 2981, + 2986, 2979, 3007, 3014, 3019, 3028, 3034, 3045, 3046, 3047, + 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, + 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, + 3068, 3069, 3070, 3071, 3075, 3076, 3077, 3078, 3079, 3080, + 3081, 3082, 3086, 3097, 3101, 3108, 3120, 3127, 3133, 3142, + 3147, 3157, 3167, 3177, 3190, 3191, 3192, 3193, 3194, 3198, + 3202, 3202, 3202, 3216, 3217, 3221, 3225, 3232, 3236, 3240, + 3244, 3251, 3254, 3272, 3273, 3277, 3278, 3279, 3280, 3281, + 3281, 3281, 3285, 3290, 3297, 3304, 3304, 3311, 3311, 3318, + 3322, 3326, 3331, 3336, 3341, 3346, 3350, 3354, 3359, 3363, + 3367, 3372, 3372, 3372, 3378, 3385, 3385, 3385, 3390, 3390, + 3390, 3396, 3396, 3396, 3401, 3406, 3406, 3406, 3411, 3411, + 3411, 3420, 3425, 3425, 3425, 3430, 3430, 3430, 3439, 3444, + 3444, 3444, 3449, 3449, 3449, 3458, 3458, 3458, 3464, 3464, + 3464, 3473, 3476, 3487, 3503, 3505, 3510, 3515, 3503, 3541, + 3543, 3548, 3554, 3541, 3580, 3582, 3587, 3592, 3580, 3633, + 3634, 3635, 3636, 3637, 3638, 3639, 3643, 3644, 3645, 3646, + 3647, 3651, 3658, 3665, 3671, 3677, 3684, 3691, 3697, 3706, + 3709, 3715, 3723, 3728, 3735, 3740, 3746, 3747, 3751, 3752, + 3756, 3756, 3756, 3764, 3764, 3764, 3771, 3771, 3771, 3782, + 3782, 3782, 3789, 3789, 3789, 3800, 3806, 3806, 3806, 3820, + 3839, 3839, 3839, 3849, 3849, 3849, 3863, 3863, 3863, 3877, + 3886, 3886, 3886, 3906, 3913, 3913, 3913, 3923, 3926, 3937, + 3943, 3966, 3974, 3994, 4019, 4020, 4024, 4025, 4030, 4033, + 4043 }; #endif @@ -8260,10 +8260,12 @@ YYLTYPE yylloc = yyloc_default; if ( (yyvsp[-2].pExpression)->rtti_isSequence() ) { auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); mkt->values = sequenceToList((yyvsp[-2].pExpression)); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); (yyval.pExpression) = mkt; } else if ( (yyvsp[-1].b) ) { auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); mkt->values.push_back((yyvsp[-2].pExpression)); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); (yyval.pExpression) = mkt; } else { (yyval.pExpression) = (yyvsp[-2].pExpression); diff --git a/src/parser/ds2_parser.ypp b/src/parser/ds2_parser.ypp index 225f6d47be..314939a10b 100644 --- a/src/parser/ds2_parser.ypp +++ b/src/parser/ds2_parser.ypp @@ -2184,10 +2184,12 @@ expr_no_bracket if ( $subexpr->rtti_isSequence() ) { auto mkt = new ExprMakeTuple(tokAt(scanner,@subexpr)); mkt->values = sequenceToList($subexpr); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); $$ = mkt; } else if ( $comma ) { auto mkt = new ExprMakeTuple(tokAt(scanner,@subexpr)); mkt->values.push_back($subexpr); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); $$ = mkt; } else { $$ = $subexpr; diff --git a/src/parser/ds_parser.cpp b/src/parser/ds_parser.cpp index 6b8a6d4724..cd356da0ec 100644 --- a/src/parser/ds_parser.cpp +++ b/src/parser/ds_parser.cpp @@ -1126,51 +1126,51 @@ static const yytype_int16 yyrline[] = 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, - 2213, 2214, 2215, 2216, 2217, 2230, 2239, 2240, 2241, 2242, - 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2253, 2256, - 2257, 2260, 2260, 2260, 2263, 2268, 2272, 2276, 2276, 2276, - 2281, 2284, 2288, 2288, 2288, 2293, 2296, 2297, 2298, 2299, - 2300, 2301, 2302, 2303, 2304, 2306, 2310, 2311, 2316, 2320, - 2321, 2322, 2323, 2324, 2325, 2326, 2330, 2334, 2338, 2342, - 2346, 2350, 2354, 2358, 2362, 2369, 2370, 2371, 2375, 2376, - 2377, 2381, 2382, 2386, 2387, 2388, 2392, 2393, 2397, 2408, - 2411, 2414, 2414, 2418, 2418, 2437, 2436, 2452, 2451, 2465, - 2474, 2486, 2495, 2505, 2506, 2507, 2508, 2509, 2513, 2516, - 2525, 2526, 2530, 2533, 2536, 2551, 2560, 2561, 2565, 2568, - 2571, 2584, 2585, 2589, 2595, 2601, 2610, 2613, 2620, 2623, - 2629, 2630, 2631, 2635, 2636, 2640, 2647, 2652, 2661, 2667, - 2678, 2681, 2686, 2691, 2699, 2710, 2713, 2716, 2716, 2736, - 2737, 2741, 2742, 2743, 2747, 2750, 2750, 2769, 2772, 2775, - 2790, 2809, 2810, 2811, 2816, 2816, 2842, 2843, 2847, 2848, - 2848, 2852, 2853, 2854, 2858, 2868, 2873, 2868, 2885, 2890, - 2885, 2905, 2906, 2910, 2911, 2915, 2921, 2922, 2923, 2924, - 2928, 2929, 2930, 2934, 2937, 2943, 2948, 2943, 2968, 2975, - 2980, 2989, 2995, 3006, 3007, 3008, 3009, 3010, 3011, 3012, - 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, - 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, - 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3047, 3058, - 3062, 3069, 3081, 3088, 3094, 3103, 3108, 3111, 3121, 3134, - 3135, 3136, 3137, 3138, 3142, 3146, 3146, 3146, 3160, 3161, - 3165, 3169, 3176, 3180, 3187, 3188, 3189, 3190, 3191, 3205, - 3211, 3211, 3211, 3215, 3220, 3227, 3227, 3234, 3238, 3242, - 3247, 3252, 3257, 3262, 3266, 3270, 3275, 3279, 3283, 3288, - 3288, 3288, 3294, 3301, 3301, 3301, 3306, 3306, 3306, 3312, - 3312, 3312, 3317, 3322, 3322, 3322, 3327, 3327, 3327, 3336, - 3341, 3341, 3341, 3346, 3346, 3346, 3355, 3360, 3360, 3360, - 3365, 3365, 3365, 3374, 3374, 3374, 3380, 3380, 3380, 3389, - 3392, 3403, 3419, 3419, 3424, 3429, 3419, 3454, 3454, 3459, - 3465, 3454, 3490, 3490, 3495, 3500, 3490, 3540, 3541, 3542, - 3543, 3544, 3548, 3555, 3562, 3568, 3574, 3581, 3588, 3594, - 3603, 3606, 3612, 3620, 3625, 3632, 3637, 3644, 3649, 3655, - 3656, 3660, 3661, 3666, 3667, 3671, 3672, 3676, 3677, 3681, - 3682, 3683, 3687, 3688, 3689, 3693, 3694, 3698, 3704, 3711, - 3719, 3726, 3734, 3743, 3743, 3743, 3751, 3751, 3751, 3758, - 3758, 3758, 3769, 3769, 3769, 3780, 3783, 3789, 3803, 3809, - 3815, 3821, 3821, 3821, 3835, 3840, 3847, 3866, 3871, 3878, - 3878, 3878, 3888, 3888, 3888, 3902, 3902, 3902, 3916, 3925, - 3925, 3925, 3945, 3952, 3952, 3952, 3962, 3967, 3974, 3977, - 3983, 4002, 4011, 4019, 4039, 4064, 4065, 4069, 4070, 4075, - 4078, 4081, 4084, 4087, 4090 + 2213, 2214, 2215, 2216, 2217, 2232, 2241, 2242, 2243, 2244, + 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2255, 2258, + 2259, 2262, 2262, 2262, 2265, 2270, 2274, 2278, 2278, 2278, + 2283, 2286, 2290, 2290, 2290, 2295, 2298, 2299, 2300, 2301, + 2302, 2303, 2304, 2305, 2306, 2308, 2312, 2313, 2318, 2322, + 2323, 2324, 2325, 2326, 2327, 2328, 2332, 2336, 2340, 2344, + 2348, 2352, 2356, 2360, 2364, 2371, 2372, 2373, 2377, 2378, + 2379, 2383, 2384, 2388, 2389, 2390, 2394, 2395, 2399, 2410, + 2413, 2416, 2416, 2420, 2420, 2439, 2438, 2454, 2453, 2467, + 2476, 2488, 2497, 2507, 2508, 2509, 2510, 2511, 2515, 2518, + 2527, 2528, 2532, 2535, 2538, 2553, 2562, 2563, 2567, 2570, + 2573, 2586, 2587, 2591, 2597, 2603, 2612, 2615, 2622, 2625, + 2631, 2632, 2633, 2637, 2638, 2642, 2649, 2654, 2663, 2669, + 2680, 2683, 2688, 2693, 2701, 2712, 2715, 2718, 2718, 2738, + 2739, 2743, 2744, 2745, 2749, 2752, 2752, 2771, 2774, 2777, + 2792, 2811, 2812, 2813, 2818, 2818, 2844, 2845, 2849, 2850, + 2850, 2854, 2855, 2856, 2860, 2870, 2875, 2870, 2887, 2892, + 2887, 2907, 2908, 2912, 2913, 2917, 2923, 2924, 2925, 2926, + 2930, 2931, 2932, 2936, 2939, 2945, 2950, 2945, 2970, 2977, + 2982, 2991, 2997, 3008, 3009, 3010, 3011, 3012, 3013, 3014, + 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, + 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, + 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3049, 3060, + 3064, 3071, 3083, 3090, 3096, 3105, 3110, 3113, 3123, 3136, + 3137, 3138, 3139, 3140, 3144, 3148, 3148, 3148, 3162, 3163, + 3167, 3171, 3178, 3182, 3189, 3190, 3191, 3192, 3193, 3207, + 3213, 3213, 3213, 3217, 3222, 3229, 3229, 3236, 3240, 3244, + 3249, 3254, 3259, 3264, 3268, 3272, 3277, 3281, 3285, 3290, + 3290, 3290, 3296, 3303, 3303, 3303, 3308, 3308, 3308, 3314, + 3314, 3314, 3319, 3324, 3324, 3324, 3329, 3329, 3329, 3338, + 3343, 3343, 3343, 3348, 3348, 3348, 3357, 3362, 3362, 3362, + 3367, 3367, 3367, 3376, 3376, 3376, 3382, 3382, 3382, 3391, + 3394, 3405, 3421, 3421, 3426, 3431, 3421, 3456, 3456, 3461, + 3467, 3456, 3492, 3492, 3497, 3502, 3492, 3542, 3543, 3544, + 3545, 3546, 3550, 3557, 3564, 3570, 3576, 3583, 3590, 3596, + 3605, 3608, 3614, 3622, 3627, 3634, 3639, 3646, 3651, 3657, + 3658, 3662, 3663, 3668, 3669, 3673, 3674, 3678, 3679, 3683, + 3684, 3685, 3689, 3690, 3691, 3695, 3696, 3700, 3706, 3713, + 3721, 3728, 3736, 3745, 3745, 3745, 3753, 3753, 3753, 3760, + 3760, 3760, 3771, 3771, 3771, 3782, 3785, 3791, 3805, 3811, + 3817, 3823, 3823, 3823, 3837, 3842, 3849, 3868, 3873, 3880, + 3880, 3880, 3890, 3890, 3890, 3904, 3904, 3904, 3918, 3927, + 3927, 3927, 3947, 3954, 3954, 3954, 3964, 3969, 3976, 3979, + 3985, 4004, 4013, 4021, 4041, 4066, 4067, 4071, 4072, 4077, + 4080, 4083, 4086, 4089, 4092 }; #endif @@ -9467,10 +9467,12 @@ YYLTYPE yylloc = yyloc_default; if ( (yyvsp[-2].pExpression)->rtti_isSequence() ) { auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); mkt->values = sequenceToList((yyvsp[-2].pExpression)); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); (yyval.pExpression) = mkt; } else if ( (yyvsp[-1].b) ) { auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); mkt->values.push_back((yyvsp[-2].pExpression)); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); (yyval.pExpression) = mkt; } else { (yyval.pExpression) = (yyvsp[-2].pExpression); diff --git a/src/parser/ds_parser.ypp b/src/parser/ds_parser.ypp index 366ddd9c8f..6717634f6e 100644 --- a/src/parser/ds_parser.ypp +++ b/src/parser/ds_parser.ypp @@ -2218,10 +2218,12 @@ expr if ( $subexpr->rtti_isSequence() ) { auto mkt = new ExprMakeTuple(tokAt(scanner,@subexpr)); mkt->values = sequenceToList($subexpr); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); $$ = mkt; } else if ( $comma ) { auto mkt = new ExprMakeTuple(tokAt(scanner,@subexpr)); mkt->values.push_back($subexpr); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); $$ = mkt; } else { $$ = $subexpr; diff --git a/src/parser/lex2.yy.h b/src/parser/lex2.yy.h index 64dbe1ebb3..4b370cd3b3 100644 --- a/src/parser/lex2.yy.h +++ b/src/parser/lex2.yy.h @@ -2,9 +2,9 @@ #define das2_yyHEADER_H 1 #define das2_yyIN_HEADER 1 -#line 5 "lex2.yy.h" +#line 6 "lex2.yy.h" -#line 7 "lex2.yy.h" +#line 8 "lex2.yy.h" #define YY_INT_ALIGNED short int @@ -723,6 +723,6 @@ extern int yylex \ #line 786 "ds2_lexer.lpp" -#line 726 "lex2.yy.h" +#line 727 "lex2.yy.h" #undef das2_yyIN_HEADER #endif /* das2_yyHEADER_H */ diff --git a/src/parser/parser_impl.cpp b/src/parser/parser_impl.cpp index 4fa48efe2c..9ff9067184 100644 --- a/src/parser/parser_impl.cpp +++ b/src/parser/parser_impl.cpp @@ -1273,6 +1273,18 @@ namespace das { return int(out - buf); } + vector ast_tupleCollectShorthandNames ( const vector & values ) { + vector names; + names.reserve(values.size()); + for ( auto val : values ) { + if ( !val || !val->rtti_isVar() ) return {}; + auto ev = static_cast(val); + if ( ev->name.find("::") != string::npos ) return {}; + names.push_back(ev->name); + } + return names; + } + Expression * ast_makeStructToMakeVariant ( MakeStruct * decl, const LineInfo & locAt ) { auto mks = new ExprMakeStruct(locAt); if ( decl ) { diff --git a/src/parser/parser_impl.h b/src/parser/parser_impl.h index e484cdbb4f..565229ad3b 100644 --- a/src/parser/parser_impl.h +++ b/src/parser/parser_impl.h @@ -119,4 +119,5 @@ namespace das { Expression * ast_makeStructToMakeVariant ( MakeStruct * decl, const LineInfo & locAt ); CaptureEntry * ast_makeCaptureEntry ( yyscan_t scanner, const LineInfo & at, const string & op, const string & name ); Expression * ast_makeMoveArgument ( yyscan_t scanner, Expression * expr, const LineInfo & at ); + vector ast_tupleCollectShorthandNames ( const vector & values ); } \ No newline at end of file diff --git a/tests/language/failed_tuple_shorthand_mismatch.das b/tests/language/failed_tuple_shorthand_mismatch.das new file mode 100644 index 0000000000..c898135af4 --- /dev/null +++ b/tests/language/failed_tuple_shorthand_mismatch.das @@ -0,0 +1,11 @@ +options gen2 +expect 30341 // function_not_found: shorthand var names don't match target tuple field names + +require dastest/testing_boost public + +def fail_name_mismatch() { + var arr : array> + let foo = 1 + let bar = 1.1 + arr |> push((foo, bar)) +} diff --git a/tests/language/tuple.das b/tests/language/tuple.das index 7f77010c1e..111a7f88ff 100644 --- a/tests/language/tuple.das +++ b/tests/language/tuple.das @@ -12,6 +12,14 @@ def testF(arg : tuple) { return arg.f == 3.14 } +def overload_pick(x : tuple) { + return 1 +} + +def overload_pick(x : tuple) { + return 2 +} + [test] def test_tuple(t : T?) { t |> run("basic creation and named fields") @(t : T?) { @@ -63,6 +71,58 @@ def test_tuple(t : T?) { t |> equal(mkt._0, 1) t |> equal(mkt._1, 2.0) } + t |> run("shorthand named into array of named tuples") @(t : T?) { + var arr : array> + let eid = 7 + let distSq = 2.5 + arr |> push((eid, distSq)) + t |> equal(length(arr), 1) + t |> equal(arr[0].eid, 7) + t |> equal(arr[0].distSq, 2.5) + } + t |> run("shorthand named single element") @(t : T?) { + let eid = 9 + var tup : tuple = (eid,) + t |> equal(tup.eid, 9) + } + t |> run("shorthand named via typed var init") @(t : T?) { + let eid = 11 + let distSq = 4.5 + var tup : tuple = (eid, distSq) + t |> equal(tup.eid, 11) + t |> equal(tup.distSq, 4.5) + } + t |> run("unnamed target keeps unnamed (no shorthand)") @(t : T?) { + var arr : array> + let k = 11 + let v = 4.5 + arr |> push((k, v)) // backward compat: target is unnamed, no promotion + t |> equal(arr[0]._0, 11) + t |> equal(arr[0]._1, 4.5) + } + t |> run("overload resolution prefers unnamed tuple when both present") @(t : T?) { + var x = 123 + var y = 321. + // both `overload_pick(tuple)` and `overload_pick(tuple)` visible. + // `(x, y)` is unnamed `tuple` — exact match unnamed overload. + // shorthand-to-named promotion is fallback-only (fires when no candidate matches), + // so unnamed overload wins → returns 1. + t |> equal(overload_pick((x, y)), 1) + } + t |> run("explicit named tuple literal picks named overload") @(t : T?) { + var x = 123 + var y = 321. + // `(x=x, y=y)` parser tag as named tuple `tuple` directly. + // Exact match named overload → returns 2. + t |> equal(overload_pick((x = x, y = y)), 2) + } + t |> run("mixed expression tuple stays unnamed") @(t : T?) { + var arr : array> + let a = 1 + arr |> push((a, a + 1)) // 2nd elem not bare ExprVar → never tagged + t |> equal(arr[0]._0, 1) + t |> equal(arr[0]._1, 2) + } t |> run("fixed array of tuples") @(t : T?) { let mkta = fixed_array>((1, 2.0), (3, 4.0)) t |> equal(mkta[0]._0, 1) diff --git a/tutorials/language/11_tuples_and_variants.das b/tutorials/language/11_tuples_and_variants.das index e18c20e66c..421ea36e65 100644 --- a/tutorials/language/11_tuples_and_variants.das +++ b/tutorials/language/11_tuples_and_variants.das @@ -66,6 +66,29 @@ def main { // Named fields are also accessible via _0, _1 print("point._0 = {p._0}\n") + // --- Shorthand: unnamed -> named tuple promotion --- + // When the target type is a named tuple and every element of the literal + // is a bare variable reference whose name matches the field name in order, + // the compiler promotes the unnamed literal to the named tuple. + let eid = 7 + let distSq = 2.5 + var hit : tuple = (eid, distSq) + print("hit.eid = {hit.eid}, hit.distSq = {hit.distSq}\n") + + // Same shorthand works when pushing into an array of named tuples. + var hits : array> + hits |> push((eid, distSq)) + print("hits[0].eid = {hits[0].eid}\n") + + // Mixed expressions never promote — element must be a bare variable. + var raw : array> + let a = 1 + raw |> push((a, a + 1)) // stays unnamed; reachable via _0/_1 + print("raw[0] = ({raw[0]._0}, {raw[0]._1})\n") + + // Promotion is fallback-only: if an unnamed overload also matches, it wins. + // Use the explicit (name = value) literal to force the named overload. + // --- Tuple with tuple() constructor --- let triple = tuple(1, 2.0, "three") print("triple = ({triple._0}, {triple._1}, {triple._2})\n") @@ -169,6 +192,9 @@ def divmod_tuple(a, b : int) : tuple { // modified pair._0 = 100 // point = (3, 4) // point._0 = 3 +// hit.eid = 7, hit.distSq = 2.5 +// hits[0].eid = 7 +// raw[0] = (1, 2) // triple = (1, 2, three) // kv = (age, 25) // one => 1 diff --git a/utils/dasFormatter/ds_parser.cpp b/utils/dasFormatter/ds_parser.cpp index ab43f67905..0d581f196a 100644 --- a/utils/dasFormatter/ds_parser.cpp +++ b/utils/dasFormatter/ds_parser.cpp @@ -74,42 +74,42 @@ #define yynerrs das_yynerrs /* First part of user prologue. */ - - #define das_yyparse fmt_yyparse // We can't change flex prefix, since we have only one lexer file, seems like to define is the best way - - #include "daScript/misc/platform.h" - #include "daScript/simulate/debug_info.h" - #include "daScript/ast/compilation_errors.h" - - #ifdef _MSC_VER - #pragma warning(disable:4262) - #pragma warning(disable:4127) - #pragma warning(disable:4702) - #endif - - using namespace das; - - union DAS_YYSTYPE; - struct DAS_YYLTYPE; - - #define YY_NO_UNISTD_H - #include "../src/parser/lex.yy.h" - - void das_yyerror ( DAS_YYLTYPE * lloc, yyscan_t scanner, const string & error ); - void das_yyfatalerror ( DAS_YYLTYPE * lloc, yyscan_t scanner, const string & error, CompilationError cerr ); - int yylex ( DAS_YYSTYPE *lvalp, DAS_YYLTYPE *llocp, yyscan_t scanner ); - void yybegin ( const char * str ); - - void das_yybegin_reader ( yyscan_t yyscanner ); - void das_yyend_reader ( yyscan_t yyscanner ); - void das_accept_sequence ( yyscan_t yyscanner, const char * seq, size_t seqLen, int lineNo, FileInfo * info ); - - namespace das { class Module; } - void das_collect_keywords ( das::Module * mod, yyscan_t yyscanner ); - void das_strfmt ( yyscan_t yyscanner ); - - #undef yyextra - #define yyextra (*((das::DasParserState **)(scanner))) + + #define das_yyparse fmt_yyparse // We can't change flex prefix, since we have only one lexer file, seems like to define is the best way + + #include "daScript/misc/platform.h" + #include "daScript/simulate/debug_info.h" + #include "daScript/ast/compilation_errors.h" + + #ifdef _MSC_VER + #pragma warning(disable:4262) + #pragma warning(disable:4127) + #pragma warning(disable:4702) + #endif + + using namespace das; + + union DAS_YYSTYPE; + struct DAS_YYLTYPE; + + #define YY_NO_UNISTD_H + #include "../src/parser/lex.yy.h" + + void das_yyerror ( DAS_YYLTYPE * lloc, yyscan_t scanner, const string & error ); + void das_yyfatalerror ( DAS_YYLTYPE * lloc, yyscan_t scanner, const string & error, CompilationError cerr ); + int yylex ( DAS_YYSTYPE *lvalp, DAS_YYLTYPE *llocp, yyscan_t scanner ); + void yybegin ( const char * str ); + + void das_yybegin_reader ( yyscan_t yyscanner ); + void das_yyend_reader ( yyscan_t yyscanner ); + void das_accept_sequence ( yyscan_t yyscanner, const char * seq, size_t seqLen, int lineNo, FileInfo * info ); + + namespace das { class Module; } + void das_collect_keywords ( das::Module * mod, yyscan_t yyscanner ); + void das_strfmt ( yyscan_t yyscanner ); + + #undef yyextra + #define yyextra (*((das::DasParserState **)(scanner))) # ifndef YY_CAST @@ -1129,50 +1129,50 @@ static const yytype_int16 yyrline[] = 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2341, 2342, 2343, 2344, 2345, - 2346, 2347, 2348, 2362, 2363, 2364, 2365, 2366, 2369, 2372, - 2373, 2373, 2373, 2376, 2381, 2385, 2389, 2389, 2389, 2394, - 2397, 2401, 2401, 2401, 2406, 2409, 2410, 2411, 2412, 2413, - 2414, 2415, 2416, 2417, 2419, 2423, 2431, 2436, 2440, 2449, - 2450, 2451, 2452, 2453, 2454, 2455, 2459, 2463, 2467, 2471, - 2475, 2479, 2483, 2487, 2491, 2498, 2499, 2508, 2512, 2513, - 2514, 2518, 2519, 2523, 2524, 2525, 2529, 2530, 2534, 2545, - 2546, 2547, 2548, 2553, 2556, 2556, 2560, 2560, 2579, 2578, - 2594, 2593, 2607, 2616, 2628, 2637, 2647, 2648, 2649, 2650, - 2651, 2655, 2658, 2667, 2668, 2672, 2675, 2678, 2693, 2702, - 2703, 2707, 2710, 2713, 2726, 2727, 2731, 2737, 2743, 2752, - 2755, 2762, 2765, 2771, 2772, 2773, 2777, 2778, 2782, 2789, - 2794, 2803, 2809, 2820, 2823, 2828, 2833, 2841, 2851, 2862, - 2865, 2865, 2885, 2886, 2890, 2891, 2892, 2896, 2903, 2903, - 2922, 2925, 2941, 2961, 2962, 2963, 2968, 2968, 2998, 3001, - 3008, 3018, 3018, 3022, 3023, 3024, 3028, 3038, 3058, 3081, - 3082, 3086, 3087, 3091, 3097, 3098, 3099, 3100, 3104, 3105, - 3106, 3110, 3113, 3124, 3129, 3124, 3149, 3156, 3161, 3170, - 3176, 3187, 3188, 3189, 3190, 3191, 3192, 3193, 3194, 3195, - 3196, 3197, 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, - 3206, 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3217, 3218, - 3219, 3220, 3221, 3222, 3223, 3224, 3228, 3239, 3243, 3250, - 3262, 3269, 3275, 3285, 3286, 3291, 3296, 3310, 3320, 3330, - 3340, 3350, 3363, 3364, 3365, 3366, 3367, 3371, 3375, 3375, - 3375, 3389, 3390, 3394, 3398, 3405, 3409, 3416, 3417, 3418, - 3419, 3420, 3435, 3441, 3441, 3441, 3445, 3450, 3457, 3457, - 3464, 3468, 3472, 3477, 3482, 3487, 3492, 3496, 3500, 3505, - 3509, 3513, 3518, 3518, 3518, 3524, 3531, 3531, 3531, 3536, - 3536, 3536, 3542, 3542, 3542, 3547, 3552, 3552, 3552, 3557, - 3557, 3557, 3566, 3571, 3571, 3571, 3576, 3576, 3576, 3585, - 3590, 3590, 3590, 3595, 3595, 3595, 3604, 3604, 3604, 3610, - 3610, 3610, 3619, 3622, 3633, 3649, 3649, 3654, 3663, 3649, - 3692, 3692, 3697, 3707, 3692, 3736, 3736, 3736, 3789, 3790, - 3791, 3792, 3793, 3797, 3804, 3811, 3817, 3823, 3830, 3837, - 3843, 3852, 3855, 3861, 3869, 3874, 3881, 3886, 3893, 3898, - 3904, 3905, 3909, 3910, 3915, 3916, 3920, 3921, 3925, 3926, - 3930, 3931, 3932, 3936, 3937, 3938, 3942, 3943, 3947, 3980, - 4019, 4038, 4058, 4078, 4099, 4099, 4099, 4107, 4107, 4107, - 4114, 4114, 4114, 4125, 4125, 4125, 4136, 4140, 4146, 4162, - 4168, 4174, 4180, 4180, 4180, 4194, 4199, 4206, 4226, 4254, - 4278, 4278, 4278, 4288, 4288, 4288, 4302, 4302, 4302, 4316, - 4325, 4325, 4325, 4345, 4352, 4352, 4352, 4362, 4367, 4374, - 4377, 4383, 4403, 4422, 4430, 4450, 4475, 4476, 4480, 4481, - 4486, 4496, 4499, 4502, 4505, 4513, 4522, 4534, 4544 + 2346, 2347, 2348, 2364, 2365, 2366, 2367, 2368, 2371, 2374, + 2375, 2375, 2375, 2378, 2383, 2387, 2391, 2391, 2391, 2396, + 2399, 2403, 2403, 2403, 2408, 2411, 2412, 2413, 2414, 2415, + 2416, 2417, 2418, 2419, 2421, 2425, 2433, 2438, 2442, 2451, + 2452, 2453, 2454, 2455, 2456, 2457, 2461, 2465, 2469, 2473, + 2477, 2481, 2485, 2489, 2493, 2500, 2501, 2510, 2514, 2515, + 2516, 2520, 2521, 2525, 2526, 2527, 2531, 2532, 2536, 2547, + 2548, 2549, 2550, 2555, 2558, 2558, 2562, 2562, 2581, 2580, + 2596, 2595, 2609, 2618, 2630, 2639, 2649, 2650, 2651, 2652, + 2653, 2657, 2660, 2669, 2670, 2674, 2677, 2680, 2695, 2704, + 2705, 2709, 2712, 2715, 2728, 2729, 2733, 2739, 2745, 2754, + 2757, 2764, 2767, 2773, 2774, 2775, 2779, 2780, 2784, 2791, + 2796, 2805, 2811, 2822, 2825, 2830, 2835, 2843, 2853, 2864, + 2867, 2867, 2887, 2888, 2892, 2893, 2894, 2898, 2905, 2905, + 2924, 2927, 2943, 2963, 2964, 2965, 2970, 2970, 3000, 3003, + 3010, 3020, 3020, 3024, 3025, 3026, 3030, 3040, 3060, 3083, + 3084, 3088, 3089, 3093, 3099, 3100, 3101, 3102, 3106, 3107, + 3108, 3112, 3115, 3126, 3131, 3126, 3151, 3158, 3163, 3172, + 3178, 3189, 3190, 3191, 3192, 3193, 3194, 3195, 3196, 3197, + 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3206, 3207, + 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3219, 3220, + 3221, 3222, 3223, 3224, 3225, 3226, 3230, 3241, 3245, 3252, + 3264, 3271, 3277, 3287, 3288, 3293, 3298, 3312, 3322, 3332, + 3342, 3352, 3365, 3366, 3367, 3368, 3369, 3373, 3377, 3377, + 3377, 3391, 3392, 3396, 3400, 3407, 3411, 3418, 3419, 3420, + 3421, 3422, 3437, 3443, 3443, 3443, 3447, 3452, 3459, 3459, + 3466, 3470, 3474, 3479, 3484, 3489, 3494, 3498, 3502, 3507, + 3511, 3515, 3520, 3520, 3520, 3526, 3533, 3533, 3533, 3538, + 3538, 3538, 3544, 3544, 3544, 3549, 3554, 3554, 3554, 3559, + 3559, 3559, 3568, 3573, 3573, 3573, 3578, 3578, 3578, 3587, + 3592, 3592, 3592, 3597, 3597, 3597, 3606, 3606, 3606, 3612, + 3612, 3612, 3621, 3624, 3635, 3651, 3651, 3656, 3665, 3651, + 3694, 3694, 3699, 3709, 3694, 3738, 3738, 3738, 3791, 3792, + 3793, 3794, 3795, 3799, 3806, 3813, 3819, 3825, 3832, 3839, + 3845, 3854, 3857, 3863, 3871, 3876, 3883, 3888, 3895, 3900, + 3906, 3907, 3911, 3912, 3917, 3918, 3922, 3923, 3927, 3928, + 3932, 3933, 3934, 3938, 3939, 3940, 3944, 3945, 3949, 3982, + 4021, 4040, 4060, 4080, 4101, 4101, 4101, 4109, 4109, 4109, + 4116, 4116, 4116, 4127, 4127, 4127, 4138, 4142, 4148, 4164, + 4170, 4176, 4182, 4182, 4182, 4196, 4201, 4208, 4228, 4256, + 4280, 4280, 4280, 4290, 4290, 4290, 4304, 4304, 4304, 4318, + 4327, 4327, 4327, 4347, 4354, 4354, 4354, 4364, 4369, 4376, + 4379, 4385, 4405, 4424, 4432, 4452, 4477, 4478, 4482, 4483, + 4488, 4498, 4501, 4504, 4507, 4515, 4524, 4536, 4546 }; #endif @@ -6483,10 +6483,10 @@ YYLTYPE yylloc = yyloc_default; switch (yyn) { case 3: /* program: program module_declaration */ - { - if ( yyextra->das_has_type_declarations ) { - das_yyerror(scanner,"module name has to be first declaration",tokAt(scanner,(yylsp[0])), CompilationError::syntax_error); - } + { + if ( yyextra->das_has_type_declarations ) { + das_yyerror(scanner,"module name has to be first declaration",tokAt(scanner,(yylsp[0])), CompilationError::syntax_error); + } } break; @@ -6523,8 +6523,8 @@ YYLTYPE yylloc = yyloc_default; break; case 17: /* semicolon: SEMICOLON */ - { - format::try_semicolon_at_eol(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + { + format::try_semicolon_at_eol(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); } break; @@ -6533,8 +6533,8 @@ YYLTYPE yylloc = yyloc_default; break; case 19: /* top_level_reader_macro: expr_reader semicolon */ - { - delete (yyvsp[-1].pExpression); // we do nothing, we don't even attemp to 'visit' + { + delete (yyvsp[-1].pExpression); // we do nothing, we don't even attemp to 'visit' } break; @@ -6567,21 +6567,21 @@ YYLTYPE yylloc = yyloc_default; break; case 27: /* module_declaration: "module" module_name optional_shared optional_public_or_private_module optional_not_required */ - { - yyextra->g_Program->thisModuleName = *(yyvsp[-3].s); - yyextra->g_Program->thisModule->isPublic = (yyvsp[-1].b); - yyextra->g_Program->thisModule->isModule = true; - yyextra->g_Program->thisModule->visibleEverywhere = (yyvsp[0].b); - if ( yyextra->g_Program->thisModule->name.empty() ) { - yyextra->g_Program->library.renameModule(yyextra->g_Program->thisModule.get(),*(yyvsp[-3].s)); - } else if ( yyextra->g_Program->thisModule->name != *(yyvsp[-3].s) ){ - das_yyerror(scanner,"this module already has a name " + yyextra->g_Program->thisModule->name,tokAt(scanner,(yylsp[-3])), - CompilationError::module_already_has_a_name); - } - if ( !yyextra->g_Program->policies.ignore_shared_modules ) { - yyextra->g_Program->promoteToBuiltin = (yyvsp[-2].b); - } - delete (yyvsp[-3].s); + { + yyextra->g_Program->thisModuleName = *(yyvsp[-3].s); + yyextra->g_Program->thisModule->isPublic = (yyvsp[-1].b); + yyextra->g_Program->thisModule->isModule = true; + yyextra->g_Program->thisModule->visibleEverywhere = (yyvsp[0].b); + if ( yyextra->g_Program->thisModule->name.empty() ) { + yyextra->g_Program->library.renameModule(yyextra->g_Program->thisModule.get(),*(yyvsp[-3].s)); + } else if ( yyextra->g_Program->thisModule->name != *(yyvsp[-3].s) ){ + das_yyerror(scanner,"this module already has a name " + yyextra->g_Program->thisModule->name,tokAt(scanner,(yylsp[-3])), + CompilationError::module_already_has_a_name); + } + if ( !yyextra->g_Program->policies.ignore_shared_modules ) { + yyextra->g_Program->promoteToBuiltin = (yyvsp[-2].b); + } + delete (yyvsp[-3].s); } break; @@ -6630,141 +6630,141 @@ YYLTYPE yylloc = yyloc_default; break; case 39: /* string_builder_body: %empty */ - { - (yyval.pExpression) = new ExprStringBuilder(); - (yyval.pExpression)->at = LineInfo(yyextra->g_FileAccessStack.back(), - yylloc.first_column,yylloc.first_line,yylloc.last_column,yylloc.last_line); + { + (yyval.pExpression) = new ExprStringBuilder(); + (yyval.pExpression)->at = LineInfo(yyextra->g_FileAccessStack.back(), + yylloc.first_column,yylloc.first_line,yylloc.last_column,yylloc.last_line); } break; case 40: /* string_builder_body: string_builder_body character_sequence */ - { - bool err; - auto esconst = unescapeString(*(yyvsp[0].s),&err); - if ( err ) das_yyerror(scanner,"invalid escape sequence",tokAt(scanner,(yylsp[-1])), CompilationError::invalid_escape_sequence); - auto sc = new ExprConstString(tokAt(scanner,(yylsp[0])),esconst); - delete (yyvsp[0].s); - static_cast((yyvsp[-1].pExpression))->elements.push_back(sc); - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + bool err; + auto esconst = unescapeString(*(yyvsp[0].s),&err); + if ( err ) das_yyerror(scanner,"invalid escape sequence",tokAt(scanner,(yylsp[-1])), CompilationError::invalid_escape_sequence); + auto sc = new ExprConstString(tokAt(scanner,(yylsp[0])),esconst); + delete (yyvsp[0].s); + static_cast((yyvsp[-1].pExpression))->elements.push_back(sc); + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; case 41: /* string_builder_body: string_builder_body "{" expr optional_format_string "}" */ - { - auto se = (yyvsp[-2].pExpression); - if ( !(yyvsp[-1].s)->empty() ) { - auto call_fmt = new ExprCall(tokAt(scanner,(yylsp[-1])), "_::fmt"); - call_fmt->arguments.push_back(new ExprConstString(tokAt(scanner,(yylsp[-1])),":" + *(yyvsp[-1].s))); - call_fmt->arguments.push_back(se); - se = call_fmt; - } - static_cast((yyvsp[-4].pExpression))->elements.push_back(se); - (yyval.pExpression) = (yyvsp[-4].pExpression); - delete (yyvsp[-1].s); + { + auto se = (yyvsp[-2].pExpression); + if ( !(yyvsp[-1].s)->empty() ) { + auto call_fmt = new ExprCall(tokAt(scanner,(yylsp[-1])), "_::fmt"); + call_fmt->arguments.push_back(new ExprConstString(tokAt(scanner,(yylsp[-1])),":" + *(yyvsp[-1].s))); + call_fmt->arguments.push_back(se); + se = call_fmt; + } + static_cast((yyvsp[-4].pExpression))->elements.push_back(se); + (yyval.pExpression) = (yyvsp[-4].pExpression); + delete (yyvsp[-1].s); } break; case 42: /* string_builder: "start of the string" string_builder_body "end of the string" */ - { - auto strb = static_cast((yyvsp[-1].pExpression)); - if ( strb->elements.size()==0 ) { - (yyval.pExpression) = new ExprConstString(tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),""); - delete (yyvsp[-1].pExpression); - } else if ( strb->elements.size()==1 && strb->elements[0]->rtti_isStringConstant() ) { - auto sconst = static_cast(strb->elements[0]); - (yyval.pExpression) = new ExprConstString(tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),sconst->text); - delete (yyvsp[-1].pExpression); - } else { - (yyval.pExpression) = (yyvsp[-1].pExpression); - } + { + auto strb = static_cast((yyvsp[-1].pExpression)); + if ( strb->elements.size()==0 ) { + (yyval.pExpression) = new ExprConstString(tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),""); + delete (yyvsp[-1].pExpression); + } else if ( strb->elements.size()==1 && strb->elements[0]->rtti_isStringConstant() ) { + auto sconst = static_cast(strb->elements[0]); + (yyval.pExpression) = new ExprConstString(tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),sconst->text); + delete (yyvsp[-1].pExpression); + } else { + (yyval.pExpression) = (yyvsp[-1].pExpression); + } } break; case 43: /* reader_character_sequence: STRING_CHARACTER */ - { - if ( !yyextra->g_ReaderMacro->accept(yyextra->g_Program.get(), yyextra->g_Program->thisModule.get(), yyextra->g_ReaderExpr, (yyvsp[0].ch), tokAt(scanner,(yylsp[0]))) ) { - das_yyend_reader(scanner); - } + { + if ( !yyextra->g_ReaderMacro->accept(yyextra->g_Program.get(), yyextra->g_Program->thisModule.get(), yyextra->g_ReaderExpr, (yyvsp[0].ch), tokAt(scanner,(yylsp[0]))) ) { + das_yyend_reader(scanner); + } } break; case 44: /* reader_character_sequence: reader_character_sequence STRING_CHARACTER */ - { - if ( !yyextra->g_ReaderMacro->accept(yyextra->g_Program.get(), yyextra->g_Program->thisModule.get(), yyextra->g_ReaderExpr, (yyvsp[0].ch), tokAt(scanner,(yylsp[0]))) ) { - das_yyend_reader(scanner); - } + { + if ( !yyextra->g_ReaderMacro->accept(yyextra->g_Program.get(), yyextra->g_Program->thisModule.get(), yyextra->g_ReaderExpr, (yyvsp[0].ch), tokAt(scanner,(yylsp[0]))) ) { + das_yyend_reader(scanner); + } } break; case 45: /* $@2: %empty */ - { - auto macros = yyextra->g_Program->getReaderMacro(*(yyvsp[0].s)); - if ( macros.size()==0 ) { - das_yyerror(scanner,"reader macro " + *(yyvsp[0].s) + " not found",tokAt(scanner,(yylsp[0])), - CompilationError::unsupported_read_macro); - } else if ( macros.size()>1 ) { - string options; - for ( auto & x : macros ) { - options += "\t" + x->module->name + "::" + x->name + "\n"; - } - das_yyerror(scanner,"too many options for the reader macro " + *(yyvsp[0].s) + "\n" + options, tokAt(scanner,(yylsp[0])), - CompilationError::unsupported_read_macro); - } else if ( yychar != '~' ) { - das_yyerror(scanner,"expecting ~ after the reader macro", tokAt(scanner,(yylsp[0])), - CompilationError::syntax_error); - } else { - yyextra->g_ReaderMacro = macros.back(); - yyextra->g_ReaderExpr = new ExprReader(tokAt(scanner,(yylsp[-1])),yyextra->g_ReaderMacro); - yyclearin ; - das_yybegin_reader(scanner); - } + { + auto macros = yyextra->g_Program->getReaderMacro(*(yyvsp[0].s)); + if ( macros.size()==0 ) { + das_yyerror(scanner,"reader macro " + *(yyvsp[0].s) + " not found",tokAt(scanner,(yylsp[0])), + CompilationError::unsupported_read_macro); + } else if ( macros.size()>1 ) { + string options; + for ( auto & x : macros ) { + options += "\t" + x->module->name + "::" + x->name + "\n"; + } + das_yyerror(scanner,"too many options for the reader macro " + *(yyvsp[0].s) + "\n" + options, tokAt(scanner,(yylsp[0])), + CompilationError::unsupported_read_macro); + } else if ( yychar != '~' ) { + das_yyerror(scanner,"expecting ~ after the reader macro", tokAt(scanner,(yylsp[0])), + CompilationError::syntax_error); + } else { + yyextra->g_ReaderMacro = macros.back(); + yyextra->g_ReaderExpr = new ExprReader(tokAt(scanner,(yylsp[-1])),yyextra->g_ReaderMacro); + yyclearin ; + das_yybegin_reader(scanner); + } } break; case 46: /* expr_reader: '%' name_in_namespace $@2 reader_character_sequence */ - { - yyextra->g_ReaderExpr->at = tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])); - (yyval.pExpression) = yyextra->g_ReaderExpr; - int thisLine = 0; - FileInfo * info = nullptr; - if (!format::is_formatter_enabled()) { - if ( auto seqt = yyextra->g_ReaderMacro->suffix(yyextra->g_Program.get(), yyextra->g_Program->thisModule.get(), yyextra->g_ReaderExpr, thisLine, info, tokAt(scanner,(yylsp[0]))) ) { - das_accept_sequence(scanner,seqt,strlen(seqt),thisLine,info); - yylloc.first_column = (yylsp[0]).first_column; - yylloc.first_line = (yylsp[0]).first_line; - yylloc.last_column = (yylsp[0]).last_column; - yylloc.last_line = (yylsp[0]).last_line; - } - } - delete (yyvsp[-2].s); - yyextra->g_ReaderMacro = nullptr; - yyextra->g_ReaderExpr = nullptr; + { + yyextra->g_ReaderExpr->at = tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])); + (yyval.pExpression) = yyextra->g_ReaderExpr; + int thisLine = 0; + FileInfo * info = nullptr; + if (!format::is_formatter_enabled()) { + if ( auto seqt = yyextra->g_ReaderMacro->suffix(yyextra->g_Program.get(), yyextra->g_Program->thisModule.get(), yyextra->g_ReaderExpr, thisLine, info, tokAt(scanner,(yylsp[0]))) ) { + das_accept_sequence(scanner,seqt,strlen(seqt),thisLine,info); + yylloc.first_column = (yylsp[0]).first_column; + yylloc.first_line = (yylsp[0]).first_line; + yylloc.last_column = (yylsp[0]).last_column; + yylloc.last_line = (yylsp[0]).last_line; + } + } + delete (yyvsp[-2].s); + yyextra->g_ReaderMacro = nullptr; + yyextra->g_ReaderExpr = nullptr; } break; case 47: /* options_declaration: "options" annotation_argument_list */ - { - for ( auto & opt : *(yyvsp[0].aaList) ) { - if ( opt.name=="indenting" && opt.type==Type::tInt ) { - if (opt.iValue != 0 && opt.iValue != 2 && opt.iValue != 4 && opt.iValue != 8) { //this is error - yyextra->das_tab_size = yyextra->das_def_tab_size; - } else { - yyextra->das_tab_size = opt.iValue ? opt.iValue : yyextra->das_def_tab_size;//0 is default - } - yyextra->g_FileAccessStack.back()->tabSize = yyextra->das_tab_size; - } else if ( opt.name=="gen2_make_syntax" && opt.type==Type::tBool ) { - yyextra->das_gen2_make_syntax = opt.bValue; - } - } - for ( auto & opt : *(yyvsp[0].aaList) ) { - if ( yyextra->g_Access->isOptionAllowed(opt.name, yyextra->g_Program->thisModule->fileName) ) { - yyextra->g_Program->options.push_back(opt); - } else { - das_yyerror(scanner,"option " + opt.name + " is not allowed here", - tokAt(scanner,(yylsp[0])), CompilationError::invalid_option); - } - } - delete (yyvsp[0].aaList); + { + for ( auto & opt : *(yyvsp[0].aaList) ) { + if ( opt.name=="indenting" && opt.type==Type::tInt ) { + if (opt.iValue != 0 && opt.iValue != 2 && opt.iValue != 4 && opt.iValue != 8) { //this is error + yyextra->das_tab_size = yyextra->das_def_tab_size; + } else { + yyextra->das_tab_size = opt.iValue ? opt.iValue : yyextra->das_def_tab_size;//0 is default + } + yyextra->g_FileAccessStack.back()->tabSize = yyextra->das_tab_size; + } else if ( opt.name=="gen2_make_syntax" && opt.type==Type::tBool ) { + yyextra->das_gen2_make_syntax = opt.bValue; + } + } + for ( auto & opt : *(yyvsp[0].aaList) ) { + if ( yyextra->g_Access->isOptionAllowed(opt.name, yyextra->g_Program->thisModule->fileName) ) { + yyextra->g_Program->options.push_back(opt); + } else { + das_yyerror(scanner,"option " + opt.name + " is not allowed here", + tokAt(scanner,(yylsp[0])), CompilationError::invalid_option); + } + } + delete (yyvsp[0].aaList); } break; @@ -6781,66 +6781,66 @@ YYLTYPE yylloc = yyloc_default; break; case 52: /* require_module_name: keyword_or_name */ - { - (yyval.s) = (yyvsp[0].s); + { + (yyval.s) = (yyvsp[0].s); } break; case 53: /* require_module_name: '%' require_module_name */ - { - *(yyvsp[0].s) = "%" + *(yyvsp[0].s); - (yyval.s) = (yyvsp[0].s); + { + *(yyvsp[0].s) = "%" + *(yyvsp[0].s); + (yyval.s) = (yyvsp[0].s); } break; case 54: /* require_module_name: '.' '/' require_module_name */ - { - *(yyvsp[0].s) = "./" + *(yyvsp[0].s); - (yyval.s) = (yyvsp[0].s); + { + *(yyvsp[0].s) = "./" + *(yyvsp[0].s); + (yyval.s) = (yyvsp[0].s); } break; case 55: /* require_module_name: ".." '/' require_module_name */ - { - *(yyvsp[0].s) = "../" + *(yyvsp[0].s); - (yyval.s) = (yyvsp[0].s); + { + *(yyvsp[0].s) = "../" + *(yyvsp[0].s); + (yyval.s) = (yyvsp[0].s); } break; case 56: /* require_module_name: '%' '/' require_module_name */ - { - *(yyvsp[0].s) = "%/" + *(yyvsp[0].s); - (yyval.s) = (yyvsp[0].s); + { + *(yyvsp[0].s) = "%/" + *(yyvsp[0].s); + (yyval.s) = (yyvsp[0].s); } break; case 57: /* require_module_name: require_module_name '.' keyword_or_name */ - { - *(yyvsp[-2].s) += "."; - *(yyvsp[-2].s) += *(yyvsp[0].s); - delete (yyvsp[0].s); - (yyval.s) = (yyvsp[-2].s); + { + *(yyvsp[-2].s) += "."; + *(yyvsp[-2].s) += *(yyvsp[0].s); + delete (yyvsp[0].s); + (yyval.s) = (yyvsp[-2].s); } break; case 58: /* require_module_name: require_module_name '/' keyword_or_name */ - { - *(yyvsp[-2].s) += "/"; - *(yyvsp[-2].s) += *(yyvsp[0].s); - delete (yyvsp[0].s); - (yyval.s) = (yyvsp[-2].s); + { + *(yyvsp[-2].s) += "/"; + *(yyvsp[-2].s) += *(yyvsp[0].s); + delete (yyvsp[0].s); + (yyval.s) = (yyvsp[-2].s); } break; case 59: /* require_module: require_module_name is_public_module */ - { - ast_requireModule(scanner,(yyvsp[-1].s),nullptr,(yyvsp[0].b),tokAt(scanner,(yylsp[-1]))); + { + ast_requireModule(scanner,(yyvsp[-1].s),nullptr,(yyvsp[0].b),tokAt(scanner,(yylsp[-1]))); } break; case 60: /* require_module: require_module_name "as" "name" is_public_module */ - { - ast_requireModule(scanner,(yyvsp[-3].s),(yyvsp[-1].s),(yyvsp[0].b),tokAt(scanner,(yylsp[-3]))); + { + ast_requireModule(scanner,(yyvsp[-3].s),(yyvsp[-1].s),(yyvsp[0].b),tokAt(scanner,(yylsp[-3]))); } break; @@ -6853,32 +6853,32 @@ YYLTYPE yylloc = yyloc_default; break; case 66: /* expect_error: "integer constant" */ - { - yyextra->g_Program->expectErrors[CompilationError((yyvsp[0].i))] ++; + { + yyextra->g_Program->expectErrors[CompilationError((yyvsp[0].i))] ++; } break; case 67: /* expect_error: "integer constant" ':' "integer constant" */ - { - yyextra->g_Program->expectErrors[CompilationError((yyvsp[-2].i))] += (yyvsp[0].i); + { + yyextra->g_Program->expectErrors[CompilationError((yyvsp[-2].i))] += (yyvsp[0].i); } break; case 68: /* expression_label: "label" "integer constant" ':' */ - { - (yyval.pExpression) = new ExprLabel(tokAt(scanner,(yylsp[-2])),(yyvsp[-1].i)); + { + (yyval.pExpression) = new ExprLabel(tokAt(scanner,(yylsp[-2])),(yyvsp[-1].i)); } break; case 69: /* expression_goto: "goto" "label" "integer constant" */ - { - (yyval.pExpression) = new ExprGoto(tokAt(scanner,(yylsp[-2])),(yyvsp[0].i)); + { + (yyval.pExpression) = new ExprGoto(tokAt(scanner,(yylsp[-2])),(yyvsp[0].i)); } break; case 70: /* expression_goto: "goto" expr */ - { - (yyval.pExpression) = new ExprGoto(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); + { + (yyval.pExpression) = new ExprGoto(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); } break; @@ -6899,28 +6899,28 @@ YYLTYPE yylloc = yyloc_default; break; case 75: /* expression_else: elif_or_static_elif expr expression_block expression_else */ - { - format::wrap_par_expr(tokAt(scanner,(yylsp[-2])), (yyvsp[-2].pExpression)->at); - if (!format::is_else_newline() && (yyvsp[0].pExpression) != nullptr) { - format::skip_spaces_or_print(tokAt(scanner,(yylsp[-3])), tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), yyextra->das_tab_size); - } - - auto eite = new ExprIfThenElse(tokAt(scanner,(yylsp[-3])),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),(yyvsp[0].pExpression)); - eite->isStatic = (yyvsp[-3].b); - (yyval.pExpression) = eite; + { + format::wrap_par_expr(tokAt(scanner,(yylsp[-2])), (yyvsp[-2].pExpression)->at); + if (!format::is_else_newline() && (yyvsp[0].pExpression) != nullptr) { + format::skip_spaces_or_print(tokAt(scanner,(yylsp[-3])), tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), yyextra->das_tab_size); + } + + auto eite = new ExprIfThenElse(tokAt(scanner,(yylsp[-3])),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),(yyvsp[0].pExpression)); + eite->isStatic = (yyvsp[-3].b); + (yyval.pExpression) = eite; } break; case 76: /* expression_else: elif_or_static_elif expr expression_block SEMICOLON expression_else */ - { - format::wrap_par_expr(tokAt(scanner,(yylsp[-3])), (yyvsp[-3].pExpression)->at); - if (!format::is_else_newline() && (yyvsp[0].pExpression) != nullptr) { - format::skip_spaces_or_print(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-2])), tokAt(scanner,(yylsp[0])), yyextra->das_tab_size); - } - - auto eite = new ExprIfThenElse(tokAt(scanner,(yylsp[-4])),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); - eite->isStatic = (yyvsp[-4].b); - (yyval.pExpression) = eite; + { + format::wrap_par_expr(tokAt(scanner,(yylsp[-3])), (yyvsp[-3].pExpression)->at); + if (!format::is_else_newline() && (yyvsp[0].pExpression) != nullptr) { + format::skip_spaces_or_print(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-2])), tokAt(scanner,(yylsp[0])), yyextra->das_tab_size); + } + + auto eite = new ExprIfThenElse(tokAt(scanner,(yylsp[-4])),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); + eite->isStatic = (yyvsp[-4].b); + (yyval.pExpression) = eite; } break; @@ -6941,8 +6941,8 @@ YYLTYPE yylloc = yyloc_default; break; case 81: /* expression_else_one_liner: "else" $@3 expression_if_one_liner */ - { - (yyval.pExpression) = (yyvsp[0].pExpression); + { + (yyval.pExpression) = (yyvsp[0].pExpression); } break; @@ -6967,28 +6967,28 @@ YYLTYPE yylloc = yyloc_default; break; case 87: /* expression_if_then_else: if_or_static_if expr expression_block SEMICOLON expression_else */ - { - format::wrap_par_expr(tokAt(scanner,(yylsp[-3])), (yyvsp[-3].pExpression)->at); - if (!format::is_else_newline() && (yyvsp[0].pExpression) != nullptr) { - format::skip_spaces_or_print(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-2])), tokAt(scanner,(yylsp[0])), yyextra->das_tab_size); - } - - auto eite = new ExprIfThenElse(tokAt(scanner,(yylsp[-4])),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); - eite->isStatic = (yyvsp[-4].b); - (yyval.pExpression) = eite; + { + format::wrap_par_expr(tokAt(scanner,(yylsp[-3])), (yyvsp[-3].pExpression)->at); + if (!format::is_else_newline() && (yyvsp[0].pExpression) != nullptr) { + format::skip_spaces_or_print(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-2])), tokAt(scanner,(yylsp[0])), yyextra->das_tab_size); + } + + auto eite = new ExprIfThenElse(tokAt(scanner,(yylsp[-4])),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); + eite->isStatic = (yyvsp[-4].b); + (yyval.pExpression) = eite; } break; case 88: /* expression_if_then_else: if_or_static_if expr expression_block expression_else */ - { - format::wrap_par_expr(tokAt(scanner,(yylsp[-2])), (yyvsp[-2].pExpression)->at); - if (!format::is_else_newline() && (yyvsp[0].pExpression) != nullptr) { - format::skip_spaces_or_print(tokAt(scanner,(yylsp[-3])), tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), yyextra->das_tab_size); - } - - auto eite = new ExprIfThenElse(tokAt(scanner,(yylsp[-3])),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),(yyvsp[0].pExpression)); - eite->isStatic = (yyvsp[-3].b); - (yyval.pExpression) = eite; + { + format::wrap_par_expr(tokAt(scanner,(yylsp[-2])), (yyvsp[-2].pExpression)->at); + if (!format::is_else_newline() && (yyvsp[0].pExpression) != nullptr) { + format::skip_spaces_or_print(tokAt(scanner,(yylsp[-3])), tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), yyextra->das_tab_size); + } + + auto eite = new ExprIfThenElse(tokAt(scanner,(yylsp[-3])),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),(yyvsp[0].pExpression)); + eite->isStatic = (yyvsp[-3].b); + (yyval.pExpression) = eite; } break; @@ -6997,10 +6997,10 @@ YYLTYPE yylloc = yyloc_default; break; case 90: /* expression_if_then_else: expression_if_one_liner "if" $@4 expr expression_else_one_liner semicolon */ - { - format::wrap_par_expr(tokAt(scanner,(yylsp[-2])), (yyvsp[-2].pExpression)->at); - - (yyval.pExpression) = new ExprIfThenElse(tokAt(scanner,(yylsp[-4])),(yyvsp[-2].pExpression),ast_wrapInBlock((yyvsp[-5].pExpression)),(yyvsp[-1].pExpression) ? ast_wrapInBlock((yyvsp[-1].pExpression)) : nullptr); + { + format::wrap_par_expr(tokAt(scanner,(yylsp[-2])), (yyvsp[-2].pExpression)->at); + + (yyval.pExpression) = new ExprIfThenElse(tokAt(scanner,(yylsp[-4])),(yyvsp[-2].pExpression),ast_wrapInBlock((yyvsp[-5].pExpression)),(yyvsp[-1].pExpression) ? ast_wrapInBlock((yyvsp[-1].pExpression)) : nullptr); } break; @@ -7009,52 +7009,52 @@ YYLTYPE yylloc = yyloc_default; break; case 92: /* expression_for_loop: "for" $@5 variable_name_with_pos_list "in" expr_list expression_block */ - { - format::wrap_par_expr(tokRangeAt(scanner, (yylsp[-3]), (yylsp[-1])), tokRangeAt(scanner, (yylsp[-3]), (yylsp[-1]))); - (yyval.pExpression) = ast_forLoop(scanner,(yyvsp[-3].pNameWithPosList),(yyvsp[-1].pExpression),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-5])),tokAt(scanner,(yylsp[0]))); + { + format::wrap_par_expr(tokRangeAt(scanner, (yylsp[-3]), (yylsp[-1])), tokRangeAt(scanner, (yylsp[-3]), (yylsp[-1]))); + (yyval.pExpression) = ast_forLoop(scanner,(yyvsp[-3].pNameWithPosList),(yyvsp[-1].pExpression),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-5])),tokAt(scanner,(yylsp[0]))); } break; case 93: /* $@6: %empty */ - { // Had to add to successfully convert to v2 syntax, just copied from ds2_parser - yyextra->das_keyword = true; + { // Had to add to successfully convert to v2 syntax, just copied from ds2_parser + yyextra->das_keyword = true; } break; case 94: /* expression_for_loop: "for" $@6 '(' variable_name_with_pos_list "in" expr_list ')' expression_block */ - { - yyextra->das_keyword = false; - (yyval.pExpression) = ast_forLoop(scanner,(yyvsp[-4].pNameWithPosList),(yyvsp[-2].pExpression),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-7])),tokAt(scanner,(yylsp[0]))); + { + yyextra->das_keyword = false; + (yyval.pExpression) = ast_forLoop(scanner,(yyvsp[-4].pNameWithPosList),(yyvsp[-2].pExpression),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-7])),tokAt(scanner,(yylsp[0]))); } break; case 95: /* expression_unsafe: "unsafe" expression_block */ - { - auto pUnsafe = new ExprUnsafe(tokAt(scanner,(yylsp[-1]))); - pUnsafe->body = (yyvsp[0].pExpression); - (yyval.pExpression) = pUnsafe; + { + auto pUnsafe = new ExprUnsafe(tokAt(scanner,(yylsp[-1]))); + pUnsafe->body = (yyvsp[0].pExpression); + (yyval.pExpression) = pUnsafe; } break; case 96: /* expression_while_loop: "while" expr expression_block */ - { - format::wrap_par_expr(tokAt(scanner,(yylsp[-1])), (yyvsp[-1].pExpression)->at); - - auto pWhile = new ExprWhile(tokAt(scanner,(yylsp[-2]))); - pWhile->cond = (yyvsp[-1].pExpression); - pWhile->body = (yyvsp[0].pExpression); - ((ExprBlock *)(yyvsp[0].pExpression))->inTheLoop = true; - (yyval.pExpression) = pWhile; + { + format::wrap_par_expr(tokAt(scanner,(yylsp[-1])), (yyvsp[-1].pExpression)->at); + + auto pWhile = new ExprWhile(tokAt(scanner,(yylsp[-2]))); + pWhile->cond = (yyvsp[-1].pExpression); + pWhile->body = (yyvsp[0].pExpression); + ((ExprBlock *)(yyvsp[0].pExpression))->inTheLoop = true; + (yyval.pExpression) = pWhile; } break; case 97: /* expression_with: "with" expr expression_block */ - { - format::wrap_par_expr(tokAt(scanner,(yylsp[-1])), (yyvsp[-1].pExpression)->at); - auto pWith = new ExprWith(tokAt(scanner,(yylsp[-2]))); - pWith->with = (yyvsp[-1].pExpression); - pWith->body = (yyvsp[0].pExpression); - (yyval.pExpression) = pWith; + { + format::wrap_par_expr(tokAt(scanner,(yylsp[-1])), (yyvsp[-1].pExpression)->at); + auto pWith = new ExprWith(tokAt(scanner,(yylsp[-2]))); + pWith->with = (yyvsp[-1].pExpression); + pWith->body = (yyvsp[0].pExpression); + (yyval.pExpression) = pWith; } break; @@ -7063,9 +7063,9 @@ YYLTYPE yylloc = yyloc_default; break; case 99: /* expression_with_alias: "assume" "name" '=' $@7 expr semicolon */ - { - (yyval.pExpression) = new ExprAssume(tokAt(scanner,(yylsp[-5])), *(yyvsp[-4].s), ExpressionPtr((yyvsp[-1].pExpression))); - delete (yyvsp[-4].s); + { + (yyval.pExpression) = new ExprAssume(tokAt(scanner,(yylsp[-5])), *(yyvsp[-4].s), ExpressionPtr((yyvsp[-1].pExpression))); + delete (yyvsp[-4].s); } break; @@ -7074,8 +7074,8 @@ YYLTYPE yylloc = yyloc_default; break; case 101: /* expression_with_alias: "typedef" $@8 "name" '=' type_declaration semicolon */ - { - (yyval.pExpression) = new ExprAssume(tokAt(scanner,(yylsp[-5])), *(yyvsp[-3].s), TypeDeclPtr((yyvsp[-1].pTypeDecl))); + { + (yyval.pExpression) = new ExprAssume(tokAt(scanner,(yylsp[-5])), *(yyvsp[-3].s), TypeDeclPtr((yyvsp[-1].pTypeDecl))); } break; @@ -7104,18 +7104,18 @@ YYLTYPE yylloc = yyloc_default; break; case 108: /* annotation_argument_value_list: annotation_argument_value */ - { - (yyval.aaList) = new AnnotationArgumentList(); - (yyval.aaList)->push_back(*(yyvsp[0].aa)); - delete (yyvsp[0].aa); + { + (yyval.aaList) = new AnnotationArgumentList(); + (yyval.aaList)->push_back(*(yyvsp[0].aa)); + delete (yyvsp[0].aa); } break; case 109: /* annotation_argument_value_list: annotation_argument_value_list ',' annotation_argument_value */ - { - (yyval.aaList) = (yyvsp[-2].aaList); - (yyval.aaList)->push_back(*(yyvsp[0].aa)); - delete (yyvsp[0].aa); + { + (yyval.aaList) = (yyvsp[-2].aaList); + (yyval.aaList)->push_back(*(yyvsp[0].aa)); + delete (yyvsp[0].aa); } break; @@ -7164,38 +7164,38 @@ YYLTYPE yylloc = yyloc_default; break; case 121: /* annotation_argument: annotation_argument_name '=' '(' annotation_argument_value_list ')' */ - { - { (yyval.aa) = new AnnotationArgument(*(yyvsp[-4].s),(yyvsp[-1].aaList),tokRangeAt(scanner,(yylsp[-4]),(yylsp[0]))); delete (yyvsp[-4].s); } + { + { (yyval.aa) = new AnnotationArgument(*(yyvsp[-4].s),(yyvsp[-1].aaList),tokRangeAt(scanner,(yylsp[-4]),(yylsp[0]))); delete (yyvsp[-4].s); } } break; case 122: /* annotation_argument_list: annotation_argument */ - { - (yyval.aaList) = ast_annotationArgumentListEntry(scanner,new AnnotationArgumentList(),(yyvsp[0].aa)); + { + (yyval.aaList) = ast_annotationArgumentListEntry(scanner,new AnnotationArgumentList(),(yyvsp[0].aa)); } break; case 123: /* annotation_argument_list: annotation_argument_list ',' annotation_argument */ - { - (yyval.aaList) = ast_annotationArgumentListEntry(scanner,(yyvsp[-2].aaList),(yyvsp[0].aa)); + { + (yyval.aaList) = ast_annotationArgumentListEntry(scanner,(yyvsp[-2].aaList),(yyvsp[0].aa)); } break; case 124: /* metadata_argument_list: '@' annotation_argument */ - { - (yyval.aaList) = ast_annotationArgumentListEntry(scanner,new AnnotationArgumentList(),(yyvsp[0].aa)); + { + (yyval.aaList) = ast_annotationArgumentListEntry(scanner,new AnnotationArgumentList(),(yyvsp[0].aa)); } break; case 125: /* metadata_argument_list: metadata_argument_list '@' annotation_argument */ - { - (yyval.aaList) = ast_annotationArgumentListEntry(scanner,(yyvsp[-2].aaList),(yyvsp[0].aa)); + { + (yyval.aaList) = ast_annotationArgumentListEntry(scanner,(yyvsp[-2].aaList),(yyvsp[0].aa)); } break; case 126: /* metadata_argument_list: metadata_argument_list semicolon */ - { - (yyval.aaList) = (yyvsp[-1].aaList); + { + (yyval.aaList) = (yyvsp[-1].aaList); } break; @@ -7216,122 +7216,122 @@ YYLTYPE yylloc = yyloc_default; break; case 131: /* annotation_declaration_basic: annotation_declaration_name */ - { - (yyval.fa) = new AnnotationDeclaration(); - (yyval.fa)->at = tokAt(scanner,(yylsp[0])); - if ( yyextra->g_Access->isAnnotationAllowed(*(yyvsp[0].s), yyextra->g_Program->thisModuleName) ) { - if ( auto ann = findAnnotation(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))) ) { - (yyval.fa)->annotation = ann; - } - } else { - das_yyerror(scanner,"annotation " + *(yyvsp[0].s) + " is not allowed here", - tokAt(scanner,(yylsp[0])), CompilationError::invalid_annotation); - } - delete (yyvsp[0].s); + { + (yyval.fa) = new AnnotationDeclaration(); + (yyval.fa)->at = tokAt(scanner,(yylsp[0])); + if ( yyextra->g_Access->isAnnotationAllowed(*(yyvsp[0].s), yyextra->g_Program->thisModuleName) ) { + if ( auto ann = findAnnotation(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))) ) { + (yyval.fa)->annotation = ann; + } + } else { + das_yyerror(scanner,"annotation " + *(yyvsp[0].s) + " is not allowed here", + tokAt(scanner,(yylsp[0])), CompilationError::invalid_annotation); + } + delete (yyvsp[0].s); } break; case 132: /* annotation_declaration_basic: annotation_declaration_name '(' annotation_argument_list ')' */ - { - (yyval.fa) = new AnnotationDeclaration(); - (yyval.fa)->at = tokAt(scanner,(yylsp[-3])); - if ( yyextra->g_Access->isAnnotationAllowed(*(yyvsp[-3].s), yyextra->g_Program->thisModuleName) ) { - if ( auto ann = findAnnotation(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))) ) { - (yyval.fa)->annotation = ann; - } - } else { - das_yyerror(scanner,"annotation " + *(yyvsp[-3].s) + " is not allowed here", - tokAt(scanner,(yylsp[-3])), CompilationError::invalid_annotation); - } - swap ( (yyval.fa)->arguments, *(yyvsp[-1].aaList) ); - delete (yyvsp[-1].aaList); - delete (yyvsp[-3].s); + { + (yyval.fa) = new AnnotationDeclaration(); + (yyval.fa)->at = tokAt(scanner,(yylsp[-3])); + if ( yyextra->g_Access->isAnnotationAllowed(*(yyvsp[-3].s), yyextra->g_Program->thisModuleName) ) { + if ( auto ann = findAnnotation(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))) ) { + (yyval.fa)->annotation = ann; + } + } else { + das_yyerror(scanner,"annotation " + *(yyvsp[-3].s) + " is not allowed here", + tokAt(scanner,(yylsp[-3])), CompilationError::invalid_annotation); + } + swap ( (yyval.fa)->arguments, *(yyvsp[-1].aaList) ); + delete (yyvsp[-1].aaList); + delete (yyvsp[-3].s); } break; case 133: /* annotation_declaration: annotation_declaration_basic */ - { - (yyval.fa) = (yyvsp[0].fa); + { + (yyval.fa) = (yyvsp[0].fa); } break; case 134: /* annotation_declaration: '!' annotation_declaration */ - { - if ( !(yyvsp[0].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[0].fa)->annotation))->isSpecialized() ) { - das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[0])), - CompilationError::invalid_annotation); } - (yyval.fa) = new AnnotationDeclaration(); - (yyval.fa)->at = tokAt(scanner, (yylsp[-1])); - (yyval.fa)->annotation = newLogicAnnotation(LogicAnnotationOp::Not,(yyvsp[0].fa),nullptr); + { + if ( !(yyvsp[0].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[0].fa)->annotation))->isSpecialized() ) { + das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[0])), + CompilationError::invalid_annotation); } + (yyval.fa) = new AnnotationDeclaration(); + (yyval.fa)->at = tokAt(scanner, (yylsp[-1])); + (yyval.fa)->annotation = newLogicAnnotation(LogicAnnotationOp::Not,(yyvsp[0].fa),nullptr); } break; case 135: /* annotation_declaration: annotation_declaration "&&" annotation_declaration */ - { - if ( !(yyvsp[-2].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[-2].fa)->annotation))->isSpecialized() ) { - das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[-2])), - CompilationError::invalid_annotation); } - if ( !(yyvsp[0].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[0].fa)->annotation))->isSpecialized() ) { - das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[0])), - CompilationError::invalid_annotation); } - (yyval.fa) = new AnnotationDeclaration(); - (yyval.fa)->at = tokAt(scanner, (yylsp[-1])); - (yyval.fa)->annotation = newLogicAnnotation(LogicAnnotationOp::And,(yyvsp[-2].fa),(yyvsp[0].fa)); + { + if ( !(yyvsp[-2].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[-2].fa)->annotation))->isSpecialized() ) { + das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[-2])), + CompilationError::invalid_annotation); } + if ( !(yyvsp[0].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[0].fa)->annotation))->isSpecialized() ) { + das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[0])), + CompilationError::invalid_annotation); } + (yyval.fa) = new AnnotationDeclaration(); + (yyval.fa)->at = tokAt(scanner, (yylsp[-1])); + (yyval.fa)->annotation = newLogicAnnotation(LogicAnnotationOp::And,(yyvsp[-2].fa),(yyvsp[0].fa)); } break; case 136: /* annotation_declaration: annotation_declaration "||" annotation_declaration */ - { - if ( !(yyvsp[-2].fa)->annotation || !(yyvsp[-2].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[-2].fa)->annotation))->isSpecialized() ) { - das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[-2])), - CompilationError::invalid_annotation); } - if ( !(yyvsp[0].fa)->annotation || !(yyvsp[0].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[0].fa)->annotation))->isSpecialized() ) { - das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[0])), - CompilationError::invalid_annotation); } - (yyval.fa) = new AnnotationDeclaration(); - (yyval.fa)->at = tokAt(scanner, (yylsp[-1])); - (yyval.fa)->annotation = newLogicAnnotation(LogicAnnotationOp::Or,(yyvsp[-2].fa),(yyvsp[0].fa)); + { + if ( !(yyvsp[-2].fa)->annotation || !(yyvsp[-2].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[-2].fa)->annotation))->isSpecialized() ) { + das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[-2])), + CompilationError::invalid_annotation); } + if ( !(yyvsp[0].fa)->annotation || !(yyvsp[0].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[0].fa)->annotation))->isSpecialized() ) { + das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[0])), + CompilationError::invalid_annotation); } + (yyval.fa) = new AnnotationDeclaration(); + (yyval.fa)->at = tokAt(scanner, (yylsp[-1])); + (yyval.fa)->annotation = newLogicAnnotation(LogicAnnotationOp::Or,(yyvsp[-2].fa),(yyvsp[0].fa)); } break; case 137: /* annotation_declaration: annotation_declaration "^^" annotation_declaration */ - { - if ( !(yyvsp[-2].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[-2].fa)->annotation))->isSpecialized() ) { - das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[-2])), - CompilationError::invalid_annotation); } - if ( !(yyvsp[0].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[0].fa)->annotation))->isSpecialized() ) { - das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[0])), - CompilationError::invalid_annotation); } - (yyval.fa) = new AnnotationDeclaration(); - (yyval.fa)->at = tokAt(scanner, (yylsp[-1])); - (yyval.fa)->annotation = newLogicAnnotation(LogicAnnotationOp::Xor,(yyvsp[-2].fa),(yyvsp[0].fa)); + { + if ( !(yyvsp[-2].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[-2].fa)->annotation))->isSpecialized() ) { + das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[-2])), + CompilationError::invalid_annotation); } + if ( !(yyvsp[0].fa)->annotation->rtti_isFunctionAnnotation() || !((FunctionAnnotation *)((yyvsp[0].fa)->annotation))->isSpecialized() ) { + das_yyerror(scanner,"can only run logical operations on contracts", tokAt(scanner, (yylsp[0])), + CompilationError::invalid_annotation); } + (yyval.fa) = new AnnotationDeclaration(); + (yyval.fa)->at = tokAt(scanner, (yylsp[-1])); + (yyval.fa)->annotation = newLogicAnnotation(LogicAnnotationOp::Xor,(yyvsp[-2].fa),(yyvsp[0].fa)); } break; case 138: /* annotation_declaration: '(' annotation_declaration ')' */ - { - (yyval.fa) = (yyvsp[-1].fa); + { + (yyval.fa) = (yyvsp[-1].fa); } break; case 139: /* annotation_declaration: "|>" annotation_declaration */ - { - (yyval.fa) = (yyvsp[0].fa); - (yyvsp[0].fa)->inherited = true; + { + (yyval.fa) = (yyvsp[0].fa); + (yyvsp[0].fa)->inherited = true; } break; case 140: /* annotation_list: annotation_declaration */ - { - (yyval.faList) = new AnnotationList(); - (yyval.faList)->push_back(AnnotationDeclarationPtr((yyvsp[0].fa))); + { + (yyval.faList) = new AnnotationList(); + (yyval.faList)->push_back(AnnotationDeclarationPtr((yyvsp[0].fa))); } break; case 141: /* annotation_list: annotation_list ',' annotation_declaration */ - { - (yyval.faList) = (yyvsp[-2].faList); - (yyval.faList)->push_back(AnnotationDeclarationPtr((yyvsp[0].fa))); + { + (yyval.faList) = (yyvsp[-2].faList); + (yyval.faList)->push_back(AnnotationDeclarationPtr((yyvsp[0].fa))); } break; @@ -7356,29 +7356,29 @@ YYLTYPE yylloc = yyloc_default; break; case 147: /* optional_function_type: %empty */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); + { + (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); } break; case 148: /* optional_function_type: ':' type_declaration */ - { - (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); + { + (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; case 149: /* optional_function_type: "->" type_declaration */ - { - (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); + { + (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; case 150: /* function_name: "name" */ - { - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - (yyval.s) = (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + (yyval.s) = (yyvsp[0].s); } break; @@ -7823,21 +7823,21 @@ YYLTYPE yylloc = yyloc_default; break; case 261: /* global_function_declaration: optional_annotation_list "def" optional_template function_declaration */ - { - (yyvsp[0].pFuncDecl)->atDecl = tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])); - (yyvsp[0].pFuncDecl)->isTemplate = (yyvsp[-1].b); - assignDefaultArguments((yyvsp[0].pFuncDecl)); - runFunctionAnnotations(scanner, yyextra, (yyvsp[0].pFuncDecl), (yyvsp[-3].faList), tokAt(scanner,(yylsp[-3]))); - if ( (yyvsp[0].pFuncDecl)->isGeneric() ) { - implAddGenericFunction(scanner,(yyvsp[0].pFuncDecl)); - } else { - if ( !yyextra->g_Program->addFunction((yyvsp[0].pFuncDecl)) ) { - das_yyerror(scanner,"function is already defined " + - (yyvsp[0].pFuncDecl)->getMangledName(),(yyvsp[0].pFuncDecl)->at, - CompilationError::function_already_declared); - } - } - (yyvsp[0].pFuncDecl)->delRef(); + { + (yyvsp[0].pFuncDecl)->atDecl = tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])); + (yyvsp[0].pFuncDecl)->isTemplate = (yyvsp[-1].b); + assignDefaultArguments((yyvsp[0].pFuncDecl)); + runFunctionAnnotations(scanner, yyextra, (yyvsp[0].pFuncDecl), (yyvsp[-3].faList), tokAt(scanner,(yylsp[-3]))); + if ( (yyvsp[0].pFuncDecl)->isGeneric() ) { + implAddGenericFunction(scanner,(yyvsp[0].pFuncDecl)); + } else { + if ( !yyextra->g_Program->addFunction((yyvsp[0].pFuncDecl)) ) { + das_yyerror(scanner,"function is already defined " + + (yyvsp[0].pFuncDecl)->getMangledName(),(yyvsp[0].pFuncDecl)->at, + CompilationError::function_already_declared); + } + } + (yyvsp[0].pFuncDecl)->delRef(); } break; @@ -7854,29 +7854,29 @@ YYLTYPE yylloc = yyloc_default; break; case 265: /* function_declaration_header: function_name optional_function_argument_list optional_function_type */ - { - (yyval.pFuncDecl) = ast_functionDeclarationHeader(scanner,(yyvsp[-2].s),(yyvsp[-1].pVarDeclList),(yyvsp[0].pTypeDecl),tokAt(scanner,(yylsp[-2]))); + { + (yyval.pFuncDecl) = ast_functionDeclarationHeader(scanner,(yyvsp[-2].s),(yyvsp[-1].pVarDeclList),(yyvsp[0].pTypeDecl),tokAt(scanner,(yylsp[-2]))); } break; case 266: /* $@9: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeFunction(tak); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeFunction(tak); + } } break; case 267: /* function_declaration: optional_public_or_private_function $@9 function_declaration_header expression_block */ - { - (yyvsp[-1].pFuncDecl)->body = (yyvsp[0].pExpression); - (yyvsp[-1].pFuncDecl)->privateFunction = !(yyvsp[-3].b); - (yyval.pFuncDecl) = (yyvsp[-1].pFuncDecl); - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterFunction((yyvsp[-1].pFuncDecl),tak); - } + { + (yyvsp[-1].pFuncDecl)->body = (yyvsp[0].pExpression); + (yyvsp[-1].pFuncDecl)->privateFunction = !(yyvsp[-3].b); + (yyval.pFuncDecl) = (yyvsp[-1].pFuncDecl); + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterFunction((yyvsp[-1].pFuncDecl),tak); + } } break; @@ -7897,75 +7897,75 @@ YYLTYPE yylloc = yyloc_default; break; case 272: /* expression_block: open_block expressions close_block */ - { - auto prev_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); - handle_brace(prev_loc, (yyvsp[-2].ui), format::get_substring(prev_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), - yyextra->das_tab_size, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); - (yyval.pExpression) = (yyvsp[-1].pExpression); - (yyval.pExpression)->at = tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])); + { + auto prev_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); + handle_brace(prev_loc, (yyvsp[-2].ui), format::get_substring(prev_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), + yyextra->das_tab_size, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); + (yyval.pExpression) = (yyvsp[-1].pExpression); + (yyval.pExpression)->at = tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])); } break; case 273: /* expression_block: open_block expressions close_block "finally" open_block expressions close_block */ - { - auto prev_loc = format::Pos::from(tokAt(scanner,(yylsp[-6]))); - if (format::is_replace_braces() && (yyvsp[-6].ui) != 0xdeadbeef && format::prepare_rule(prev_loc)) { - handle_brace(prev_loc, (yyvsp[-6].ui), format::get_substring(prev_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-5])))), - yyextra->das_tab_size, format::Pos::from_last(tokAt(scanner,(yylsp[-5])))); - auto prev_loc_f = format::Pos::from(tokAt(scanner,(yylsp[-2]))); - assert((yyvsp[-2].ui) != 0xdeadbeef); - { - const auto internal_f = format::get_substring(prev_loc_f, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); - format::get_writer() << " finally {" << internal_f << "\n" << string((yyvsp[-2].ui) * yyextra->das_tab_size, ' ') + "}"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); - } - } - - auto pB = (ExprBlock *) (yyvsp[-5].pExpression); - auto pF = (ExprBlock *) (yyvsp[-1].pExpression); - swap ( pB->finalList, pF->list ); - (yyval.pExpression) = (yyvsp[-5].pExpression); - (yyval.pExpression)->at = tokRangeAt(scanner,(yylsp[-6]),(yylsp[0])); - delete (yyvsp[-1].pExpression); + { + auto prev_loc = format::Pos::from(tokAt(scanner,(yylsp[-6]))); + if (format::is_replace_braces() && (yyvsp[-6].ui) != 0xdeadbeef && format::prepare_rule(prev_loc)) { + handle_brace(prev_loc, (yyvsp[-6].ui), format::get_substring(prev_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-5])))), + yyextra->das_tab_size, format::Pos::from_last(tokAt(scanner,(yylsp[-5])))); + auto prev_loc_f = format::Pos::from(tokAt(scanner,(yylsp[-2]))); + assert((yyvsp[-2].ui) != 0xdeadbeef); + { + const auto internal_f = format::get_substring(prev_loc_f, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); + format::get_writer() << " finally {" << internal_f << "\n" << string((yyvsp[-2].ui) * yyextra->das_tab_size, ' ') + "}"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); + } + } + + auto pB = (ExprBlock *) (yyvsp[-5].pExpression); + auto pF = (ExprBlock *) (yyvsp[-1].pExpression); + swap ( pB->finalList, pF->list ); + (yyval.pExpression) = (yyvsp[-5].pExpression); + (yyval.pExpression)->at = tokRangeAt(scanner,(yylsp[-6]),(yylsp[0])); + delete (yyvsp[-1].pExpression); } break; case 274: /* expr_call_pipe: expr expr_full_block_assumed_piped */ - { - if ( (yyvsp[-1].pExpression)->rtti_isCallLikeExpr() ) { - auto start = format::Pos::from_last(tokAt(scanner, (yylsp[-1]))); - start.column -= 1; // drop ) - if (format::is_replace_braces() && format::prepare_rule(start)) { - if (!((ExprLooksLikeCall *)(yyvsp[-1].pExpression))->arguments.empty()) { - format::get_writer() << ", "; - } - format::get_writer() << format::get_substring(tokAt(scanner, (yylsp[0]))) << ");"; - format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[0])))); - } - ((ExprLooksLikeCall *)(yyvsp[-1].pExpression))->arguments.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = (yyvsp[-1].pExpression); - } else { - (yyval.pExpression) = (yyvsp[-1].pExpression); - delete (yyvsp[0].pExpression); - } + { + if ( (yyvsp[-1].pExpression)->rtti_isCallLikeExpr() ) { + auto start = format::Pos::from_last(tokAt(scanner, (yylsp[-1]))); + start.column -= 1; // drop ) + if (format::is_replace_braces() && format::prepare_rule(start)) { + if (!((ExprLooksLikeCall *)(yyvsp[-1].pExpression))->arguments.empty()) { + format::get_writer() << ", "; + } + format::get_writer() << format::get_substring(tokAt(scanner, (yylsp[0]))) << ");"; + format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[0])))); + } + ((ExprLooksLikeCall *)(yyvsp[-1].pExpression))->arguments.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = (yyvsp[-1].pExpression); + } else { + (yyval.pExpression) = (yyvsp[-1].pExpression); + delete (yyvsp[0].pExpression); + } } break; case 275: /* expr_call_pipe: expression_keyword expr_full_block_assumed_piped */ - { - if ( (yyvsp[-1].pExpression)->rtti_isCallLikeExpr() ) { - ((ExprLooksLikeCall *)(yyvsp[-1].pExpression))->arguments.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = (yyvsp[-1].pExpression); - } else { - (yyval.pExpression) = (yyvsp[-1].pExpression); - delete (yyvsp[0].pExpression); - } + { + if ( (yyvsp[-1].pExpression)->rtti_isCallLikeExpr() ) { + ((ExprLooksLikeCall *)(yyvsp[-1].pExpression))->arguments.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = (yyvsp[-1].pExpression); + } else { + (yyval.pExpression) = (yyvsp[-1].pExpression); + delete (yyvsp[0].pExpression); + } } break; case 276: /* expr_call_pipe: "generator" '<' type_declaration_no_options '>' optional_capture_list expr_full_block_assumed_piped */ - { - (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-3].pTypeDecl),(yyvsp[-1].pCaptList),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-5])),tokAt(scanner,(yylsp[-1]))); + { + (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-3].pTypeDecl),(yyvsp[-1].pCaptList),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[-5])),tokAt(scanner,(yylsp[-1]))); } break; @@ -8058,38 +8058,38 @@ YYLTYPE yylloc = yyloc_default; break; case 299: /* expressions: %empty */ - { - (yyval.pExpression) = new ExprBlock(); - (yyval.pExpression)->at = LineInfo(yyextra->g_FileAccessStack.back(), - yylloc.first_column,yylloc.first_line,yylloc.last_column,yylloc.last_line); + { + (yyval.pExpression) = new ExprBlock(); + (yyval.pExpression)->at = LineInfo(yyextra->g_FileAccessStack.back(), + yylloc.first_column,yylloc.first_line,yylloc.last_column,yylloc.last_line); } break; case 300: /* expressions: expressions expression_any */ - { - (yyval.pExpression) = (yyvsp[-1].pExpression); - if ( (yyvsp[0].pExpression) ) { - static_cast((yyvsp[-1].pExpression))->list.push_back((yyvsp[0].pExpression)); - } + { + (yyval.pExpression) = (yyvsp[-1].pExpression); + if ( (yyvsp[0].pExpression) ) { + static_cast((yyvsp[-1].pExpression))->list.push_back((yyvsp[0].pExpression)); + } } break; case 301: /* expressions: expressions error */ - { - delete (yyvsp[-1].pExpression); (yyval.pExpression) = nullptr; YYABORT; + { + delete (yyvsp[-1].pExpression); (yyval.pExpression) = nullptr; YYABORT; } break; case 302: /* expr_keyword: "keyword" expr expression_block */ - { - format::wrap_par_expr(tokAt(scanner,(yylsp[-1])), (yyvsp[-1].pExpression)->at); // wrap match (expr) - auto pCall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s)); - pCall->arguments.push_back((yyvsp[-1].pExpression)); - auto resT = new TypeDecl(Type::autoinfer); - auto blk = ast_makeBlock(scanner,0,nullptr,nullptr,nullptr,resT,(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[0])),LineInfo()); - pCall->arguments.push_back(blk); - delete (yyvsp[-2].s); - (yyval.pExpression) = pCall; + { + format::wrap_par_expr(tokAt(scanner,(yylsp[-1])), (yyvsp[-1].pExpression)->at); // wrap match (expr) + auto pCall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),*(yyvsp[-2].s)); + pCall->arguments.push_back((yyvsp[-1].pExpression)); + auto resT = new TypeDecl(Type::autoinfer); + auto blk = ast_makeBlock(scanner,0,nullptr,nullptr,nullptr,resT,(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[0])),LineInfo()); + pCall->arguments.push_back(blk); + delete (yyvsp[-2].s); + (yyval.pExpression) = pCall; } break; @@ -8118,16 +8118,16 @@ YYLTYPE yylloc = yyloc_default; break; case 309: /* type_declaration_no_options_list: type_declaration */ - { - (yyval.pTypeDeclList) = new vector(); - (yyval.pTypeDeclList)->push_back(new ExprTypeDecl(tokAt(scanner,(yylsp[0])),(yyvsp[0].pTypeDecl))); + { + (yyval.pTypeDeclList) = new vector(); + (yyval.pTypeDeclList)->push_back(new ExprTypeDecl(tokAt(scanner,(yylsp[0])),(yyvsp[0].pTypeDecl))); } break; case 310: /* type_declaration_no_options_list: type_declaration_no_options_list c_or_s type_declaration */ - { - (yyval.pTypeDeclList) = (yyvsp[-2].pTypeDeclList); - (yyval.pTypeDeclList)->push_back(new ExprTypeDecl(tokAt(scanner,(yylsp[0])),(yyvsp[0].pTypeDecl))); + { + (yyval.pTypeDeclList) = (yyvsp[-2].pTypeDeclList); + (yyval.pTypeDeclList)->push_back(new ExprTypeDecl(tokAt(scanner,(yylsp[0])),(yyvsp[0].pTypeDecl))); } break; @@ -8140,11 +8140,11 @@ YYLTYPE yylloc = yyloc_default; break; case 313: /* expression_keyword: "keyword" '<' $@10 type_declaration_no_options_list '>' $@11 expr */ - { - auto pCall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),*(yyvsp[-6].s)); - pCall->arguments = typesAndSequenceToList((yyvsp[-3].pTypeDeclList),(yyvsp[0].pExpression)); - delete (yyvsp[-6].s); - (yyval.pExpression) = pCall; + { + auto pCall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),*(yyvsp[-6].s)); + pCall->arguments = typesAndSequenceToList((yyvsp[-3].pTypeDeclList),(yyvsp[0].pExpression)); + delete (yyvsp[-6].s); + (yyval.pExpression) = pCall; } break; @@ -8157,85 +8157,85 @@ YYLTYPE yylloc = yyloc_default; break; case 316: /* expression_keyword: "type function" '<' $@12 type_declaration_no_options_list '>' $@13 optional_expr_list_in_braces */ - { - auto pCall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),*(yyvsp[-6].s)); - pCall->arguments = typesAndSequenceToList((yyvsp[-3].pTypeDeclList),(yyvsp[0].pExpression)); - delete (yyvsp[-6].s); - (yyval.pExpression) = pCall; + { + auto pCall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),*(yyvsp[-6].s)); + pCall->arguments = typesAndSequenceToList((yyvsp[-3].pTypeDeclList),(yyvsp[0].pExpression)); + delete (yyvsp[-6].s); + (yyval.pExpression) = pCall; } break; case 317: /* expr_pipe: expr_assign " <|" expr_block */ - { - Expression * pipeCall = (yyvsp[-2].pExpression)->tail(); - if ( pipeCall->rtti_isCallLikeExpr() ) { - auto pCall = (ExprLooksLikeCall *) pipeCall; - pCall->arguments.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = (yyvsp[-2].pExpression); - } else if ( pipeCall->rtti_isVar() ) { - // a += b <| c - auto pVar = (ExprVar *) pipeCall; - auto pCall = yyextra->g_Program->makeCall(pVar->at,pVar->name); - pCall->arguments.push_back((yyvsp[0].pExpression)); - if ( !(yyvsp[-2].pExpression)->swap_tail(pVar,pCall) ) { - delete pVar; - (yyval.pExpression) = pCall; - } else { - (yyval.pExpression) = (yyvsp[-2].pExpression); - } - } else if ( pipeCall->rtti_isMakeStruct() ) { - auto pMS = (ExprMakeStruct *) pipeCall; - if ( pMS->block ) { - das_yyerror(scanner,"can't pipe into [[ make structure ]]. it already has where closure", - tokAt(scanner,(yylsp[-1])),CompilationError::cant_pipe); - delete (yyvsp[0].pExpression); - } else { - pMS->block = (yyvsp[0].pExpression); - } - (yyval.pExpression) = (yyvsp[-2].pExpression); - } else { - das_yyerror(scanner,"can only pipe into function call or [[ make structure ]]", - tokAt(scanner,(yylsp[-1])),CompilationError::cant_pipe); - delete (yyvsp[0].pExpression); - (yyval.pExpression) = (yyvsp[-2].pExpression); - } + { + Expression * pipeCall = (yyvsp[-2].pExpression)->tail(); + if ( pipeCall->rtti_isCallLikeExpr() ) { + auto pCall = (ExprLooksLikeCall *) pipeCall; + pCall->arguments.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = (yyvsp[-2].pExpression); + } else if ( pipeCall->rtti_isVar() ) { + // a += b <| c + auto pVar = (ExprVar *) pipeCall; + auto pCall = yyextra->g_Program->makeCall(pVar->at,pVar->name); + pCall->arguments.push_back((yyvsp[0].pExpression)); + if ( !(yyvsp[-2].pExpression)->swap_tail(pVar,pCall) ) { + delete pVar; + (yyval.pExpression) = pCall; + } else { + (yyval.pExpression) = (yyvsp[-2].pExpression); + } + } else if ( pipeCall->rtti_isMakeStruct() ) { + auto pMS = (ExprMakeStruct *) pipeCall; + if ( pMS->block ) { + das_yyerror(scanner,"can't pipe into [[ make structure ]]. it already has where closure", + tokAt(scanner,(yylsp[-1])),CompilationError::cant_pipe); + delete (yyvsp[0].pExpression); + } else { + pMS->block = (yyvsp[0].pExpression); + } + (yyval.pExpression) = (yyvsp[-2].pExpression); + } else { + das_yyerror(scanner,"can only pipe into function call or [[ make structure ]]", + tokAt(scanner,(yylsp[-1])),CompilationError::cant_pipe); + delete (yyvsp[0].pExpression); + (yyval.pExpression) = (yyvsp[-2].pExpression); + } } break; case 318: /* expr_pipe: "@ <|" expr_block */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { - format::get_writer() << "@"; - format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[-1])))); - } - - (yyval.pExpression) = (yyvsp[0].pExpression); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { + format::get_writer() << "@"; + format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[-1])))); + } + + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 319: /* expr_pipe: "@@ <|" expr_block */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { - format::get_writer() << "@@"; - format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[-1])))); - } - (yyval.pExpression) = (yyvsp[0].pExpression); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { + format::get_writer() << "@@"; + format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[-1])))); + } + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 320: /* expr_pipe: "$ <|" expr_block */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { - format::get_writer() << "$"; - format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[-1])))); - } - (yyval.pExpression) = (yyvsp[0].pExpression); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { + format::get_writer() << "$"; + format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[-1])))); + } + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 321: /* expr_pipe: expr_call_pipe */ - { - (yyval.pExpression) = (yyvsp[0].pExpression); + { + (yyval.pExpression) = (yyvsp[0].pExpression); } break; @@ -8244,16 +8244,16 @@ YYLTYPE yylloc = yyloc_default; break; case 323: /* name_in_namespace: "name" "::" "name" */ - { - auto ita = yyextra->das_module_alias.find(*(yyvsp[-2].s)); - if ( ita == yyextra->das_module_alias.end() ) { - *(yyvsp[-2].s) += "::"; - } else { - *(yyvsp[-2].s) = ita->second + "::"; - } - *(yyvsp[-2].s) += *(yyvsp[0].s); - delete (yyvsp[0].s); - (yyval.s) = (yyvsp[-2].s); + { + auto ita = yyextra->das_module_alias.find(*(yyvsp[-2].s)); + if ( ita == yyextra->das_module_alias.end() ) { + *(yyvsp[-2].s) += "::"; + } else { + *(yyvsp[-2].s) = ita->second + "::"; + } + *(yyvsp[-2].s) += *(yyvsp[0].s); + delete (yyvsp[0].s); + (yyval.s) = (yyvsp[-2].s); } break; @@ -8262,16 +8262,16 @@ YYLTYPE yylloc = yyloc_default; break; case 325: /* expression_delete: "delete" expr */ - { - (yyval.pExpression) = new ExprDelete(tokAt(scanner,(yylsp[-1])), (yyvsp[0].pExpression)); + { + (yyval.pExpression) = new ExprDelete(tokAt(scanner,(yylsp[-1])), (yyvsp[0].pExpression)); } break; case 326: /* expression_delete: "delete" "explicit" expr */ - { - auto delExpr = new ExprDelete(tokAt(scanner,(yylsp[-2])), (yyvsp[0].pExpression)); - delExpr->native = true; - (yyval.pExpression) = delExpr; + { + auto delExpr = new ExprDelete(tokAt(scanner,(yylsp[-2])), (yyvsp[0].pExpression)); + delExpr->native = true; + (yyval.pExpression) = delExpr; } break; @@ -8284,60 +8284,60 @@ YYLTYPE yylloc = yyloc_default; break; case 329: /* new_type_declaration: '<' $@14 type_declaration '>' $@15 */ - { - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + { + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; case 330: /* new_type_declaration: structure_type_declaration */ - { - (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); + { + (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; case 331: /* expr_new: "new" new_type_declaration */ - { - (yyval.pExpression) = new ExprNew(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pTypeDecl),false); + { + (yyval.pExpression) = new ExprNew(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pTypeDecl),false); } break; case 332: /* expr_new: "new" new_type_declaration '(' use_initializer ')' */ - { - (yyval.pExpression) = new ExprNew(tokAt(scanner,(yylsp[-4])),(yyvsp[-3].pTypeDecl),true); - ((ExprNew *)(yyval.pExpression))->initializer = (yyvsp[-1].b); + { + (yyval.pExpression) = new ExprNew(tokAt(scanner,(yylsp[-4])),(yyvsp[-3].pTypeDecl),true); + ((ExprNew *)(yyval.pExpression))->initializer = (yyvsp[-1].b); } break; case 333: /* expr_new: "new" new_type_declaration '(' expr_list ')' */ - { - auto pNew = new ExprNew(tokAt(scanner,(yylsp[-4])),(yyvsp[-3].pTypeDecl),true); - (yyval.pExpression) = parseFunctionArguments(pNew,(yyvsp[-1].pExpression)); + { + auto pNew = new ExprNew(tokAt(scanner,(yylsp[-4])),(yyvsp[-3].pTypeDecl),true); + (yyval.pExpression) = parseFunctionArguments(pNew,(yyvsp[-1].pExpression)); } break; case 334: /* expr_new: "new" new_type_declaration '(' make_struct_single ')' */ - { - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-3])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-3].pTypeDecl); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = true; // $init; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; - (yyval.pExpression) = new ExprAscend(tokAt(scanner,(yylsp[-4])),(yyvsp[-1].pExpression)); + { + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-3])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-3].pTypeDecl); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = true; // $init; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + (yyval.pExpression) = new ExprAscend(tokAt(scanner,(yylsp[-4])),(yyvsp[-1].pExpression)); } break; case 335: /* expr_new: "new" new_type_declaration '(' "uninitialized" make_struct_single ')' */ - { - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-4])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-4].pTypeDecl); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = false; // $init; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; - (yyval.pExpression) = new ExprAscend(tokAt(scanner,(yylsp[-5])),(yyvsp[-1].pExpression)); + { + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-4])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-4].pTypeDecl); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = false; // $init; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + (yyval.pExpression) = new ExprAscend(tokAt(scanner,(yylsp[-5])),(yyvsp[-1].pExpression)); } break; case 336: /* expr_new: "new" make_decl */ - { - (yyval.pExpression) = new ExprAscend(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); + { + (yyval.pExpression) = new ExprAscend(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); } break; @@ -8350,88 +8350,88 @@ YYLTYPE yylloc = yyloc_default; break; case 339: /* expression_return_no_pipe: "return" */ - { - (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[0])),nullptr); + { + (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[0])),nullptr); } break; case 340: /* expression_return_no_pipe: "return" expr_list */ - { - (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[-1])),sequenceToTuple((yyvsp[0].pExpression))); + { + (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[-1])),sequenceToTuple((yyvsp[0].pExpression))); } break; case 341: /* expression_return_no_pipe: "return" "<-" expr_list */ - { - auto pRet = new ExprReturn(tokAt(scanner,(yylsp[-2])),sequenceToTuple((yyvsp[0].pExpression))); - pRet->moveSemantics = true; - (yyval.pExpression) = pRet; + { + auto pRet = new ExprReturn(tokAt(scanner,(yylsp[-2])),sequenceToTuple((yyvsp[0].pExpression))); + pRet->moveSemantics = true; + (yyval.pExpression) = pRet; } break; case 342: /* expression_return: expression_return_no_pipe semicolon */ - { - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; case 343: /* expression_return: "return" expr_pipe */ - { - (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); + { + (yyval.pExpression) = new ExprReturn(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); } break; case 344: /* expression_return: "return" "<-" expr_pipe */ - { - auto pRet = new ExprReturn(tokAt(scanner,(yylsp[-2])),(yyvsp[0].pExpression)); - pRet->moveSemantics = true; - (yyval.pExpression) = pRet; + { + auto pRet = new ExprReturn(tokAt(scanner,(yylsp[-2])),(yyvsp[0].pExpression)); + pRet->moveSemantics = true; + (yyval.pExpression) = pRet; } break; case 345: /* expression_yield_no_pipe: "yield" expr */ - { - (yyval.pExpression) = new ExprYield(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); + { + (yyval.pExpression) = new ExprYield(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); } break; case 346: /* expression_yield_no_pipe: "yield" "<-" expr */ - { - auto pRet = new ExprYield(tokAt(scanner,(yylsp[-2])),(yyvsp[0].pExpression)); - pRet->moveSemantics = true; - (yyval.pExpression) = pRet; + { + auto pRet = new ExprYield(tokAt(scanner,(yylsp[-2])),(yyvsp[0].pExpression)); + pRet->moveSemantics = true; + (yyval.pExpression) = pRet; } break; case 347: /* expression_yield: expression_yield_no_pipe semicolon */ - { - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; case 348: /* expression_yield: "yield" expr_pipe */ - { - (yyval.pExpression) = new ExprYield(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); + { + (yyval.pExpression) = new ExprYield(tokAt(scanner,(yylsp[-1])),(yyvsp[0].pExpression)); } break; case 349: /* expression_yield: "yield" "<-" expr_pipe */ - { - auto pRet = new ExprYield(tokAt(scanner,(yylsp[-2])),(yyvsp[0].pExpression)); - pRet->moveSemantics = true; - (yyval.pExpression) = pRet; + { + auto pRet = new ExprYield(tokAt(scanner,(yylsp[-2])),(yyvsp[0].pExpression)); + pRet->moveSemantics = true; + (yyval.pExpression) = pRet; } break; case 350: /* expression_try_catch: "try" expression_block "recover" expression_block */ - { - const auto end_block = format::Pos::from_last(tokAt(scanner, (yylsp[-2]))); - const auto start = format::Pos::from(tokAt(scanner, (yylsp[-3]))); - if (format::is_replace_braces()) { - format::skip_spaces_or_print(tokAt(scanner, (yylsp[-3])), tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1])), yyextra->das_tab_size); - } - - (yyval.pExpression) = new ExprTryCatch(tokAt(scanner,(yylsp[-3])),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); + { + const auto end_block = format::Pos::from_last(tokAt(scanner, (yylsp[-2]))); + const auto start = format::Pos::from(tokAt(scanner, (yylsp[-3]))); + if (format::is_replace_braces()) { + format::skip_spaces_or_print(tokAt(scanner, (yylsp[-3])), tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1])), yyextra->das_tab_size); + } + + (yyval.pExpression) = new ExprTryCatch(tokAt(scanner,(yylsp[-3])),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); } break; @@ -8464,83 +8464,83 @@ YYLTYPE yylloc = yyloc_default; break; case 358: /* tuple_expansion: "name" */ - { - (yyval.pNameList) = new vector(); - (yyval.pNameList)->push_back(*(yyvsp[0].s)); - delete (yyvsp[0].s); + { + (yyval.pNameList) = new vector(); + (yyval.pNameList)->push_back(*(yyvsp[0].s)); + delete (yyvsp[0].s); } break; case 359: /* tuple_expansion: tuple_expansion ',' "name" */ - { - (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); - delete (yyvsp[0].s); - (yyval.pNameList) = (yyvsp[-2].pNameList); + { + (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); + delete (yyvsp[0].s); + (yyval.pNameList) = (yyvsp[-2].pNameList); } break; case 360: /* tuple_expansion_variable_declaration: "[[" tuple_expansion ']' ']' ':' type_declaration_no_options copy_or_move_or_clone expr semicolon */ - { - // std::cout << "case11" << std::endl; - format::replace_with(false, - format::Pos::from(tokAt(scanner,(yylsp[-8]))), - format::substring_between(tokAt(scanner, (yylsp[-8])), tokAt(scanner, (yylsp[-6]))), - format::Pos::from_last(tokAt(scanner,(yylsp[-5]))), "(", ")"); - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-7].pNameList),tokAt(scanner,(yylsp[-7])),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); - (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; - (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; - (yyval.pVarDecl)->isTupleExpansion = true; + { + // std::cout << "case11" << std::endl; + format::replace_with(false, + format::Pos::from(tokAt(scanner,(yylsp[-8]))), + format::substring_between(tokAt(scanner, (yylsp[-8])), tokAt(scanner, (yylsp[-6]))), + format::Pos::from_last(tokAt(scanner,(yylsp[-5]))), "(", ")"); + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-7].pNameList),tokAt(scanner,(yylsp[-7])),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); + (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; + (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; + (yyval.pVarDecl)->isTupleExpansion = true; } break; case 361: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' ':' type_declaration_no_options copy_or_move_or_clone expr semicolon */ - { - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-6].pNameList),tokAt(scanner,(yylsp[-6])),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); - (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; - (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; - (yyval.pVarDecl)->isTupleExpansion = true; + { + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-6].pNameList),tokAt(scanner,(yylsp[-6])),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); + (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; + (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; + (yyval.pVarDecl)->isTupleExpansion = true; } break; case 362: /* tuple_expansion_variable_declaration: "[[" tuple_expansion ']' ']' optional_ref copy_or_move_or_clone expr semicolon */ - { - // std::cout << "case12" << std::endl; - format::replace_with(false, - format::Pos::from(tokAt(scanner,(yylsp[-7]))), - format::substring_between(tokAt(scanner, (yylsp[-7])), tokAt(scanner, (yylsp[-5]))), - format::Pos::from_last(tokAt(scanner,(yylsp[-4]))), "(", ")"); - - auto typeDecl = new TypeDecl(Type::autoinfer); - typeDecl->at = tokAt(scanner,(yylsp[-6])); - typeDecl->ref = (yyvsp[-3].b); - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-6].pNameList),tokAt(scanner,(yylsp[-6])),typeDecl,(yyvsp[-1].pExpression)); - (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; - (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; - (yyval.pVarDecl)->isTupleExpansion = true; + { + // std::cout << "case12" << std::endl; + format::replace_with(false, + format::Pos::from(tokAt(scanner,(yylsp[-7]))), + format::substring_between(tokAt(scanner, (yylsp[-7])), tokAt(scanner, (yylsp[-5]))), + format::Pos::from_last(tokAt(scanner,(yylsp[-4]))), "(", ")"); + + auto typeDecl = new TypeDecl(Type::autoinfer); + typeDecl->at = tokAt(scanner,(yylsp[-6])); + typeDecl->ref = (yyvsp[-3].b); + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-6].pNameList),tokAt(scanner,(yylsp[-6])),typeDecl,(yyvsp[-1].pExpression)); + (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; + (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; + (yyval.pVarDecl)->isTupleExpansion = true; } break; case 363: /* tuple_expansion_variable_declaration: '(' tuple_expansion ')' optional_ref copy_or_move_or_clone expr semicolon */ - { - auto typeDecl = new TypeDecl(Type::autoinfer); - typeDecl->at = tokAt(scanner,(yylsp[-5])); - typeDecl->ref = (yyvsp[-3].b); - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-5].pNameList),tokAt(scanner,(yylsp[-5])),typeDecl,(yyvsp[-1].pExpression)); - (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; - (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; - (yyval.pVarDecl)->isTupleExpansion = true; + { + auto typeDecl = new TypeDecl(Type::autoinfer); + typeDecl->at = tokAt(scanner,(yylsp[-5])); + typeDecl->ref = (yyvsp[-3].b); + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-5].pNameList),tokAt(scanner,(yylsp[-5])),typeDecl,(yyvsp[-1].pExpression)); + (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; + (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; + (yyval.pVarDecl)->isTupleExpansion = true; } break; case 364: /* expression_let: kwd_let optional_in_scope let_variable_declaration */ - { - (yyval.pExpression) = ast_Let(scanner,(yyvsp[-2].b),(yyvsp[-1].b),(yyvsp[0].pVarDecl),tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0]))); + { + (yyval.pExpression) = ast_Let(scanner,(yyvsp[-2].b),(yyvsp[-1].b),(yyvsp[0].pVarDecl),tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0]))); } break; case 365: /* expression_let: kwd_let optional_in_scope tuple_expansion_variable_declaration */ - { - (yyval.pExpression) = ast_Let(scanner,(yyvsp[-2].b),(yyvsp[-1].b),(yyvsp[0].pVarDecl),tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0]))); + { + (yyval.pExpression) = ast_Let(scanner,(yyvsp[-2].b),(yyvsp[-1].b),(yyvsp[0].pVarDecl),tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0]))); } break; @@ -8553,8 +8553,8 @@ YYLTYPE yylloc = yyloc_default; break; case 368: /* expr_cast: "cast" '<' $@16 type_declaration_no_options '>' $@17 expr */ - { - (yyval.pExpression) = new ExprCast(tokAt(scanner,(yylsp[-6])),(yyvsp[0].pExpression),(yyvsp[-3].pTypeDecl)); + { + (yyval.pExpression) = new ExprCast(tokAt(scanner,(yylsp[-6])),(yyvsp[0].pExpression),(yyvsp[-3].pTypeDecl)); } break; @@ -8567,10 +8567,10 @@ YYLTYPE yylloc = yyloc_default; break; case 371: /* expr_cast: "upcast" '<' $@18 type_declaration_no_options '>' $@19 expr */ - { - auto pCast = new ExprCast(tokAt(scanner,(yylsp[-6])),(yyvsp[0].pExpression),(yyvsp[-3].pTypeDecl)); - pCast->upcast = true; - (yyval.pExpression) = pCast; + { + auto pCast = new ExprCast(tokAt(scanner,(yylsp[-6])),(yyvsp[0].pExpression),(yyvsp[-3].pTypeDecl)); + pCast->upcast = true; + (yyval.pExpression) = pCast; } break; @@ -8583,10 +8583,10 @@ YYLTYPE yylloc = yyloc_default; break; case 374: /* expr_cast: "reinterpret" '<' $@20 type_declaration_no_options '>' $@21 expr */ - { - auto pCast = new ExprCast(tokAt(scanner,(yylsp[-6])),(yyvsp[0].pExpression),(yyvsp[-3].pTypeDecl)); - pCast->reinterpret = true; - (yyval.pExpression) = pCast; + { + auto pCast = new ExprCast(tokAt(scanner,(yylsp[-6])),(yyvsp[0].pExpression),(yyvsp[-3].pTypeDecl)); + pCast->reinterpret = true; + (yyval.pExpression) = pCast; } break; @@ -8599,118 +8599,118 @@ YYLTYPE yylloc = yyloc_default; break; case 377: /* expr_type_decl: "type" '<' $@22 type_declaration '>' $@23 */ - { - (yyval.pExpression) = new ExprTypeDecl(tokAt(scanner,(yylsp[-5])),(yyvsp[-2].pTypeDecl)); + { + (yyval.pExpression) = new ExprTypeDecl(tokAt(scanner,(yylsp[-5])),(yyvsp[-2].pTypeDecl)); } break; case 378: /* expr_type_info: "typeinfo" '(' name_in_namespace expr ')' */ - { - format::replace_with(false, - format::Pos::from(tokAt(scanner,(yylsp[-3]))), - format::get_substring(tokAt(scanner,(yylsp[-2]))), - format::Pos::from(tokAt(scanner,(yylsp[-1]))), " ", "("); - if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { - auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-4])),*(yyvsp[-2].s),ptd->typeexpr); - delete (yyvsp[-1].pExpression); - } else { - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-4])),*(yyvsp[-2].s),(yyvsp[-1].pExpression)); - } - delete (yyvsp[-2].s); + { + format::replace_with(false, + format::Pos::from(tokAt(scanner,(yylsp[-3]))), + format::get_substring(tokAt(scanner,(yylsp[-2]))), + format::Pos::from(tokAt(scanner,(yylsp[-1]))), " ", "("); + if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { + auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-4])),*(yyvsp[-2].s),ptd->typeexpr); + delete (yyvsp[-1].pExpression); + } else { + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-4])),*(yyvsp[-2].s),(yyvsp[-1].pExpression)); + } + delete (yyvsp[-2].s); } break; case 379: /* expr_type_info: "typeinfo" '(' name_in_namespace '<' "name" '>' expr ')' */ - { - format::replace_with(false, - format::Pos::from(tokAt(scanner,(yylsp[-6]))), - format::get_substring(tokRangeAt(scanner,(yylsp[-5]),(yylsp[-2]))), - format::Pos::from(tokAt(scanner,(yylsp[-1]))), " ", "("); - - if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { - auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-7])),*(yyvsp[-5].s),ptd->typeexpr,*(yyvsp[-3].s)); - delete (yyvsp[-1].pExpression); - } else { - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-7])),*(yyvsp[-5].s),(yyvsp[-1].pExpression),*(yyvsp[-3].s)); - } - delete (yyvsp[-5].s); - delete (yyvsp[-3].s); + { + format::replace_with(false, + format::Pos::from(tokAt(scanner,(yylsp[-6]))), + format::get_substring(tokRangeAt(scanner,(yylsp[-5]),(yylsp[-2]))), + format::Pos::from(tokAt(scanner,(yylsp[-1]))), " ", "("); + + if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { + auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-7])),*(yyvsp[-5].s),ptd->typeexpr,*(yyvsp[-3].s)); + delete (yyvsp[-1].pExpression); + } else { + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-7])),*(yyvsp[-5].s),(yyvsp[-1].pExpression),*(yyvsp[-3].s)); + } + delete (yyvsp[-5].s); + delete (yyvsp[-3].s); } break; case 380: /* expr_type_info: "typeinfo" '(' name_in_namespace '<' "name" c_or_s "name" '>' expr ')' */ - { - format::replace_with(false, - format::Pos::from(tokAt(scanner,(yylsp[-8]))), - format::get_substring(tokRangeAt(scanner,(yylsp[-7]),(yylsp[-2]))), - format::Pos::from(tokAt(scanner,(yylsp[-1]))), " ", "("); - - if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { - auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-7].s),ptd->typeexpr,*(yyvsp[-5].s),*(yyvsp[-3].s)); - delete (yyvsp[-1].pExpression); - } else { - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-7].s),(yyvsp[-1].pExpression),*(yyvsp[-5].s),*(yyvsp[-3].s)); - } - delete (yyvsp[-7].s); - delete (yyvsp[-5].s); - delete (yyvsp[-3].s); + { + format::replace_with(false, + format::Pos::from(tokAt(scanner,(yylsp[-8]))), + format::get_substring(tokRangeAt(scanner,(yylsp[-7]),(yylsp[-2]))), + format::Pos::from(tokAt(scanner,(yylsp[-1]))), " ", "("); + + if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { + auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-7].s),ptd->typeexpr,*(yyvsp[-5].s),*(yyvsp[-3].s)); + delete (yyvsp[-1].pExpression); + } else { + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-7].s),(yyvsp[-1].pExpression),*(yyvsp[-5].s),*(yyvsp[-3].s)); + } + delete (yyvsp[-7].s); + delete (yyvsp[-5].s); + delete (yyvsp[-3].s); } break; case 381: /* expr_type_info: "typeinfo" name_in_namespace '(' expr ')' */ - { - if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { - auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-4])),*(yyvsp[-3].s),ptd->typeexpr); - delete (yyvsp[-1].pExpression); - } else { - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-4])),*(yyvsp[-3].s),(yyvsp[-1].pExpression)); - } - delete (yyvsp[-3].s); + { + if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { + auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-4])),*(yyvsp[-3].s),ptd->typeexpr); + delete (yyvsp[-1].pExpression); + } else { + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-4])),*(yyvsp[-3].s),(yyvsp[-1].pExpression)); + } + delete (yyvsp[-3].s); } break; case 382: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" '>' '(' expr ')' */ - { - if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { - auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-7])),*(yyvsp[-6].s),ptd->typeexpr,*(yyvsp[-4].s)); - delete (yyvsp[-1].pExpression); - } else { - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-7])),*(yyvsp[-6].s),(yyvsp[-1].pExpression),*(yyvsp[-4].s)); - } - delete (yyvsp[-6].s); - delete (yyvsp[-4].s); + { + if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { + auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-7])),*(yyvsp[-6].s),ptd->typeexpr,*(yyvsp[-4].s)); + delete (yyvsp[-1].pExpression); + } else { + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-7])),*(yyvsp[-6].s),(yyvsp[-1].pExpression),*(yyvsp[-4].s)); + } + delete (yyvsp[-6].s); + delete (yyvsp[-4].s); } break; case 383: /* expr_type_info: "typeinfo" name_in_namespace '<' "name" semicolon "name" '>' '(' expr ')' */ - { - if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { - auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-8].s),ptd->typeexpr,*(yyvsp[-6].s),*(yyvsp[-4].s)); - delete (yyvsp[-1].pExpression); - } else { - (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-8].s),(yyvsp[-1].pExpression),*(yyvsp[-6].s),*(yyvsp[-4].s)); - } - delete (yyvsp[-8].s); - delete (yyvsp[-6].s); - delete (yyvsp[-4].s); + { + if ( (yyvsp[-1].pExpression)->rtti_isTypeDecl() ) { + auto ptd = (ExprTypeDecl *)(yyvsp[-1].pExpression); + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-8].s),ptd->typeexpr,*(yyvsp[-6].s),*(yyvsp[-4].s)); + delete (yyvsp[-1].pExpression); + } else { + (yyval.pExpression) = new ExprTypeInfo(tokAt(scanner,(yylsp[-9])),*(yyvsp[-8].s),(yyvsp[-1].pExpression),*(yyvsp[-6].s),*(yyvsp[-4].s)); + } + delete (yyvsp[-8].s); + delete (yyvsp[-6].s); + delete (yyvsp[-4].s); } break; case 384: /* expr_list: expr2 */ - { - (yyval.pExpression) = (yyvsp[0].pExpression); + { + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 385: /* expr_list: expr_list ',' expr2 */ - { - (yyval.pExpression) = new ExprSequence(tokAt(scanner,(yylsp[-2])),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); + { + (yyval.pExpression) = new ExprSequence(tokAt(scanner,(yylsp[-2])),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); } break; @@ -8719,23 +8719,23 @@ YYLTYPE yylloc = yyloc_default; break; case 387: /* block_or_simple_block: "=>" expr */ - { - auto retE = new ExprReturn(tokAt(scanner,(yylsp[-1])), (yyvsp[0].pExpression)); - auto blkE = new ExprBlock(); - blkE->at = tokAt(scanner,(yylsp[-1])); - blkE->list.push_back(retE); - (yyval.pExpression) = blkE; + { + auto retE = new ExprReturn(tokAt(scanner,(yylsp[-1])), (yyvsp[0].pExpression)); + auto blkE = new ExprBlock(); + blkE->at = tokAt(scanner,(yylsp[-1])); + blkE->list.push_back(retE); + (yyval.pExpression) = blkE; } break; case 388: /* block_or_simple_block: "=>" "<-" expr */ - { - auto retE = new ExprReturn(tokAt(scanner,(yylsp[-2])), (yyvsp[0].pExpression)); - retE->moveSemantics = true; - auto blkE = new ExprBlock(); - blkE->at = tokAt(scanner,(yylsp[-2])); - blkE->list.push_back(retE); - (yyval.pExpression) = blkE; + { + auto retE = new ExprReturn(tokAt(scanner,(yylsp[-2])), (yyvsp[0].pExpression)); + retE->moveSemantics = true; + auto blkE = new ExprBlock(); + blkE->at = tokAt(scanner,(yylsp[-2])); + blkE->list.push_back(retE); + (yyval.pExpression) = blkE; } break; @@ -8772,18 +8772,18 @@ YYLTYPE yylloc = yyloc_default; break; case 397: /* capture_list: capture_entry */ - { - (yyval.pCaptList) = new vector(); - (yyval.pCaptList)->push_back(*(yyvsp[0].pCapt)); - delete (yyvsp[0].pCapt); + { + (yyval.pCaptList) = new vector(); + (yyval.pCaptList)->push_back(*(yyvsp[0].pCapt)); + delete (yyvsp[0].pCapt); } break; case 398: /* capture_list: capture_list ',' capture_entry */ - { - (yyvsp[-2].pCaptList)->push_back(*(yyvsp[0].pCapt)); - delete (yyvsp[0].pCapt); - (yyval.pCaptList) = (yyvsp[-2].pCaptList); + { + (yyvsp[-2].pCaptList)->push_back(*(yyvsp[0].pCapt)); + delete (yyvsp[0].pCapt); + (yyval.pCaptList) = (yyvsp[-2].pCaptList); } break; @@ -8792,18 +8792,18 @@ YYLTYPE yylloc = yyloc_default; break; case 400: /* optional_capture_list: "[[" capture_list ']' ']' */ - { - if (format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-3]))))) { - format::get_writer() - << "capture(" - << format::substring_between(tokAt(scanner, (yylsp[-3])), tokAt(scanner, (yylsp[-2]))) - << format::get_substring(tokAt(scanner, (yylsp[-2]))) - << format::substring_between(tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1]))) - << ")"; - format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[0])))); - } - - ; (yyval.pCaptList) = (yyvsp[-2].pCaptList); + { + if (format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-3]))))) { + format::get_writer() + << "capture(" + << format::substring_between(tokAt(scanner, (yylsp[-3])), tokAt(scanner, (yylsp[-2]))) + << format::get_substring(tokAt(scanner, (yylsp[-2]))) + << format::substring_between(tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1]))) + << ")"; + format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[0])))); + } + + ; (yyval.pCaptList) = (yyvsp[-2].pCaptList); } break; @@ -8812,27 +8812,27 @@ YYLTYPE yylloc = yyloc_default; break; case 402: /* expr_block: expression_block */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { - format::get_writer() << "$() "; - format::finish_rule(format::Pos::from(tokAt(scanner, (yylsp[0])))); - } - - ExprBlock * closure = (ExprBlock *) (yyvsp[0].pExpression); - (yyval.pExpression) = new ExprMakeBlock(tokAt(scanner,(yylsp[0])),(yyvsp[0].pExpression)); - closure->returnType = new TypeDecl(Type::autoinfer); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { + format::get_writer() << "$() "; + format::finish_rule(format::Pos::from(tokAt(scanner, (yylsp[0])))); + } + + ExprBlock * closure = (ExprBlock *) (yyvsp[0].pExpression); + (yyval.pExpression) = new ExprMakeBlock(tokAt(scanner,(yylsp[0])),(yyvsp[0].pExpression)); + closure->returnType = new TypeDecl(Type::autoinfer); } break; case 403: /* expr_block: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type block_or_simple_block */ - { - (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-5].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4])),tokAt(scanner,(yylsp[-3]))); + { + (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-5].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4])),tokAt(scanner,(yylsp[-3]))); } break; case 404: /* expr_full_block: block_or_lambda optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type block_or_simple_block */ - { - (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-5].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4])),tokAt(scanner,(yylsp[-3]))); + { + (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-5].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4])),tokAt(scanner,(yylsp[-3]))); } break; @@ -8841,8 +8841,8 @@ YYLTYPE yylloc = yyloc_default; break; case 406: /* expr_full_block_assumed_piped: block_or_lambda $@24 optional_annotation_list optional_capture_list optional_function_argument_list optional_function_type expression_block */ - { - (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-6].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4])),tokAt(scanner,(yylsp[-3]))); + { + (yyval.pExpression) = ast_makeBlock(scanner,(yyvsp[-6].i),(yyvsp[-4].faList),(yyvsp[-3].pCaptList),(yyvsp[-2].pVarDeclList),(yyvsp[-1].pTypeDecl),(yyvsp[0].pExpression),tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[-4])),tokAt(scanner,(yylsp[-3]))); } break; @@ -8951,39 +8951,39 @@ YYLTYPE yylloc = yyloc_default; break; case 433: /* expr_assign_pipe_right: "@ <|" expr_block */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { - auto tok = tokAt(scanner, (yylsp[0])); - tok.column += 1; - format::get_writer() << "@" << format::get_substring(tok) << ";"; - format::finish_rule(format::Pos::from_last(tok)); - } - - (yyval.pExpression) = (yyvsp[0].pExpression); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { + auto tok = tokAt(scanner, (yylsp[0])); + tok.column += 1; + format::get_writer() << "@" << format::get_substring(tok) << ";"; + format::finish_rule(format::Pos::from_last(tok)); + } + + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 434: /* expr_assign_pipe_right: "@@ <|" expr_block */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { - auto tok = tokAt(scanner, (yylsp[0])); - tok.column += 1; - format::get_writer() << "@@" << format::get_substring(tok) << ";"; - format::finish_rule(format::Pos::from_last(tok)); - } - (yyval.pExpression) = (yyvsp[0].pExpression); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { + auto tok = tokAt(scanner, (yylsp[0])); + tok.column += 1; + format::get_writer() << "@@" << format::get_substring(tok) << ";"; + format::finish_rule(format::Pos::from_last(tok)); + } + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 435: /* expr_assign_pipe_right: "$ <|" expr_block */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { - auto tok = tokAt(scanner, (yylsp[0])); - tok.column += 1; - format::get_writer() << "$" << format::get_substring(tok) << ";"; - format::finish_rule(format::Pos::from_last(tok)); - } - (yyval.pExpression) = (yyvsp[0].pExpression); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-1]))))) { + auto tok = tokAt(scanner, (yylsp[0])); + tok.column += 1; + format::get_writer() << "$" << format::get_substring(tok) << ";"; + format::finish_rule(format::Pos::from_last(tok)); + } + (yyval.pExpression) = (yyvsp[0].pExpression); } break; @@ -9060,59 +9060,59 @@ YYLTYPE yylloc = yyloc_default; break; case 454: /* expr_named_call: name_in_namespace '(' '[' make_struct_fields ']' ')' */ - { - auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-5])),*(yyvsp[-5].s)); - nc->arguments = (yyvsp[-2].pMakeStruct); - delete (yyvsp[-5].s); - (yyval.pExpression) = nc; + { + auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-5])),*(yyvsp[-5].s)); + nc->arguments = (yyvsp[-2].pMakeStruct); + delete (yyvsp[-5].s); + (yyval.pExpression) = nc; } break; case 455: /* expr_named_call: name_in_namespace '(' expr_list ',' '[' make_struct_fields ']' ')' */ - { - auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-7])),*(yyvsp[-7].s)); - nc->nonNamedArguments = sequenceToList((yyvsp[-5].pExpression)); - nc->arguments = (yyvsp[-2].pMakeStruct); - delete (yyvsp[-7].s); - (yyval.pExpression) = nc; + { + auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-7])),*(yyvsp[-7].s)); + nc->nonNamedArguments = sequenceToList((yyvsp[-5].pExpression)); + nc->arguments = (yyvsp[-2].pMakeStruct); + delete (yyvsp[-7].s); + (yyval.pExpression) = nc; } break; case 456: /* expr_method_call: expr2 "->" "name" '(' ')' */ - { - auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), *(yyvsp[-2].s)); - delete (yyvsp[-2].s); - (yyval.pExpression) = pInvoke; + { + auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), *(yyvsp[-2].s)); + delete (yyvsp[-2].s); + (yyval.pExpression) = pInvoke; } break; case 457: /* expr_method_call: expr2 "->" "name" '(' expr_list ')' */ - { - auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), *(yyvsp[-3].s)); - auto callArgs = sequenceToList((yyvsp[-1].pExpression)); - pInvoke->arguments.insert ( pInvoke->arguments.end(), callArgs.begin(), callArgs.end() ); - delete (yyvsp[-3].s); - (yyval.pExpression) = pInvoke; + { + auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), *(yyvsp[-3].s)); + auto callArgs = sequenceToList((yyvsp[-1].pExpression)); + pInvoke->arguments.insert ( pInvoke->arguments.end(), callArgs.begin(), callArgs.end() ); + delete (yyvsp[-3].s); + (yyval.pExpression) = pInvoke; } break; case 458: /* func_addr_name: name_in_namespace */ - { - (yyval.pExpression) = new ExprAddr(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); - delete (yyvsp[0].s); + { + (yyval.pExpression) = new ExprAddr(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); + delete (yyvsp[0].s); } break; case 459: /* func_addr_name: "$i" '(' expr2 ')' */ - { - auto expr = new ExprAddr(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``ADDR``"); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression), expr, "i"); + { + auto expr = new ExprAddr(tokAt(scanner,(yylsp[-3])),"``MACRO``TAG``ADDR``"); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression), expr, "i"); } break; case 460: /* func_addr_expr: '@' '@' func_addr_name */ - { - (yyval.pExpression) = (yyvsp[0].pExpression); + { + (yyval.pExpression) = (yyvsp[0].pExpression); } break; @@ -9125,10 +9125,10 @@ YYLTYPE yylloc = yyloc_default; break; case 463: /* func_addr_expr: '@' '@' '<' $@25 type_declaration_no_options '>' $@26 func_addr_name */ - { - auto expr = (ExprAddr *) ((yyvsp[0].pExpression)->rtti_isAddr() ? (yyvsp[0].pExpression) : (((ExprTag *) (yyvsp[0].pExpression))->value)); - expr->funcType = (yyvsp[-3].pTypeDecl); - (yyval.pExpression) = (yyvsp[0].pExpression); + { + auto expr = (ExprAddr *) ((yyvsp[0].pExpression)->rtti_isAddr() ? (yyvsp[0].pExpression) : (((ExprTag *) (yyvsp[0].pExpression))->value)); + expr->funcType = (yyvsp[-3].pTypeDecl); + (yyval.pExpression) = (yyvsp[0].pExpression); } break; @@ -9141,76 +9141,76 @@ YYLTYPE yylloc = yyloc_default; break; case 466: /* func_addr_expr: '@' '@' '<' $@27 optional_function_argument_list optional_function_type '>' $@28 func_addr_name */ - { - auto expr = (ExprAddr *) ((yyvsp[0].pExpression)->rtti_isAddr() ? (yyvsp[0].pExpression) : (((ExprTag *) (yyvsp[0].pExpression))->value)); - expr->funcType = new TypeDecl(Type::tFunction); - expr->funcType->firstType = (yyvsp[-3].pTypeDecl); - if ( (yyvsp[-4].pVarDeclList) ) { - varDeclToTypeDecl(scanner, expr->funcType, (yyvsp[-4].pVarDeclList)); - deleteVariableDeclarationList((yyvsp[-4].pVarDeclList)); - } - (yyval.pExpression) = (yyvsp[0].pExpression); + { + auto expr = (ExprAddr *) ((yyvsp[0].pExpression)->rtti_isAddr() ? (yyvsp[0].pExpression) : (((ExprTag *) (yyvsp[0].pExpression))->value)); + expr->funcType = new TypeDecl(Type::tFunction); + expr->funcType->firstType = (yyvsp[-3].pTypeDecl); + if ( (yyvsp[-4].pVarDeclList) ) { + varDeclToTypeDecl(scanner, expr->funcType, (yyvsp[-4].pVarDeclList)); + deleteVariableDeclarationList((yyvsp[-4].pVarDeclList)); + } + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 467: /* expr_field: expr2 '.' "name" */ - { - (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), (yyvsp[-2].pExpression), *(yyvsp[0].s)); - delete (yyvsp[0].s); + { + (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), (yyvsp[-2].pExpression), *(yyvsp[0].s)); + delete (yyvsp[0].s); } break; case 468: /* expr_field: expr2 '.' '.' "name" */ - { - (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), (yyvsp[-3].pExpression), *(yyvsp[0].s), true); - delete (yyvsp[0].s); + { + (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-1])), tokAt(scanner,(yylsp[0])), (yyvsp[-3].pExpression), *(yyvsp[0].s), true); + delete (yyvsp[0].s); } break; case 469: /* expr_field: expr2 '.' "name" '(' ')' */ - { - auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), *(yyvsp[-2].s)); - delete (yyvsp[-2].s); - (yyval.pExpression) = pInvoke; + { + auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), *(yyvsp[-2].s)); + delete (yyvsp[-2].s); + (yyval.pExpression) = pInvoke; } break; case 470: /* expr_field: expr2 '.' "name" '(' expr_list ')' */ - { - auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), *(yyvsp[-3].s)); - auto callArgs = sequenceToList((yyvsp[-1].pExpression)); - pInvoke->arguments.insert ( pInvoke->arguments.end(), callArgs.begin(), callArgs.end() ); - delete (yyvsp[-3].s); - (yyval.pExpression) = pInvoke; + { + auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), *(yyvsp[-3].s)); + auto callArgs = sequenceToList((yyvsp[-1].pExpression)); + pInvoke->arguments.insert ( pInvoke->arguments.end(), callArgs.begin(), callArgs.end() ); + delete (yyvsp[-3].s); + (yyval.pExpression) = pInvoke; } break; case 471: /* expr_field: expr2 '.' "name" '(' '[' make_struct_fields ']' ')' */ - { - auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-5])),*(yyvsp[-5].s)); - nc->methodCall = true; - nc->arguments = (yyvsp[-2].pMakeStruct); - nc->nonNamedArguments.push_back((yyvsp[-7].pExpression)); - delete (yyvsp[-5].s); - (yyval.pExpression) = nc; + { + auto nc = new ExprNamedCall(tokAt(scanner,(yylsp[-5])),*(yyvsp[-5].s)); + nc->methodCall = true; + nc->arguments = (yyvsp[-2].pMakeStruct); + nc->nonNamedArguments.push_back((yyvsp[-7].pExpression)); + delete (yyvsp[-5].s); + (yyval.pExpression) = nc; } break; case 472: /* expr_field: expr2 '.' basic_type_declaration '(' ')' */ - { - auto method_name = das_to_string((yyvsp[-2].type)); - auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), method_name); - (yyval.pExpression) = pInvoke; + { + auto method_name = das_to_string((yyvsp[-2].type)); + auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), method_name); + (yyval.pExpression) = pInvoke; } break; case 473: /* expr_field: expr2 '.' basic_type_declaration '(' expr_list ')' */ - { - auto method_name = das_to_string((yyvsp[-3].type)); - auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), method_name); - auto callArgs = sequenceToList((yyvsp[-1].pExpression)); - pInvoke->arguments.insert ( pInvoke->arguments.end(), callArgs.begin(), callArgs.end() ); - (yyval.pExpression) = pInvoke; + { + auto method_name = das_to_string((yyvsp[-3].type)); + auto pInvoke = makeInvokeMethod(tokAt(scanner,(yylsp[-4])), (yyvsp[-5].pExpression), method_name); + auto callArgs = sequenceToList((yyvsp[-1].pExpression)); + pInvoke->arguments.insert ( pInvoke->arguments.end(), callArgs.begin(), callArgs.end() ); + (yyval.pExpression) = pInvoke; } break; @@ -9223,72 +9223,72 @@ YYLTYPE yylloc = yyloc_default; break; case 476: /* expr_field: expr2 '.' $@29 error $@30 */ - { - (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-3])), tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), ""); - yyerrok; + { + (yyval.pExpression) = new ExprField(tokAt(scanner,(yylsp[-3])), tokAt(scanner,(yylsp[-3])), (yyvsp[-4].pExpression), ""); + yyerrok; } break; case 477: /* expr_call: name_in_namespace '(' ')' */ - { - (yyval.pExpression) = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0])),*(yyvsp[-2].s)); - delete (yyvsp[-2].s); + { + (yyval.pExpression) = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0])),*(yyvsp[-2].s)); + delete (yyvsp[-2].s); } break; case 478: /* expr_call: name_in_namespace '(' "uninitialized" ')' */ - { - auto dd = new ExprMakeStruct(tokAt(scanner,(yylsp[-3]))); - dd->at = tokAt(scanner,(yylsp[-3])); - dd->makeType = new TypeDecl(Type::alias); - dd->makeType->alias = *(yyvsp[-3].s); - dd->useInitializer = false; - dd->alwaysUseInitializer = true; - delete (yyvsp[-3].s); - (yyval.pExpression) = dd; + { + auto dd = new ExprMakeStruct(tokAt(scanner,(yylsp[-3]))); + dd->at = tokAt(scanner,(yylsp[-3])); + dd->makeType = new TypeDecl(Type::alias); + dd->makeType->alias = *(yyvsp[-3].s); + dd->useInitializer = false; + dd->alwaysUseInitializer = true; + delete (yyvsp[-3].s); + (yyval.pExpression) = dd; } break; case 479: /* expr_call: name_in_namespace '(' make_struct_single ')' */ - { - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-3])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = new TypeDecl(Type::alias); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType->alias = *(yyvsp[-3].s); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = true; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; - delete (yyvsp[-3].s); - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-3])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = new TypeDecl(Type::alias); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType->alias = *(yyvsp[-3].s); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = true; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + delete (yyvsp[-3].s); + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; case 480: /* expr_call: name_in_namespace '(' "uninitialized" make_struct_single ')' */ - { - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-4])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = new TypeDecl(Type::alias); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType->alias = *(yyvsp[-4].s); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = false; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; - delete (yyvsp[-4].s); - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->at = tokAt(scanner,(yylsp[-4])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = new TypeDecl(Type::alias); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType->alias = *(yyvsp[-4].s); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = false; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + delete (yyvsp[-4].s); + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; case 481: /* expr_call: name_in_namespace '(' expr_list ')' */ - { - (yyval.pExpression) = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),tokAt(scanner,(yylsp[0])),*(yyvsp[-3].s)),(yyvsp[-1].pExpression)); - delete (yyvsp[-3].s); + { + (yyval.pExpression) = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),tokAt(scanner,(yylsp[0])),*(yyvsp[-3].s)),(yyvsp[-1].pExpression)); + delete (yyvsp[-3].s); } break; case 482: /* expr_call: basic_type_declaration '(' ')' */ - { - (yyval.pExpression) = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[-2].type))); + { + (yyval.pExpression) = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[-2].type))); } break; case 483: /* expr_call: basic_type_declaration '(' expr_list ')' */ - { - (yyval.pExpression) = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[-3].type))),(yyvsp[-1].pExpression)); + { + (yyval.pExpression) = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[-3].type))),(yyvsp[-1].pExpression)); } break; @@ -9405,12 +9405,12 @@ YYLTYPE yylloc = yyloc_default; break; case 512: /* expr2: expr2 ".." expr2 */ - { - need_wrap_current_expr = true; - auto itv = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-1])),"interval"); - itv->arguments.push_back((yyvsp[-2].pExpression)); - itv->arguments.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = itv; + { + need_wrap_current_expr = true; + auto itv = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-1])),"interval"); + itv->arguments.push_back((yyvsp[-2].pExpression)); + itv->arguments.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = itv; } break; @@ -9459,8 +9459,8 @@ YYLTYPE yylloc = yyloc_default; break; case 524: /* expr2: expr2 '?' expr2 ':' expr2 */ - { - need_wrap_current_expr = true; (yyval.pExpression) = new ExprOp3(tokRangeAt(scanner,(yylsp[-4]), (yylsp[0])),"?",(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); + { + need_wrap_current_expr = true; (yyval.pExpression) = new ExprOp3(tokRangeAt(scanner,(yylsp[-4]), (yylsp[0])),"?",(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); } break; @@ -9493,19 +9493,21 @@ YYLTYPE yylloc = yyloc_default; break; case 532: /* expr2: '(' expr_list optional_comma ')' */ - { - if ( (yyvsp[-2].pExpression)->rtti_isSequence() ) { - auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); - mkt->values = sequenceToList((yyvsp[-2].pExpression)); - (yyval.pExpression) = mkt; - } else if ( (yyvsp[-1].b) ) { - auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); - mkt->values.push_back((yyvsp[-2].pExpression)); - (yyval.pExpression) = mkt; - } else { - (yyvsp[-2].pExpression)->at = tokAt(scanner, (yylsp[-2])); - (yyval.pExpression) = (yyvsp[-2].pExpression); - } + { + if ( (yyvsp[-2].pExpression)->rtti_isSequence() ) { + auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); + mkt->values = sequenceToList((yyvsp[-2].pExpression)); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); + (yyval.pExpression) = mkt; + } else if ( (yyvsp[-1].b) ) { + auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); + mkt->values.push_back((yyvsp[-2].pExpression)); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); + (yyval.pExpression) = mkt; + } else { + (yyvsp[-2].pExpression)->at = tokAt(scanner, (yylsp[-2])); + (yyval.pExpression) = (yyvsp[-2].pExpression); + } } break; @@ -9526,14 +9528,14 @@ YYLTYPE yylloc = yyloc_default; break; case 537: /* expr2: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' ')' */ - { - (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-4].pTypeDecl),(yyvsp[-2].pCaptList),nullptr,tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[-2]))); + { + (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-4].pTypeDecl),(yyvsp[-2].pCaptList),nullptr,tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[-2]))); } break; case 538: /* expr2: "generator" '<' type_declaration_no_options '>' optional_capture_list '(' expr2 ')' */ - { - (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-5].pTypeDecl),(yyvsp[-3].pCaptList),(yyvsp[-1].pExpression),tokAt(scanner,(yylsp[-7])),tokAt(scanner,(yylsp[-3]))); + { + (yyval.pExpression) = ast_makeGenerator(scanner,(yyvsp[-5].pTypeDecl),(yyvsp[-3].pCaptList),(yyvsp[-1].pExpression),tokAt(scanner,(yylsp[-7])),tokAt(scanner,(yylsp[-3]))); } break; @@ -9550,30 +9552,30 @@ YYLTYPE yylloc = yyloc_default; break; case 542: /* expr2: expr2 "is" "type" '<' $@31 type_declaration_no_options '>' $@32 */ - { - (yyval.pExpression) = new ExprIs(tokRangeAt(scanner,(yylsp[-7]), (yylsp[-1])),(yyvsp[-7].pExpression),(yyvsp[-2].pTypeDecl)); + { + (yyval.pExpression) = new ExprIs(tokRangeAt(scanner,(yylsp[-7]), (yylsp[-1])),(yyvsp[-7].pExpression),(yyvsp[-2].pTypeDecl)); } break; case 543: /* expr2: expr2 "is" basic_type_declaration */ - { - auto vdecl = new TypeDecl((yyvsp[0].type)); - vdecl->at = tokAt(scanner,(yylsp[0])); - (yyval.pExpression) = new ExprIs(tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),(yyvsp[-2].pExpression),vdecl); + { + auto vdecl = new TypeDecl((yyvsp[0].type)); + vdecl->at = tokAt(scanner,(yylsp[0])); + (yyval.pExpression) = new ExprIs(tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),(yyvsp[-2].pExpression),vdecl); } break; case 544: /* expr2: expr2 "is" "name" */ - { - (yyval.pExpression) = new ExprIsVariant(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),(yyvsp[-2].pExpression),*(yyvsp[0].s)); - delete (yyvsp[0].s); + { + (yyval.pExpression) = new ExprIsVariant(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),(yyvsp[-2].pExpression),*(yyvsp[0].s)); + delete (yyvsp[0].s); } break; case 545: /* expr2: expr2 "as" "name" */ - { - (yyval.pExpression) = new ExprAsVariant(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),(yyvsp[-2].pExpression),*(yyvsp[0].s)); - delete (yyvsp[0].s); + { + (yyval.pExpression) = new ExprAsVariant(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),(yyvsp[-2].pExpression),*(yyvsp[0].s)); + delete (yyvsp[0].s); } break; @@ -9586,23 +9588,23 @@ YYLTYPE yylloc = yyloc_default; break; case 548: /* expr2: expr2 "as" "type" '<' $@33 type_declaration '>' $@34 */ - { - auto vname = (yyvsp[-2].pTypeDecl)->describe(); - (yyval.pExpression) = new ExprAsVariant(tokRangeAt(scanner,(yylsp[-7]), (yylsp[-1])),(yyvsp[-7].pExpression),vname); - delete (yyvsp[-2].pTypeDecl); + { + auto vname = (yyvsp[-2].pTypeDecl)->describe(); + (yyval.pExpression) = new ExprAsVariant(tokRangeAt(scanner,(yylsp[-7]), (yylsp[-1])),(yyvsp[-7].pExpression),vname); + delete (yyvsp[-2].pTypeDecl); } break; case 549: /* expr2: expr2 "as" basic_type_declaration */ - { - (yyval.pExpression) = new ExprAsVariant(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),(yyvsp[-2].pExpression),das_to_string((yyvsp[0].type))); + { + (yyval.pExpression) = new ExprAsVariant(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),(yyvsp[-2].pExpression),das_to_string((yyvsp[0].type))); } break; case 550: /* expr2: expr2 '?' "as" "name" */ - { - (yyval.pExpression) = new ExprSafeAsVariant(tokRangeAt(scanner,(yylsp[-3]), (yylsp[0])),(yyvsp[-3].pExpression),*(yyvsp[0].s)); - delete (yyvsp[0].s); + { + (yyval.pExpression) = new ExprSafeAsVariant(tokRangeAt(scanner,(yylsp[-3]), (yylsp[0])),(yyvsp[-3].pExpression),*(yyvsp[0].s)); + delete (yyvsp[0].s); } break; @@ -9615,16 +9617,16 @@ YYLTYPE yylloc = yyloc_default; break; case 553: /* expr2: expr2 '?' "as" "type" '<' $@35 type_declaration '>' $@36 */ - { - auto vname = (yyvsp[-2].pTypeDecl)->describe(); - (yyval.pExpression) = new ExprSafeAsVariant(tokRangeAt(scanner,(yylsp[-8]), (yylsp[-1])),(yyvsp[-8].pExpression),vname); - delete (yyvsp[-2].pTypeDecl); + { + auto vname = (yyvsp[-2].pTypeDecl)->describe(); + (yyval.pExpression) = new ExprSafeAsVariant(tokRangeAt(scanner,(yylsp[-8]), (yylsp[-1])),(yyvsp[-8].pExpression),vname); + delete (yyvsp[-2].pTypeDecl); } break; case 554: /* expr2: expr2 '?' "as" basic_type_declaration */ - { - (yyval.pExpression) = new ExprSafeAsVariant(tokRangeAt(scanner,(yylsp[-3]), (yylsp[0])),(yyvsp[-3].pExpression),das_to_string((yyvsp[0].type))); + { + (yyval.pExpression) = new ExprSafeAsVariant(tokRangeAt(scanner,(yylsp[-3]), (yylsp[0])),(yyvsp[-3].pExpression),das_to_string((yyvsp[0].type))); } break; @@ -9665,28 +9667,28 @@ YYLTYPE yylloc = yyloc_default; break; case 564: /* expr2: expr2 "|>" basic_type_declaration */ - { - auto fncall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[0].type))); - (yyval.pExpression) = ast_rpipe(scanner,(yyvsp[-2].pExpression),fncall,tokRangeAt(scanner,(yylsp[-2]), (yylsp[0]))); + { + auto fncall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[0])),tokAt(scanner,(yylsp[0])),das_to_string((yyvsp[0].type))); + (yyval.pExpression) = ast_rpipe(scanner,(yyvsp[-2].pExpression),fncall,tokRangeAt(scanner,(yylsp[-2]), (yylsp[0]))); } break; case 565: /* expr2: name_in_namespace "name" */ - { - if (format::prepare_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-1]))))) { - format::get_writer() << "." << format::get_substring(tokAt(scanner,(yylsp[0]))); - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - - (yyval.pExpression) = ast_NameName(scanner,(yyvsp[-1].s),(yyvsp[0].s),tokRangeAt(scanner,(yylsp[-1]),(yylsp[0])),tokAt(scanner,(yylsp[0]))); + { + if (format::prepare_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-1]))))) { + format::get_writer() << "." << format::get_substring(tokAt(scanner,(yylsp[0]))); + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + + (yyval.pExpression) = ast_NameName(scanner,(yyvsp[-1].s),(yyvsp[0].s),tokRangeAt(scanner,(yylsp[-1]),(yylsp[0])),tokAt(scanner,(yylsp[0]))); } break; case 566: /* expr2: "unsafe" '(' expr2 ')' */ - { - (yyvsp[-1].pExpression)->alwaysSafe = true; - (yyvsp[-1].pExpression)->userSaidItsSafe = true; - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + (yyvsp[-1].pExpression)->alwaysSafe = true; + (yyvsp[-1].pExpression)->userSaidItsSafe = true; + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; @@ -9695,12 +9697,12 @@ YYLTYPE yylloc = yyloc_default; break; case 568: /* expr: expr2 */ - { - if (need_wrap_current_expr) { - format::wrap_par_expr_newline(tokAt(scanner,(yylsp[0])), (yyvsp[0].pExpression)->at); - need_wrap_current_expr = false; - } - (yyval.pExpression) = (yyvsp[0].pExpression); + { + if (need_wrap_current_expr) { + format::wrap_par_expr_newline(tokAt(scanner,(yylsp[0])), (yyvsp[0].pExpression)->at); + need_wrap_current_expr = false; + } + (yyval.pExpression) = (yyvsp[0].pExpression); } break; @@ -9729,72 +9731,72 @@ YYLTYPE yylloc = yyloc_default; break; case 575: /* expr_mtag: "$c" '(' expr2 ')' '(' ')' */ - { - auto ccall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-5])),tokAt(scanner,(yylsp[0])),"``MACRO``TAG``CALL``"); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-5])),(yyvsp[-3].pExpression),ccall,"c"); + { + auto ccall = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-5])),tokAt(scanner,(yylsp[0])),"``MACRO``TAG``CALL``"); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-5])),(yyvsp[-3].pExpression),ccall,"c"); } break; case 576: /* expr_mtag: "$c" '(' expr2 ')' '(' expr_list ')' */ - { - auto ccall = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),"``MACRO``TAG``CALL``"),(yyvsp[-1].pExpression)); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-6])),(yyvsp[-4].pExpression),ccall,"c"); + { + auto ccall = parseFunctionArguments(yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),tokAt(scanner,(yylsp[0])),"``MACRO``TAG``CALL``"),(yyvsp[-1].pExpression)); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-6])),(yyvsp[-4].pExpression),ccall,"c"); } break; case 577: /* expr_mtag: expr2 '.' "$f" '(' expr2 ')' */ - { - auto cfield = new ExprField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), (yyvsp[-5].pExpression), "``MACRO``TAG``FIELD``"); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); + { + auto cfield = new ExprField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), (yyvsp[-5].pExpression), "``MACRO``TAG``FIELD``"); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; case 578: /* expr_mtag: expr2 "?." "$f" '(' expr2 ')' */ - { - auto cfield = new ExprSafeField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), (yyvsp[-5].pExpression), "``MACRO``TAG``FIELD``"); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); + { + auto cfield = new ExprSafeField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), (yyvsp[-5].pExpression), "``MACRO``TAG``FIELD``"); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; case 579: /* expr_mtag: expr2 '.' '.' "$f" '(' expr2 ')' */ - { - auto cfield = new ExprField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), (yyvsp[-6].pExpression), "``MACRO``TAG``FIELD``", true); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); + { + auto cfield = new ExprField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), (yyvsp[-6].pExpression), "``MACRO``TAG``FIELD``", true); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; case 580: /* expr_mtag: expr2 '.' "?." "$f" '(' expr2 ')' */ - { - auto cfield = new ExprSafeField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), (yyvsp[-6].pExpression), "``MACRO``TAG``FIELD``", true); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); + { + auto cfield = new ExprSafeField(tokAt(scanner,(yylsp[-4])), tokAt(scanner,(yylsp[-1])), (yyvsp[-6].pExpression), "``MACRO``TAG``FIELD``", true); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; case 581: /* expr_mtag: expr2 "as" "$f" '(' expr2 ')' */ - { - auto cfield = new ExprAsVariant(tokAt(scanner,(yylsp[-4])),(yyvsp[-5].pExpression),"``MACRO``TAG``FIELD``"); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); + { + auto cfield = new ExprAsVariant(tokAt(scanner,(yylsp[-4])),(yyvsp[-5].pExpression),"``MACRO``TAG``FIELD``"); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; case 582: /* expr_mtag: expr2 '?' "as" "$f" '(' expr2 ')' */ - { - auto cfield = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-4])),(yyvsp[-6].pExpression),"``MACRO``TAG``FIELD``"); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); + { + auto cfield = new ExprSafeAsVariant(tokAt(scanner,(yylsp[-4])),(yyvsp[-6].pExpression),"``MACRO``TAG``FIELD``"); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; case 583: /* expr_mtag: expr2 "is" "$f" '(' expr2 ')' */ - { - auto cfield = new ExprIsVariant(tokAt(scanner,(yylsp[-4])),(yyvsp[-5].pExpression),"``MACRO``TAG``FIELD``"); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); + { + auto cfield = new ExprIsVariant(tokAt(scanner,(yylsp[-4])),(yyvsp[-5].pExpression),"``MACRO``TAG``FIELD``"); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression),cfield,"f"); } break; case 584: /* expr_mtag: '@' '@' "$c" '(' expr2 ')' */ - { - auto ccall = new ExprAddr(tokAt(scanner,(yylsp[-4])),"``MACRO``TAG``ADDR``"); - (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-3])),(yyvsp[-1].pExpression),ccall,"c"); + { + auto ccall = new ExprAddr(tokAt(scanner,(yylsp[-4])),"``MACRO``TAG``ADDR``"); + (yyval.pExpression) = new ExprTag(tokAt(scanner,(yylsp[-3])),(yyvsp[-1].pExpression),ccall,"c"); } break; @@ -9803,14 +9805,14 @@ YYLTYPE yylloc = yyloc_default; break; case 586: /* optional_field_annotation: "[[" annotation_argument_list ']' ']' */ - { - if (format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-3]))))) { - for (const auto &arg: *(yyvsp[-2].aaList)) { - format::get_writer() << "@" << format::get_substring(arg.at); - } - format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[0])))); - } - (yyval.aaList) = (yyvsp[-2].aaList); /*this one is gone when BRABRA is disabled*/ + { + if (format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-3]))))) { + for (const auto &arg: *(yyvsp[-2].aaList)) { + format::get_writer() << "@" << format::get_substring(arg.at); + } + format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[0])))); + } + (yyval.aaList) = (yyvsp[-2].aaList); /*this one is gone when BRABRA is disabled*/ } break; @@ -9859,13 +9861,13 @@ YYLTYPE yylloc = yyloc_default; break; case 598: /* structure_variable_declaration: optional_field_annotation optional_static_member_variable optional_override optional_public_or_private_member_variable variable_declaration */ - { - (yyvsp[0].pVarDecl)->override = (yyvsp[-2].i) == OVERRIDE_OVERRIDE; - (yyvsp[0].pVarDecl)->sealed = (yyvsp[-2].i) == OVERRIDE_SEALED; - (yyvsp[0].pVarDecl)->annotation = (yyvsp[-4].aaList); - (yyvsp[0].pVarDecl)->isPrivate = (yyvsp[-1].b); - (yyvsp[0].pVarDecl)->isStatic = (yyvsp[-3].b); - (yyval.pVarDecl) = (yyvsp[0].pVarDecl); + { + (yyvsp[0].pVarDecl)->override = (yyvsp[-2].i) == OVERRIDE_OVERRIDE; + (yyvsp[0].pVarDecl)->sealed = (yyvsp[-2].i) == OVERRIDE_SEALED; + (yyvsp[0].pVarDecl)->annotation = (yyvsp[-4].aaList); + (yyvsp[0].pVarDecl)->isPrivate = (yyvsp[-1].b); + (yyvsp[0].pVarDecl)->isStatic = (yyvsp[-3].b); + (yyval.pVarDecl) = (yyvsp[0].pVarDecl); } break; @@ -9886,8 +9888,8 @@ YYLTYPE yylloc = yyloc_default; break; case 603: /* struct_variable_declaration_list: %empty */ - { - (yyval.pVarDeclList) = new vector(); + { + (yyval.pVarDeclList) = new vector(); } break; @@ -9896,118 +9898,118 @@ YYLTYPE yylloc = yyloc_default; break; case 605: /* struct_variable_declaration_list: struct_variable_declaration_list "typedef" $@37 "name" '=' type_declaration semicolon opt_sem */ - { - (yyval.pVarDeclList) = (yyvsp[-7].pVarDeclList); - ast_structureAlias(scanner,(yyvsp[-4].s),(yyvsp[-2].pTypeDecl),tokAt(scanner,(yylsp[-6]))); + { + (yyval.pVarDeclList) = (yyvsp[-7].pVarDeclList); + ast_structureAlias(scanner,(yyvsp[-4].s),(yyvsp[-2].pTypeDecl),tokAt(scanner,(yylsp[-6]))); } break; case 606: /* $@38: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeStructureFields(tak); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeStructureFields(tak); + } } break; case 607: /* struct_variable_declaration_list: struct_variable_declaration_list $@38 structure_variable_declaration semicolon opt_sem */ - { - (yyval.pVarDeclList) = (yyvsp[-4].pVarDeclList); - if ( (yyvsp[-2].pVarDecl) ) (yyvsp[-4].pVarDeclList)->push_back((yyvsp[-2].pVarDecl)); - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-4])); - for ( auto & crd : yyextra->g_CommentReaders ) { - for ( const auto & nl : *((yyvsp[-2].pVarDecl)->pNameList) ) { - crd->afterStructureField(nl.name.c_str(), nl.at); - } - } - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterStructureFields(tak); - } + { + (yyval.pVarDeclList) = (yyvsp[-4].pVarDeclList); + if ( (yyvsp[-2].pVarDecl) ) (yyvsp[-4].pVarDeclList)->push_back((yyvsp[-2].pVarDecl)); + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-4])); + for ( auto & crd : yyextra->g_CommentReaders ) { + for ( const auto & nl : *((yyvsp[-2].pVarDecl)->pNameList) ) { + crd->afterStructureField(nl.name.c_str(), nl.at); + } + } + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterStructureFields(tak); + } } break; case 608: /* $@39: %empty */ - { - yyextra->das_force_oxford_comma=true; - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-2])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeFunction(tak); - } + { + yyextra->das_force_oxford_comma=true; + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-2])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeFunction(tak); + } } break; case 609: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable "abstract" optional_constant $@39 function_declaration_header semicolon opt_sem */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-2])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterFunction((yyvsp[-2].pFuncDecl),tak); - } - (yyvsp[-2].pFuncDecl)->isTemplate = yyextra->g_thisStructure->isTemplate; - (yyval.pVarDeclList) = ast_structVarDefAbstract(scanner,(yyvsp[-9].pVarDeclList),(yyvsp[-8].faList),(yyvsp[-6].b),(yyvsp[-4].b), (yyvsp[-2].pFuncDecl)); + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-2])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterFunction((yyvsp[-2].pFuncDecl),tak); + } + (yyvsp[-2].pFuncDecl)->isTemplate = yyextra->g_thisStructure->isTemplate; + (yyval.pVarDeclList) = ast_structVarDefAbstract(scanner,(yyvsp[-9].pVarDeclList),(yyvsp[-8].faList),(yyvsp[-6].b),(yyvsp[-4].b), (yyvsp[-2].pFuncDecl)); } break; case 610: /* $@40: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeFunction(tak); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeFunction(tak); + } } break; case 611: /* struct_variable_declaration_list: struct_variable_declaration_list optional_annotation_list "def" optional_public_or_private_member_variable optional_static_member_variable optional_override optional_constant $@40 function_declaration_header expression_block opt_sem */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterFunction((yyvsp[-2].pFuncDecl),tak); - } - (yyvsp[-2].pFuncDecl)->isTemplate = yyextra->g_thisStructure->isTemplate; - (yyval.pVarDeclList) = ast_structVarDef(scanner,(yyvsp[-10].pVarDeclList),(yyvsp[-9].faList),(yyvsp[-6].b),(yyvsp[-7].b),(yyvsp[-5].i),(yyvsp[-4].b),(yyvsp[-2].pFuncDecl),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-8]),(yylsp[-1])),tokAt(scanner,(yylsp[-9]))); + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterFunction((yyvsp[-2].pFuncDecl),tak); + } + (yyvsp[-2].pFuncDecl)->isTemplate = yyextra->g_thisStructure->isTemplate; + (yyval.pVarDeclList) = ast_structVarDef(scanner,(yyvsp[-10].pVarDeclList),(yyvsp[-9].faList),(yyvsp[-6].b),(yyvsp[-7].b),(yyvsp[-5].i),(yyvsp[-4].b),(yyvsp[-2].pFuncDecl),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-8]),(yylsp[-1])),tokAt(scanner,(yylsp[-9]))); } break; case 612: /* struct_variable_declaration_list: struct_variable_declaration_list '[' annotation_list ']' semicolon opt_sem */ - { - das_yyerror(scanner,"structure field or class method annotation expected to remain on the same line with the field or the class", - tokAt(scanner,(yylsp[-3])), CompilationError::syntax_error); - delete (yyvsp[-3].faList); - (yyval.pVarDeclList) = (yyvsp[-5].pVarDeclList); + { + das_yyerror(scanner,"structure field or class method annotation expected to remain on the same line with the field or the class", + tokAt(scanner,(yylsp[-3])), CompilationError::syntax_error); + delete (yyvsp[-3].faList); + (yyval.pVarDeclList) = (yyvsp[-5].pVarDeclList); } break; case 613: /* function_argument_declaration_no_type: optional_field_annotation kwd_let_var_or_nothing variable_declaration_no_type */ - { - (yyval.pVarDecl) = (yyvsp[0].pVarDecl); - if ( (yyvsp[-1].b) ) { - (yyvsp[0].pVarDecl)->pTypeDecl->constant = true; - } else { - (yyvsp[0].pVarDecl)->pTypeDecl->removeConstant = true; - } - (yyvsp[0].pVarDecl)->annotation = (yyvsp[-2].aaList); + { + (yyval.pVarDecl) = (yyvsp[0].pVarDecl); + if ( (yyvsp[-1].b) ) { + (yyvsp[0].pVarDecl)->pTypeDecl->constant = true; + } else { + (yyvsp[0].pVarDecl)->pTypeDecl->removeConstant = true; + } + (yyvsp[0].pVarDecl)->annotation = (yyvsp[-2].aaList); } break; case 614: /* function_argument_declaration_type: optional_field_annotation kwd_let_var_or_nothing variable_declaration_type */ - { - (yyval.pVarDecl) = (yyvsp[0].pVarDecl); - if ( (yyvsp[-1].b) ) { - (yyvsp[0].pVarDecl)->pTypeDecl->constant = true; - } else { - (yyvsp[0].pVarDecl)->pTypeDecl->removeConstant = true; - } - (yyvsp[0].pVarDecl)->annotation = (yyvsp[-2].aaList); + { + (yyval.pVarDecl) = (yyvsp[0].pVarDecl); + if ( (yyvsp[-1].b) ) { + (yyvsp[0].pVarDecl)->pTypeDecl->constant = true; + } else { + (yyvsp[0].pVarDecl)->pTypeDecl->removeConstant = true; + } + (yyvsp[0].pVarDecl)->annotation = (yyvsp[-2].aaList); } break; case 615: /* function_argument_declaration_type: "$a" '(' expr2 ')' */ - { - auto na = new vector(); - na->push_back(VariableNameAndPosition("``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])))); - auto decl = new VariableDeclaration(na, new TypeDecl(Type::none), (yyvsp[-1].pExpression)); - decl->pTypeDecl->isTag = true; - (yyval.pVarDecl) = decl; + { + auto na = new vector(); + na->push_back(VariableNameAndPosition("``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])))); + auto decl = new VariableDeclaration(na, new TypeDecl(Type::none), (yyvsp[-1].pExpression)); + decl->pTypeDecl->isTag = true; + (yyval.pVarDecl) = decl; } break; @@ -10032,17 +10034,17 @@ YYLTYPE yylloc = yyloc_default; break; case 621: /* tuple_type: type_declaration */ - { - (yyval.pVarDecl) = new VariableDeclaration(nullptr,(yyvsp[0].pTypeDecl),nullptr); + { + (yyval.pVarDecl) = new VariableDeclaration(nullptr,(yyvsp[0].pTypeDecl),nullptr); } break; case 622: /* tuple_type: "name" ':' type_declaration */ - { - auto na = new vector(); - na->push_back(VariableNameAndPosition(*(yyvsp[-2].s),"",tokAt(scanner,(yylsp[-2])))); - (yyval.pVarDecl) = new VariableDeclaration(na,(yyvsp[0].pTypeDecl),nullptr); - delete (yyvsp[-2].s); + { + auto na = new vector(); + na->push_back(VariableNameAndPosition(*(yyvsp[-2].s),"",tokAt(scanner,(yylsp[-2])))); + (yyval.pVarDecl) = new VariableDeclaration(na,(yyvsp[0].pTypeDecl),nullptr); + delete (yyvsp[-2].s); } break; @@ -10055,38 +10057,38 @@ YYLTYPE yylloc = yyloc_default; break; case 625: /* tuple_alias_type_list: %empty */ - { - (yyval.pVarDeclList) = new vector(); + { + (yyval.pVarDeclList) = new vector(); } break; case 626: /* tuple_alias_type_list: tuple_alias_type_list c_or_s */ - { - (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); + { + (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; case 627: /* tuple_alias_type_list: tuple_alias_type_list tuple_type c_or_s */ - { - (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); - /* - if ( !yyextra->g_CommentReaders.empty() ) { - for ( auto & crd : yyextra->g_CommentReaders ) { - for ( const auto & nl : *($decl->pNameList) ) { - crd->afterVariantEntry(nl.name.c_str(), nl.at); - } - } - } - */ + { + (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); + /* + if ( !yyextra->g_CommentReaders.empty() ) { + for ( auto & crd : yyextra->g_CommentReaders ) { + for ( const auto & nl : *($decl->pNameList) ) { + crd->afterVariantEntry(nl.name.c_str(), nl.at); + } + } + } + */ } break; case 628: /* variant_type: "name" ':' type_declaration */ - { - auto na = new vector(); - na->push_back(VariableNameAndPosition(*(yyvsp[-2].s),"",tokAt(scanner,(yylsp[-2])))); - (yyval.pVarDecl) = new VariableDeclaration(na,(yyvsp[0].pTypeDecl),nullptr); - delete (yyvsp[-2].s); + { + auto na = new vector(); + na->push_back(VariableNameAndPosition(*(yyvsp[-2].s),"",tokAt(scanner,(yylsp[-2])))); + (yyval.pVarDecl) = new VariableDeclaration(na,(yyvsp[0].pTypeDecl),nullptr); + delete (yyvsp[-2].s); } break; @@ -10099,27 +10101,27 @@ YYLTYPE yylloc = yyloc_default; break; case 631: /* variant_alias_type_list: %empty */ - { - (yyval.pVarDeclList) = new vector(); + { + (yyval.pVarDeclList) = new vector(); } break; case 632: /* variant_alias_type_list: variant_alias_type_list c_or_s */ - { - (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); + { + (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; case 633: /* variant_alias_type_list: variant_alias_type_list variant_type c_or_s */ - { - (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); - if ( !yyextra->g_CommentReaders.empty() ) { - for ( auto & crd : yyextra->g_CommentReaders ) { - for ( const auto & nl : *((yyvsp[-1].pVarDecl)->pNameList) ) { - crd->afterVariantEntry(nl.name.c_str(), nl.at); - } - } - } + { + (yyval.pVarDeclList) = (yyvsp[-2].pVarDeclList); (yyvsp[-2].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); + if ( !yyextra->g_CommentReaders.empty() ) { + for ( auto & crd : yyextra->g_CommentReaders ) { + for ( const auto & nl : *((yyvsp[-1].pVarDecl)->pNameList) ) { + crd->afterVariantEntry(nl.name.c_str(), nl.at); + } + } + } } break; @@ -10132,54 +10134,54 @@ YYLTYPE yylloc = yyloc_default; break; case 636: /* variable_declaration_no_type: variable_name_with_pos_list */ - { - auto autoT = new TypeDecl(Type::autoinfer); - autoT->at = tokAt(scanner,(yylsp[0])); - autoT->ref = false; - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[0].pNameWithPosList),autoT,nullptr); + { + auto autoT = new TypeDecl(Type::autoinfer); + autoT->at = tokAt(scanner,(yylsp[0])); + autoT->ref = false; + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[0].pNameWithPosList),autoT,nullptr); } break; case 637: /* variable_declaration_no_type: variable_name_with_pos_list '&' */ - { - auto autoT = new TypeDecl(Type::autoinfer); - autoT->at = tokAt(scanner,(yylsp[-1])); - autoT->ref = true; - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-1].pNameWithPosList),autoT,nullptr); + { + auto autoT = new TypeDecl(Type::autoinfer); + autoT->at = tokAt(scanner,(yylsp[-1])); + autoT->ref = true; + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-1].pNameWithPosList),autoT,nullptr); } break; case 638: /* variable_declaration_no_type: variable_name_with_pos_list copy_or_move expr */ - { - auto typeDecl = new TypeDecl(Type::autoinfer); - typeDecl->at = tokAt(scanner,(yylsp[-2])); - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-2].pNameWithPosList),typeDecl,(yyvsp[0].pExpression)); - (yyval.pVarDecl)->init_via_move = (yyvsp[-1].b); + { + auto typeDecl = new TypeDecl(Type::autoinfer); + typeDecl->at = tokAt(scanner,(yylsp[-2])); + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-2].pNameWithPosList),typeDecl,(yyvsp[0].pExpression)); + (yyval.pVarDecl)->init_via_move = (yyvsp[-1].b); } break; case 639: /* variable_declaration_type: variable_name_with_pos_list ':' type_declaration */ - { - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-2].pNameWithPosList),(yyvsp[0].pTypeDecl),nullptr); + { + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-2].pNameWithPosList),(yyvsp[0].pTypeDecl),nullptr); } break; case 640: /* variable_declaration_type: variable_name_with_pos_list ':' type_declaration copy_or_move expr */ - { - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-4].pNameWithPosList),(yyvsp[-2].pTypeDecl),(yyvsp[0].pExpression)); - (yyval.pVarDecl)->init_via_move = (yyvsp[-1].b); + { + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-4].pNameWithPosList),(yyvsp[-2].pTypeDecl),(yyvsp[0].pExpression)); + (yyval.pVarDecl)->init_via_move = (yyvsp[-1].b); } break; case 641: /* variable_declaration: variable_declaration_type */ - { - (yyval.pVarDecl) = (yyvsp[0].pVarDecl); + { + (yyval.pVarDecl) = (yyvsp[0].pVarDecl); } break; case 642: /* variable_declaration: variable_declaration_no_type */ - { - (yyval.pVarDecl) = (yyvsp[0].pVarDecl); + { + (yyval.pVarDecl) = (yyvsp[0].pVarDecl); } break; @@ -10204,139 +10206,139 @@ YYLTYPE yylloc = yyloc_default; break; case 648: /* let_variable_name_with_pos_list: "name" */ - { - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - auto pSL = new vector(); - pSL->push_back(VariableNameAndPosition(*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0])))); - (yyval.pNameWithPosList) = pSL; - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + auto pSL = new vector(); + pSL->push_back(VariableNameAndPosition(*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0])))); + (yyval.pNameWithPosList) = pSL; + delete (yyvsp[0].s); } break; case 649: /* let_variable_name_with_pos_list: "$i" '(' expr2 ')' */ - { - auto pSL = new vector(); - pSL->push_back(VariableNameAndPosition("``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression))); - (yyval.pNameWithPosList) = pSL; + { + auto pSL = new vector(); + pSL->push_back(VariableNameAndPosition("``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression))); + (yyval.pNameWithPosList) = pSL; } break; case 650: /* let_variable_name_with_pos_list: "name" "aka" "name" */ - { - das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - auto pSL = new vector(); - pSL->push_back(VariableNameAndPosition(*(yyvsp[-2].s),*(yyvsp[0].s),tokAt(scanner,(yylsp[-2])))); - (yyval.pNameWithPosList) = pSL; - delete (yyvsp[-2].s); - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + auto pSL = new vector(); + pSL->push_back(VariableNameAndPosition(*(yyvsp[-2].s),*(yyvsp[0].s),tokAt(scanner,(yylsp[-2])))); + (yyval.pNameWithPosList) = pSL; + delete (yyvsp[-2].s); + delete (yyvsp[0].s); } break; case 651: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" */ - { - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - (yyvsp[-2].pNameWithPosList)->push_back(VariableNameAndPosition(*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0])))); - (yyval.pNameWithPosList) = (yyvsp[-2].pNameWithPosList); - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + (yyvsp[-2].pNameWithPosList)->push_back(VariableNameAndPosition(*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0])))); + (yyval.pNameWithPosList) = (yyvsp[-2].pNameWithPosList); + delete (yyvsp[0].s); } break; case 652: /* let_variable_name_with_pos_list: let_variable_name_with_pos_list ',' "name" "aka" "name" */ - { - das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - (yyvsp[-4].pNameWithPosList)->push_back(VariableNameAndPosition(*(yyvsp[-2].s),*(yyvsp[0].s),tokAt(scanner,(yylsp[-2])))); - (yyval.pNameWithPosList) = (yyvsp[-4].pNameWithPosList); - delete (yyvsp[-2].s); - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + (yyvsp[-4].pNameWithPosList)->push_back(VariableNameAndPosition(*(yyvsp[-2].s),*(yyvsp[0].s),tokAt(scanner,(yylsp[-2])))); + (yyval.pNameWithPosList) = (yyvsp[-4].pNameWithPosList); + delete (yyvsp[-2].s); + delete (yyvsp[0].s); } break; case 653: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options semicolon */ - { - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-3].pNameWithPosList),(yyvsp[-1].pTypeDecl),nullptr); + { + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-3].pNameWithPosList),(yyvsp[-1].pTypeDecl),nullptr); } break; case 654: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr semicolon */ - { - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-5].pNameWithPosList),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); - (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; - (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; + { + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-5].pNameWithPosList),(yyvsp[-3].pTypeDecl),(yyvsp[-1].pExpression)); + (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; + (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; } break; case 655: /* let_variable_declaration: let_variable_name_with_pos_list ':' type_declaration_no_options copy_or_move_or_clone expr_pipe */ - { - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-4].pNameWithPosList),(yyvsp[-2].pTypeDecl),(yyvsp[0].pExpression)); - (yyval.pVarDecl)->init_via_move = ((yyvsp[-1].i) & CorM_MOVE) !=0; - (yyval.pVarDecl)->init_via_clone = ((yyvsp[-1].i) & CorM_CLONE) !=0; + { + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-4].pNameWithPosList),(yyvsp[-2].pTypeDecl),(yyvsp[0].pExpression)); + (yyval.pVarDecl)->init_via_move = ((yyvsp[-1].i) & CorM_MOVE) !=0; + (yyval.pVarDecl)->init_via_clone = ((yyvsp[-1].i) & CorM_CLONE) !=0; } break; case 656: /* let_variable_declaration: let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr semicolon */ - { - auto typeDecl = new TypeDecl(Type::autoinfer); - typeDecl->at = tokAt(scanner,(yylsp[-4])); - typeDecl->ref = (yyvsp[-3].b); - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-4].pNameWithPosList),typeDecl,(yyvsp[-1].pExpression)); - (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; - (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; + { + auto typeDecl = new TypeDecl(Type::autoinfer); + typeDecl->at = tokAt(scanner,(yylsp[-4])); + typeDecl->ref = (yyvsp[-3].b); + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-4].pNameWithPosList),typeDecl,(yyvsp[-1].pExpression)); + (yyval.pVarDecl)->init_via_move = ((yyvsp[-2].i) & CorM_MOVE) !=0; + (yyval.pVarDecl)->init_via_clone = ((yyvsp[-2].i) & CorM_CLONE) !=0; } break; case 657: /* let_variable_declaration: let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr */ - { - // Until absence of semicolon with lambda is not fixed - format::try_semicolon_at_eol(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - auto typeDecl = new TypeDecl(Type::autoinfer); - typeDecl->at = tokAt(scanner,(yylsp[-3])); - typeDecl->ref = (yyvsp[-2].b); - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-3].pNameWithPosList),typeDecl,(yyvsp[0].pExpression)); - (yyval.pVarDecl)->init_via_move = ((yyvsp[-1].i) & CorM_MOVE) !=0; - (yyval.pVarDecl)->init_via_clone = ((yyvsp[-1].i) & CorM_CLONE) !=0; + { + // Until absence of semicolon with lambda is not fixed + format::try_semicolon_at_eol(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + auto typeDecl = new TypeDecl(Type::autoinfer); + typeDecl->at = tokAt(scanner,(yylsp[-3])); + typeDecl->ref = (yyvsp[-2].b); + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-3].pNameWithPosList),typeDecl,(yyvsp[0].pExpression)); + (yyval.pVarDecl)->init_via_move = ((yyvsp[-1].i) & CorM_MOVE) !=0; + (yyval.pVarDecl)->init_via_clone = ((yyvsp[-1].i) & CorM_CLONE) !=0; } break; case 658: /* let_variable_declaration: let_variable_name_with_pos_list optional_ref copy_or_move_or_clone expr_pipe */ - { - auto typeDecl = new TypeDecl(Type::autoinfer); - typeDecl->at = tokAt(scanner,(yylsp[-3])); - typeDecl->ref = (yyvsp[-2].b); - (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-3].pNameWithPosList),typeDecl,(yyvsp[0].pExpression)); - (yyval.pVarDecl)->init_via_move = ((yyvsp[-1].i) & CorM_MOVE) !=0; - (yyval.pVarDecl)->init_via_clone = ((yyvsp[-1].i) & CorM_CLONE) !=0; + { + auto typeDecl = new TypeDecl(Type::autoinfer); + typeDecl->at = tokAt(scanner,(yylsp[-3])); + typeDecl->ref = (yyvsp[-2].b); + (yyval.pVarDecl) = new VariableDeclaration((yyvsp[-3].pNameWithPosList),typeDecl,(yyvsp[0].pExpression)); + (yyval.pVarDecl)->init_via_move = ((yyvsp[-1].i) & CorM_MOVE) !=0; + (yyval.pVarDecl)->init_via_clone = ((yyvsp[-1].i) & CorM_CLONE) !=0; } break; case 659: /* global_variable_declaration_list: %empty */ - { - (yyval.pVarDeclList) = new vector(); + { + (yyval.pVarDeclList) = new vector(); } break; case 660: /* $@41: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeGlobalVariables(tak); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeGlobalVariables(tak); + } } break; case 661: /* global_variable_declaration_list: global_variable_declaration_list $@41 optional_field_annotation let_variable_declaration opt_sem */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) - for ( auto & nl : *((yyvsp[-1].pVarDecl)->pNameList) ) - crd->afterGlobalVariable(nl.name.c_str(),tak); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterGlobalVariables(tak); - } - (yyval.pVarDeclList) = (yyvsp[-4].pVarDeclList); - (yyvsp[-1].pVarDecl)->annotation = (yyvsp[-2].aaList); - (yyvsp[-4].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) + for ( auto & nl : *((yyvsp[-1].pVarDecl)->pNameList) ) + crd->afterGlobalVariable(nl.name.c_str(),tak); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterGlobalVariables(tak); + } + (yyval.pVarDeclList) = (yyvsp[-4].pVarDeclList); + (yyvsp[-1].pVarDecl)->annotation = (yyvsp[-2].aaList); + (yyvsp[-4].pVarDeclList)->push_back((yyvsp[-1].pVarDecl)); } break; @@ -10361,79 +10363,79 @@ YYLTYPE yylloc = yyloc_default; break; case 667: /* global_let: kwd_let optional_shared optional_public_or_private_variable open_block global_variable_declaration_list close_block */ - { - handle_brace(format::Pos::from(tokAt(scanner, (yylsp[-2]))), (yyvsp[-2].ui), - format::get_substring(tokRangeAt(scanner, (yylsp[-2]), (yylsp[0]))), - yyextra->das_tab_size, - format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - ast_globalLetList(scanner,(yyvsp[-5].b),(yyvsp[-4].b),(yyvsp[-3].b),(yyvsp[-1].pVarDeclList)); + { + handle_brace(format::Pos::from(tokAt(scanner, (yylsp[-2]))), (yyvsp[-2].ui), + format::get_substring(tokRangeAt(scanner, (yylsp[-2]), (yylsp[0]))), + yyextra->das_tab_size, + format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + ast_globalLetList(scanner,(yyvsp[-5].b),(yyvsp[-4].b),(yyvsp[-3].b),(yyvsp[-1].pVarDeclList)); } break; case 668: /* $@42: %empty */ - { - yyextra->das_force_oxford_comma=true; - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeGlobalVariables(tak); - } + { + yyextra->das_force_oxford_comma=true; + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeGlobalVariables(tak); + } } break; case 669: /* global_let: kwd_let optional_shared optional_public_or_private_variable $@42 optional_field_annotation let_variable_declaration */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) - for ( auto & nl : *((yyvsp[0].pVarDecl)->pNameList) ) - crd->afterGlobalVariable(nl.name.c_str(),tak); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterGlobalVariables(tak); - } - ast_globalLet(scanner,(yyvsp[-5].b),(yyvsp[-4].b),(yyvsp[-3].b),(yyvsp[-1].aaList),(yyvsp[0].pVarDecl)); + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) + for ( auto & nl : *((yyvsp[0].pVarDecl)->pNameList) ) + crd->afterGlobalVariable(nl.name.c_str(),tak); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterGlobalVariables(tak); + } + ast_globalLet(scanner,(yyvsp[-5].b),(yyvsp[-4].b),(yyvsp[-3].b),(yyvsp[-1].aaList),(yyvsp[0].pVarDecl)); } break; case 670: /* enum_list: %empty */ - { - (yyval.pEnumList) = new Enumeration(); + { + (yyval.pEnumList) = new Enumeration(); } break; case 671: /* enum_list: enum_list "name" opt_sem */ - { - format::skip_token(true, false, tokAt(scanner,(yylsp[0]))); - das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); - if ( !(yyvsp[-2].pEnumList)->add(*(yyvsp[-1].s),nullptr,tokAt(scanner,(yylsp[-1]))) ) { - das_yyerror(scanner,"enumeration already declared " + *(yyvsp[-1].s), tokAt(scanner,(yylsp[-1])), - CompilationError::enumeration_value_already_declared); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto tokName = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) { - crd->afterEnumerationEntry((yyvsp[-1].s)->c_str(), tokName); - } - } - delete (yyvsp[-1].s); - (yyval.pEnumList) = (yyvsp[-2].pEnumList); + { + format::skip_token(true, false, tokAt(scanner,(yylsp[0]))); + das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); + if ( !(yyvsp[-2].pEnumList)->add(*(yyvsp[-1].s),nullptr,tokAt(scanner,(yylsp[-1]))) ) { + das_yyerror(scanner,"enumeration already declared " + *(yyvsp[-1].s), tokAt(scanner,(yylsp[-1])), + CompilationError::enumeration_value_already_declared); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto tokName = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) { + crd->afterEnumerationEntry((yyvsp[-1].s)->c_str(), tokName); + } + } + delete (yyvsp[-1].s); + (yyval.pEnumList) = (yyvsp[-2].pEnumList); } break; case 672: /* enum_list: enum_list "name" '=' expr opt_sem */ - { - format::skip_token(true, false, tokAt(scanner,(yylsp[0]))); - das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); - if ( !(yyvsp[-4].pEnumList)->add(*(yyvsp[-3].s),(yyvsp[-1].pExpression),tokAt(scanner,(yylsp[-3]))) ) { - das_yyerror(scanner,"enumeration value already declared " + *(yyvsp[-3].s), tokAt(scanner,(yylsp[-3])), - CompilationError::enumeration_value_already_declared); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto tokName = tokAt(scanner,(yylsp[-3])); - for ( auto & crd : yyextra->g_CommentReaders ) { - crd->afterEnumerationEntry((yyvsp[-3].s)->c_str(), tokName); - } - } - delete (yyvsp[-3].s); - (yyval.pEnumList) = (yyvsp[-4].pEnumList); + { + format::skip_token(true, false, tokAt(scanner,(yylsp[0]))); + das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); + if ( !(yyvsp[-4].pEnumList)->add(*(yyvsp[-3].s),(yyvsp[-1].pExpression),tokAt(scanner,(yylsp[-3]))) ) { + das_yyerror(scanner,"enumeration value already declared " + *(yyvsp[-3].s), tokAt(scanner,(yylsp[-3])), + CompilationError::enumeration_value_already_declared); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto tokName = tokAt(scanner,(yylsp[-3])); + for ( auto & crd : yyextra->g_CommentReaders ) { + crd->afterEnumerationEntry((yyvsp[-3].s)->c_str(), tokName); + } + } + delete (yyvsp[-3].s); + (yyval.pEnumList) = (yyvsp[-4].pEnumList); } break; @@ -10450,62 +10452,62 @@ YYLTYPE yylloc = yyloc_default; break; case 676: /* $@43: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto pubename = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeAlias(pubename); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto pubename = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeAlias(pubename); + } } break; case 677: /* single_alias: optional_public_or_private_alias "name" $@43 '=' type_declaration */ - { - das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); - (yyvsp[0].pTypeDecl)->isPrivateAlias = !(yyvsp[-4].b); - if ( (yyvsp[0].pTypeDecl)->baseType == Type::alias ) { - das_yyerror(scanner,"alias cannot be defined in terms of another alias "+*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3])), - CompilationError::invalid_type); - } - (yyvsp[0].pTypeDecl)->alias = *(yyvsp[-3].s); - if ( !yyextra->g_Program->addAlias((yyvsp[0].pTypeDecl)) ) { - das_yyerror(scanner,"type alias is already defined "+*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3])), - CompilationError::type_alias_already_declared); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto pubename = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterAlias((yyvsp[-3].s)->c_str(),pubename); - } - if ((yylsp[-4]).first_column == (yylsp[-4]).last_column) { - (yyloc).first_line = (yylsp[-3]).first_line; - (yyloc).first_column = (yylsp[-3]).first_column; - } - delete (yyvsp[-3].s); + { + das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); + (yyvsp[0].pTypeDecl)->isPrivateAlias = !(yyvsp[-4].b); + if ( (yyvsp[0].pTypeDecl)->baseType == Type::alias ) { + das_yyerror(scanner,"alias cannot be defined in terms of another alias "+*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3])), + CompilationError::invalid_type); + } + (yyvsp[0].pTypeDecl)->alias = *(yyvsp[-3].s); + if ( !yyextra->g_Program->addAlias((yyvsp[0].pTypeDecl)) ) { + das_yyerror(scanner,"type alias is already defined "+*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3])), + CompilationError::type_alias_already_declared); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto pubename = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterAlias((yyvsp[-3].s)->c_str(),pubename); + } + if ((yylsp[-4]).first_column == (yylsp[-4]).last_column) { + (yyloc).first_line = (yylsp[-3]).first_line; + (yyloc).first_column = (yylsp[-3]).first_column; + } + delete (yyvsp[-3].s); } break; case 678: /* alias_list: single_alias opt_sem */ - { - (yyval.positions) = new vector(1, tokAt(scanner, (yylsp[-1]))); + { + (yyval.positions) = new vector(1, tokAt(scanner, (yylsp[-1]))); } break; case 679: /* alias_list: alias_list single_alias opt_sem */ - { - (yyvsp[-2].positions)->emplace_back(tokAt(scanner, (yylsp[-1]))); - (yyval.positions) = (yyvsp[-2].positions); + { + (yyvsp[-2].positions)->emplace_back(tokAt(scanner, (yylsp[-1]))); + (yyval.positions) = (yyvsp[-2].positions); } break; case 680: /* alias_declaration: "typedef" open_block alias_list close_block */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-3]))))) { - // todo: comments here and all such places, same rule - for (const auto single: *(yyvsp[-1].positions)) { - format::get_writer() << "typedef " << format::get_substring(single) << '\n'; - } - format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[0])))); - } - + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[-3]))))) { + // todo: comments here and all such places, same rule + for (const auto single: *(yyvsp[-1].positions)) { + format::get_writer() << "typedef " << format::get_substring(single) << '\n'; + } + format::finish_rule(format::Pos::from_last(tokAt(scanner, (yylsp[0])))); + } + } break; @@ -10526,58 +10528,58 @@ YYLTYPE yylloc = yyloc_default; break; case 686: /* enum_name: "name" */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto pubename = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeEnumeration(pubename); - } - (yyval.pEnum) = ast_addEmptyEnum(scanner, (yyvsp[0].s), tokAt(scanner,(yylsp[0]))); + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto pubename = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeEnumeration(pubename); + } + (yyval.pEnum) = ast_addEmptyEnum(scanner, (yyvsp[0].s), tokAt(scanner,(yylsp[0]))); } break; case 687: /* enum_declaration: optional_annotation_list "enum" optional_public_or_private_enum enum_name open_block enum_list close_block */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-3])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeEnumerationEntries(tak); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterEnumerationEntries(tak); - } - const auto first_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); - handle_brace(first_loc, (yyvsp[-2].ui), - format::get_substring(first_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), - yyextra->das_tab_size, - format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); - if ( !yyextra->g_CommentReaders.empty() ) { - auto pubename = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterEnumeration((yyvsp[-3].pEnum)->name.c_str(),pubename); - } - ast_enumDeclaration(scanner,(yyvsp[-6].faList),tokAt(scanner,(yylsp[-6])),(yyvsp[-4].b),(yyvsp[-3].pEnum),(yyvsp[-1].pEnumList),Type::tInt); + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-3])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeEnumerationEntries(tak); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterEnumerationEntries(tak); + } + const auto first_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); + handle_brace(first_loc, (yyvsp[-2].ui), + format::get_substring(first_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), + yyextra->das_tab_size, + format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); + if ( !yyextra->g_CommentReaders.empty() ) { + auto pubename = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterEnumeration((yyvsp[-3].pEnum)->name.c_str(),pubename); + } + ast_enumDeclaration(scanner,(yyvsp[-6].faList),tokAt(scanner,(yylsp[-6])),(yyvsp[-4].b),(yyvsp[-3].pEnum),(yyvsp[-1].pEnumList),Type::tInt); } break; case 688: /* enum_declaration: optional_annotation_list "enum" optional_public_or_private_enum enum_name ':' enum_basic_type_declaration open_block enum_list close_block */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-5])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeEnumerationEntries(tak); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterEnumerationEntries(tak); - } - const auto first_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); - handle_brace(first_loc, (yyvsp[-2].ui), - format::get_substring(first_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), - yyextra->das_tab_size, - format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); - if ( !yyextra->g_CommentReaders.empty() ) { - auto pubename = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterEnumeration((yyvsp[-5].pEnum)->name.c_str(),pubename); - } - ast_enumDeclaration(scanner,(yyvsp[-8].faList),tokAt(scanner,(yylsp[-8])),(yyvsp[-6].b),(yyvsp[-5].pEnum),(yyvsp[-1].pEnumList),(yyvsp[-3].type)); + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-5])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeEnumerationEntries(tak); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterEnumerationEntries(tak); + } + const auto first_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); + handle_brace(first_loc, (yyvsp[-2].ui), + format::get_substring(first_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), + yyextra->das_tab_size, + format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); + if ( !yyextra->g_CommentReaders.empty() ) { + auto pubename = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterEnumeration((yyvsp[-5].pEnum)->name.c_str(),pubename); + } + ast_enumDeclaration(scanner,(yyvsp[-8].faList),tokAt(scanner,(yylsp[-8])),(yyvsp[-6].b),(yyvsp[-5].pEnum),(yyvsp[-1].pEnumList),(yyvsp[-3].type)); } break; @@ -10598,8 +10600,8 @@ YYLTYPE yylloc = yyloc_default; break; case 693: /* structure_name: optional_sealed "name" optional_structure_parent */ - { - (yyval.pStructure) = ast_structureName(scanner,(yyvsp[-2].b),(yyvsp[-1].s),tokAt(scanner,(yylsp[-1])),(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + { + (yyval.pStructure) = ast_structureName(scanner,(yyvsp[-2].b),(yyvsp[-1].s),tokAt(scanner,(yylsp[-1])),(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); } break; @@ -10632,102 +10634,102 @@ YYLTYPE yylloc = yyloc_default; break; case 701: /* optional_struct_variable_declaration_list: %empty */ - { - (yyval.pVarDeclList) = new vector(); + { + (yyval.pVarDeclList) = new vector(); } break; case 702: /* optional_struct_variable_declaration_list: open_block struct_variable_declaration_list close_block */ - { - const auto prev_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); - handle_brace(prev_loc, (yyvsp[-2].ui), - format::get_substring(prev_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), - yyextra->das_tab_size, - format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); - (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); + { + const auto prev_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); + handle_brace(prev_loc, (yyvsp[-2].ui), + format::get_substring(prev_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), + yyextra->das_tab_size, + format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); + (yyval.pVarDeclList) = (yyvsp[-1].pVarDeclList); } break; case 703: /* $@45: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeStructure(tak); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeStructure(tak); + } } break; case 704: /* $@46: %empty */ - { - if ( (yyvsp[0].pStructure) ) { - (yyvsp[0].pStructure)->isClass = (yyvsp[-3].i)==CorS_Class || (yyvsp[-3].i)==CorS_ClassTemplate; - (yyvsp[0].pStructure)->isTemplate = (yyvsp[-3].i)==CorS_ClassTemplate || (yyvsp[-3].i)==CorS_StructTemplate; - (yyvsp[0].pStructure)->privateStructure = !(yyvsp[-2].b); - } + { + if ( (yyvsp[0].pStructure) ) { + (yyvsp[0].pStructure)->isClass = (yyvsp[-3].i)==CorS_Class || (yyvsp[-3].i)==CorS_ClassTemplate; + (yyvsp[0].pStructure)->isTemplate = (yyvsp[-3].i)==CorS_ClassTemplate || (yyvsp[-3].i)==CorS_StructTemplate; + (yyvsp[0].pStructure)->privateStructure = !(yyvsp[-2].b); + } } break; case 705: /* structure_declaration: optional_annotation_list class_or_struct optional_public_or_private_structure $@45 structure_name $@46 optional_struct_variable_declaration_list */ - { - if ( (yyvsp[-2].pStructure) ) { - ast_structureDeclaration ( scanner, (yyvsp[-6].faList), tokAt(scanner,(yylsp[-5])), (yyvsp[-2].pStructure), tokAt(scanner,(yylsp[-2])), (yyvsp[0].pVarDeclList) ); - if ( !yyextra->g_CommentReaders.empty() ) { - auto tak = tokAt(scanner,(yylsp[-5])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterStructure((yyvsp[-2].pStructure),tak); - } - } else { - deleteVariableDeclarationList((yyvsp[0].pVarDeclList)); - } + { + if ( (yyvsp[-2].pStructure) ) { + ast_structureDeclaration ( scanner, (yyvsp[-6].faList), tokAt(scanner,(yylsp[-5])), (yyvsp[-2].pStructure), tokAt(scanner,(yylsp[-2])), (yyvsp[0].pVarDeclList) ); + if ( !yyextra->g_CommentReaders.empty() ) { + auto tak = tokAt(scanner,(yylsp[-5])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterStructure((yyvsp[-2].pStructure),tak); + } + } else { + deleteVariableDeclarationList((yyvsp[0].pVarDeclList)); + } } break; case 706: /* variable_name_with_pos_list: "name" */ - { - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - auto pSL = new vector(); - pSL->push_back(VariableNameAndPosition(*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0])))); - (yyval.pNameWithPosList) = pSL; - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + auto pSL = new vector(); + pSL->push_back(VariableNameAndPosition(*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0])))); + (yyval.pNameWithPosList) = pSL; + delete (yyvsp[0].s); } break; case 707: /* variable_name_with_pos_list: "$i" '(' expr2 ')' */ - { - auto pSL = new vector(); - pSL->push_back(VariableNameAndPosition("``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression))); - (yyval.pNameWithPosList) = pSL; + { + auto pSL = new vector(); + pSL->push_back(VariableNameAndPosition("``MACRO``TAG``","",tokAt(scanner,(yylsp[-1])),(yyvsp[-1].pExpression))); + (yyval.pNameWithPosList) = pSL; } break; case 708: /* variable_name_with_pos_list: "name" "aka" "name" */ - { - das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - auto pSL = new vector(); - pSL->push_back(VariableNameAndPosition(*(yyvsp[-2].s),*(yyvsp[0].s),tokAt(scanner,(yylsp[-2])))); - (yyval.pNameWithPosList) = pSL; - delete (yyvsp[-2].s); - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + auto pSL = new vector(); + pSL->push_back(VariableNameAndPosition(*(yyvsp[-2].s),*(yyvsp[0].s),tokAt(scanner,(yylsp[-2])))); + (yyval.pNameWithPosList) = pSL; + delete (yyvsp[-2].s); + delete (yyvsp[0].s); } break; case 709: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" */ - { - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - (yyvsp[-2].pNameWithPosList)->push_back(VariableNameAndPosition(*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0])))); - (yyval.pNameWithPosList) = (yyvsp[-2].pNameWithPosList); - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + (yyvsp[-2].pNameWithPosList)->push_back(VariableNameAndPosition(*(yyvsp[0].s),"",tokAt(scanner,(yylsp[0])))); + (yyval.pNameWithPosList) = (yyvsp[-2].pNameWithPosList); + delete (yyvsp[0].s); } break; case 710: /* variable_name_with_pos_list: variable_name_with_pos_list ',' "name" "aka" "name" */ - { - das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - (yyvsp[-4].pNameWithPosList)->push_back(VariableNameAndPosition(*(yyvsp[-2].s),*(yyvsp[0].s),tokAt(scanner,(yylsp[-2])))); - (yyval.pNameWithPosList) = (yyvsp[-4].pNameWithPosList); - delete (yyvsp[-2].s); - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + (yyvsp[-4].pNameWithPosList)->push_back(VariableNameAndPosition(*(yyvsp[-2].s),*(yyvsp[0].s),tokAt(scanner,(yylsp[-2])))); + (yyval.pNameWithPosList) = (yyvsp[-4].pNameWithPosList); + delete (yyvsp[-2].s); + delete (yyvsp[0].s); } break; @@ -10872,160 +10874,160 @@ YYLTYPE yylloc = yyloc_default; break; case 746: /* structure_type_declaration: name_in_namespace */ - { - (yyval.pTypeDecl) = yyextra->g_Program->makeTypeDeclaration(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); - if ( !(yyval.pTypeDecl) ) { - (yyval.pTypeDecl) = new TypeDecl(Type::tVoid); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); - } - delete (yyvsp[0].s); + { + (yyval.pTypeDecl) = yyextra->g_Program->makeTypeDeclaration(tokAt(scanner,(yylsp[0])),*(yyvsp[0].s)); + if ( !(yyval.pTypeDecl) ) { + (yyval.pTypeDecl) = new TypeDecl(Type::tVoid); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); + } + delete (yyvsp[0].s); } break; case 747: /* auto_type_declaration: "auto" */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); + { + (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; case 748: /* auto_type_declaration: "auto" '(' "name" ')' */ - { - das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); - (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-3])); - (yyval.pTypeDecl)->alias = *(yyvsp[-1].s); - delete (yyvsp[-1].s); + { + das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); + (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-3])); + (yyval.pTypeDecl)->alias = *(yyvsp[-1].s); + delete (yyvsp[-1].s); } break; case 749: /* auto_type_declaration: "$t" '(' expr2 ')' */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::alias); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-3])); - (yyval.pTypeDecl)->alias = "``MACRO``TAG``"; - (yyval.pTypeDecl)->isTag = true; - (yyval.pTypeDecl)->firstType = new TypeDecl(Type::autoinfer); - (yyval.pTypeDecl)->firstType->at = tokAt(scanner, (yylsp[-1])); - (yyval.pTypeDecl)->firstType->dimExpr.push_back((yyvsp[-1].pExpression)); + { + (yyval.pTypeDecl) = new TypeDecl(Type::alias); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-3])); + (yyval.pTypeDecl)->alias = "``MACRO``TAG``"; + (yyval.pTypeDecl)->isTag = true; + (yyval.pTypeDecl)->firstType = new TypeDecl(Type::autoinfer); + (yyval.pTypeDecl)->firstType->at = tokAt(scanner, (yylsp[-1])); + (yyval.pTypeDecl)->firstType->dimExpr.push_back((yyvsp[-1].pExpression)); } break; case 750: /* bitfield_bits: "name" */ - { - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - auto pSL = new vector(); - pSL->push_back(*(yyvsp[0].s)); - (yyval.pNameList) = pSL; - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + auto pSL = new vector(); + pSL->push_back(*(yyvsp[0].s)); + (yyval.pNameList) = pSL; + delete (yyvsp[0].s); } break; case 751: /* bitfield_bits: bitfield_bits semicolon "name" */ - { - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); - (yyval.pNameList) = (yyvsp[-2].pNameList); - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); + (yyval.pNameList) = (yyvsp[-2].pNameList); + delete (yyvsp[0].s); } break; case 752: /* bitfield_bits: bitfield_bits ',' "name" */ - { - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); - (yyval.pNameList) = (yyvsp[-2].pNameList); - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + (yyvsp[-2].pNameList)->push_back(*(yyvsp[0].s)); + (yyval.pNameList) = (yyvsp[-2].pNameList); + delete (yyvsp[0].s); } break; case 755: /* bitfield_alias_bits: %empty */ - { - auto pSL = new vector>(); - (yyval.pNameExprList) = pSL; - + { + auto pSL = new vector>(); + (yyval.pNameExprList) = pSL; + } break; case 756: /* bitfield_alias_bits: bitfield_alias_bits "name" SEMICOLON */ - { - if (format::enum_bitfield_with_comma() && format::is_replace_braces() && format::prepare_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-1]))))) { - format::get_writer() << ","; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); - } - das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); - (yyval.pNameExprList) = (yyvsp[-2].pNameExprList); - (yyval.pNameExprList)->emplace_back(*(yyvsp[-1].s),nullptr); - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-1].s)->c_str(),atvname); - } - delete (yyvsp[-1].s); + { + if (format::enum_bitfield_with_comma() && format::is_replace_braces() && format::prepare_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-1]))))) { + format::get_writer() << ","; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); + } + das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); + (yyval.pNameExprList) = (yyvsp[-2].pNameExprList); + (yyval.pNameExprList)->emplace_back(*(yyvsp[-1].s),nullptr); + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-1].s)->c_str(),atvname); + } + delete (yyvsp[-1].s); } break; case 757: /* bitfield_alias_bits: bitfield_alias_bits "name" commas */ - { - das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); - (yyval.pNameExprList) = (yyvsp[-2].pNameExprList); - (yyval.pNameExprList)->emplace_back(*(yyvsp[-1].s),nullptr); - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-1])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-1].s)->c_str(),atvname); - } - delete (yyvsp[-1].s); + { + das_checkName(scanner,*(yyvsp[-1].s),tokAt(scanner,(yylsp[-1]))); + (yyval.pNameExprList) = (yyvsp[-2].pNameExprList); + (yyval.pNameExprList)->emplace_back(*(yyvsp[-1].s),nullptr); + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-1])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-1].s)->c_str(),atvname); + } + delete (yyvsp[-1].s); } break; case 758: /* bitfield_alias_bits: bitfield_alias_bits "name" */ - { - das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); - (yyval.pNameExprList) = (yyvsp[-1].pNameExprList); - (yyval.pNameExprList)->emplace_back(*(yyvsp[0].s),nullptr); - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[0].s)->c_str(),atvname); - } - delete (yyvsp[0].s); + { + das_checkName(scanner,*(yyvsp[0].s),tokAt(scanner,(yylsp[0]))); + (yyval.pNameExprList) = (yyvsp[-1].pNameExprList); + (yyval.pNameExprList)->emplace_back(*(yyvsp[0].s),nullptr); + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[0].s)->c_str(),atvname); + } + delete (yyvsp[0].s); } break; case 759: /* bitfield_alias_bits: bitfield_alias_bits "name" '=' expr SEMICOLON */ - { - das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); - (yyval.pNameExprList) = (yyvsp[-4].pNameExprList); - (yyval.pNameExprList)->emplace_back(*(yyvsp[-3].s),(yyvsp[-1].pExpression)); - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-3])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-3].s)->c_str(),atvname); - } - delete (yyvsp[-3].s); + { + das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); + (yyval.pNameExprList) = (yyvsp[-4].pNameExprList); + (yyval.pNameExprList)->emplace_back(*(yyvsp[-3].s),(yyvsp[-1].pExpression)); + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-3])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-3].s)->c_str(),atvname); + } + delete (yyvsp[-3].s); } break; case 760: /* bitfield_alias_bits: bitfield_alias_bits "name" '=' expr commas */ - { - das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); - (yyval.pNameExprList) = (yyvsp[-4].pNameExprList); - (yyval.pNameExprList)->emplace_back(*(yyvsp[-3].s),(yyvsp[-1].pExpression)); - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-3])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-3].s)->c_str(),atvname); - } - delete (yyvsp[-3].s); + { + das_checkName(scanner,*(yyvsp[-3].s),tokAt(scanner,(yylsp[-3]))); + (yyval.pNameExprList) = (yyvsp[-4].pNameExprList); + (yyval.pNameExprList)->emplace_back(*(yyvsp[-3].s),(yyvsp[-1].pExpression)); + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-3])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-3].s)->c_str(),atvname); + } + delete (yyvsp[-3].s); } break; case 761: /* bitfield_alias_bits: bitfield_alias_bits "name" '=' expr */ - { - das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); - (yyval.pNameExprList) = (yyvsp[-3].pNameExprList); - (yyval.pNameExprList)->emplace_back(*(yyvsp[-2].s),(yyvsp[0].pExpression)); - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-2])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-2].s)->c_str(),atvname); - } - delete (yyvsp[-2].s); + { + das_checkName(scanner,*(yyvsp[-2].s),tokAt(scanner,(yylsp[-2]))); + (yyval.pNameExprList) = (yyvsp[-3].pNameExprList); + (yyval.pNameExprList)->emplace_back(*(yyvsp[-2].s),(yyvsp[0].pExpression)); + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-2])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntry((yyvsp[-2].s)->c_str(),atvname); + } + delete (yyvsp[-2].s); } break; @@ -11050,9 +11052,9 @@ YYLTYPE yylloc = yyloc_default; break; case 767: /* bitfield_type_declaration: "bitfield" bitfield_basic_type_declaration '<' '>' */ - { - (yyval.pTypeDecl) = new TypeDecl((yyvsp[-2].type)); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-2])); + { + (yyval.pTypeDecl) = new TypeDecl((yyvsp[-2].type)); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-2])); } break; @@ -11065,44 +11067,44 @@ YYLTYPE yylloc = yyloc_default; break; case 770: /* bitfield_type_declaration: "bitfield" bitfield_basic_type_declaration '<' $@47 bitfield_bits '>' $@48 */ - { - (yyval.pTypeDecl) = new TypeDecl((yyvsp[-5].type)); - (yyval.pTypeDecl)->argNames = *(yyvsp[-2].pNameList); - auto maxBits = (yyval.pTypeDecl)->maxBitfieldBits(); - if ( (yyval.pTypeDecl)->argNames.size()>maxBits ) { - das_yyerror(scanner,"only " + to_string(maxBits) + " different bits are allowed in a bitfield",tokAt(scanner,(yylsp[-5])), - CompilationError::invalid_type); - } - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - delete (yyvsp[-2].pNameList); + { + (yyval.pTypeDecl) = new TypeDecl((yyvsp[-5].type)); + (yyval.pTypeDecl)->argNames = *(yyvsp[-2].pNameList); + auto maxBits = (yyval.pTypeDecl)->maxBitfieldBits(); + if ( (yyval.pTypeDecl)->argNames.size()>maxBits ) { + das_yyerror(scanner,"only " + to_string(maxBits) + " different bits are allowed in a bitfield",tokAt(scanner,(yylsp[-5])), + CompilationError::invalid_type); + } + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + delete (yyvsp[-2].pNameList); } break; case 773: /* table_type_pair: type_declaration */ - { - (yyval.aTypePair).firstType = (yyvsp[0].pTypeDecl); - (yyval.aTypePair).secondType = new TypeDecl(Type::tVoid); + { + (yyval.aTypePair).firstType = (yyvsp[0].pTypeDecl); + (yyval.aTypePair).secondType = new TypeDecl(Type::tVoid); } break; case 774: /* table_type_pair: type_declaration c_or_s type_declaration */ - { - (yyval.aTypePair).firstType = (yyvsp[-2].pTypeDecl); - (yyval.aTypePair).secondType = (yyvsp[0].pTypeDecl); + { + (yyval.aTypePair).firstType = (yyvsp[-2].pTypeDecl); + (yyval.aTypePair).secondType = (yyvsp[0].pTypeDecl); } break; case 775: /* dim_list: '[' expr2 ']' */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); - appendDimExpr((yyval.pTypeDecl), (yyvsp[-1].pExpression)); + { + (yyval.pTypeDecl) = new TypeDecl(Type::autoinfer); + appendDimExpr((yyval.pTypeDecl), (yyvsp[-1].pExpression)); } break; case 776: /* dim_list: dim_list '[' expr2 ']' */ - { - (yyval.pTypeDecl) = (yyvsp[-3].pTypeDecl); - appendDimExpr((yyval.pTypeDecl), (yyvsp[-1].pExpression)); + { + (yyval.pTypeDecl) = (yyvsp[-3].pTypeDecl); + appendDimExpr((yyval.pTypeDecl), (yyvsp[-1].pExpression)); } break; @@ -11123,29 +11125,29 @@ YYLTYPE yylloc = yyloc_default; break; case 781: /* type_declaration_no_options: type_declaration_no_options dim_list */ - { - if ( (yyvsp[-1].pTypeDecl)->baseType==Type::typeDecl ) { - das_yyerror(scanner,"type declaration can`t be used as array base type",tokAt(scanner,(yylsp[-1])), - CompilationError::invalid_type); - } else if ( (yyvsp[-1].pTypeDecl)->baseType==Type::typeMacro ) { - das_yyerror(scanner,"macro can`t be used as array base type",tokAt(scanner,(yylsp[-1])), - CompilationError::invalid_type); - } - (yyvsp[-1].pTypeDecl)->dim.insert((yyvsp[-1].pTypeDecl)->dim.begin(), (yyvsp[0].pTypeDecl)->dim.begin(), (yyvsp[0].pTypeDecl)->dim.end()); - (yyvsp[-1].pTypeDecl)->dimExpr.insert((yyvsp[-1].pTypeDecl)->dimExpr.begin(), (yyvsp[0].pTypeDecl)->dimExpr.begin(), (yyvsp[0].pTypeDecl)->dimExpr.end()); - (yyvsp[-1].pTypeDecl)->removeDim = false; - (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); - (yyvsp[0].pTypeDecl)->dimExpr.clear(); - delete (yyvsp[0].pTypeDecl); + { + if ( (yyvsp[-1].pTypeDecl)->baseType==Type::typeDecl ) { + das_yyerror(scanner,"type declaration can`t be used as array base type",tokAt(scanner,(yylsp[-1])), + CompilationError::invalid_type); + } else if ( (yyvsp[-1].pTypeDecl)->baseType==Type::typeMacro ) { + das_yyerror(scanner,"macro can`t be used as array base type",tokAt(scanner,(yylsp[-1])), + CompilationError::invalid_type); + } + (yyvsp[-1].pTypeDecl)->dim.insert((yyvsp[-1].pTypeDecl)->dim.begin(), (yyvsp[0].pTypeDecl)->dim.begin(), (yyvsp[0].pTypeDecl)->dim.end()); + (yyvsp[-1].pTypeDecl)->dimExpr.insert((yyvsp[-1].pTypeDecl)->dimExpr.begin(), (yyvsp[0].pTypeDecl)->dimExpr.begin(), (yyvsp[0].pTypeDecl)->dimExpr.end()); + (yyvsp[-1].pTypeDecl)->removeDim = false; + (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); + (yyvsp[0].pTypeDecl)->dimExpr.clear(); + delete (yyvsp[0].pTypeDecl); } break; case 782: /* type_declaration_no_options: type_declaration_no_options '[' ']' */ - { - (yyvsp[-2].pTypeDecl)->dim.push_back(TypeDecl::dimAuto); - (yyvsp[-2].pTypeDecl)->dimExpr.push_back(nullptr); - (yyvsp[-2].pTypeDecl)->removeDim = false; - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + { + (yyvsp[-2].pTypeDecl)->dim.push_back(TypeDecl::dimAuto); + (yyvsp[-2].pTypeDecl)->dimExpr.push_back(nullptr); + (yyvsp[-2].pTypeDecl)->removeDim = false; + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; @@ -11158,27 +11160,27 @@ YYLTYPE yylloc = yyloc_default; break; case 785: /* type_declaration_no_options: "type" '<' $@49 type_declaration '>' $@50 */ - { - (yyvsp[-2].pTypeDecl)->autoToAlias = true; - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + { + (yyvsp[-2].pTypeDecl)->autoToAlias = true; + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; case 786: /* type_declaration_no_options: "typedecl" '(' expr2 ')' */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::typeDecl); - (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-3]),(yylsp[-1])); - (yyval.pTypeDecl)->dimExpr.push_back((yyvsp[-1].pExpression)); + { + (yyval.pTypeDecl) = new TypeDecl(Type::typeDecl); + (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-3]),(yylsp[-1])); + (yyval.pTypeDecl)->dimExpr.push_back((yyvsp[-1].pExpression)); } break; case 787: /* type_declaration_no_options: '$' name_in_namespace optional_expr_list_in_braces */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::typeMacro); - (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-1]), (yylsp[0])); - (yyval.pTypeDecl)->dimExpr = sequenceToList((yyvsp[0].pExpression)); - (yyval.pTypeDecl)->dimExpr.insert((yyval.pTypeDecl)->dimExpr.begin(), new ExprConstString(tokAt(scanner,(yylsp[-1])), *(yyvsp[-1].s))); - delete (yyvsp[-1].s); + { + (yyval.pTypeDecl) = new TypeDecl(Type::typeMacro); + (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-1]), (yylsp[0])); + (yyval.pTypeDecl)->dimExpr = sequenceToList((yyvsp[0].pExpression)); + (yyval.pTypeDecl)->dimExpr.insert((yyval.pTypeDecl)->dimExpr.begin(), new ExprConstString(tokAt(scanner,(yylsp[-1])), *(yyvsp[-1].s))); + delete (yyvsp[-1].s); } break; @@ -11187,102 +11189,102 @@ YYLTYPE yylloc = yyloc_default; break; case 789: /* type_declaration_no_options: '$' name_in_namespace '<' $@51 type_declaration_no_options_list '>' optional_expr_list_in_braces */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::typeMacro); - (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-5]), (yylsp[0])); - (yyval.pTypeDecl)->dimExpr = typesAndSequenceToList((yyvsp[-2].pTypeDeclList),(yyvsp[0].pExpression)); - (yyval.pTypeDecl)->dimExpr.insert((yyval.pTypeDecl)->dimExpr.begin(), new ExprConstString(tokAt(scanner,(yylsp[-5])), *(yyvsp[-5].s))); - delete (yyvsp[-5].s); + { + (yyval.pTypeDecl) = new TypeDecl(Type::typeMacro); + (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-5]), (yylsp[0])); + (yyval.pTypeDecl)->dimExpr = typesAndSequenceToList((yyvsp[-2].pTypeDeclList),(yyvsp[0].pExpression)); + (yyval.pTypeDecl)->dimExpr.insert((yyval.pTypeDecl)->dimExpr.begin(), new ExprConstString(tokAt(scanner,(yylsp[-5])), *(yyvsp[-5].s))); + delete (yyvsp[-5].s); } break; case 790: /* type_declaration_no_options: type_declaration_no_options '-' '[' ']' */ - { - (yyvsp[-3].pTypeDecl)->removeDim = true; - (yyval.pTypeDecl) = (yyvsp[-3].pTypeDecl); + { + (yyvsp[-3].pTypeDecl)->removeDim = true; + (yyval.pTypeDecl) = (yyvsp[-3].pTypeDecl); } break; case 791: /* type_declaration_no_options: type_declaration_no_options "explicit" */ - { - (yyvsp[-1].pTypeDecl)->isExplicit = true; - (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); + { + (yyvsp[-1].pTypeDecl)->isExplicit = true; + (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); } break; case 792: /* type_declaration_no_options: type_declaration_no_options "const" */ - { - (yyvsp[-1].pTypeDecl)->constant = true; - (yyvsp[-1].pTypeDecl)->removeConstant = false; - (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); + { + (yyvsp[-1].pTypeDecl)->constant = true; + (yyvsp[-1].pTypeDecl)->removeConstant = false; + (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); } break; case 793: /* type_declaration_no_options: type_declaration_no_options '-' "const" */ - { - (yyvsp[-2].pTypeDecl)->constant = false; - (yyvsp[-2].pTypeDecl)->removeConstant = true; - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + { + (yyvsp[-2].pTypeDecl)->constant = false; + (yyvsp[-2].pTypeDecl)->removeConstant = true; + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; case 794: /* type_declaration_no_options: type_declaration_no_options '&' */ - { - (yyvsp[-1].pTypeDecl)->ref = true; - (yyvsp[-1].pTypeDecl)->removeRef = false; - (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); + { + (yyvsp[-1].pTypeDecl)->ref = true; + (yyvsp[-1].pTypeDecl)->removeRef = false; + (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); } break; case 795: /* type_declaration_no_options: type_declaration_no_options '-' '&' */ - { - (yyvsp[-2].pTypeDecl)->ref = false; - (yyvsp[-2].pTypeDecl)->removeRef = true; - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + { + (yyvsp[-2].pTypeDecl)->ref = false; + (yyvsp[-2].pTypeDecl)->removeRef = true; + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; case 796: /* type_declaration_no_options: type_declaration_no_options '#' */ - { - (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); - (yyval.pTypeDecl)->temporary = true; + { + (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); + (yyval.pTypeDecl)->temporary = true; } break; case 797: /* type_declaration_no_options: type_declaration_no_options "implicit" */ - { - (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); - (yyval.pTypeDecl)->implicit = true; + { + (yyval.pTypeDecl) = (yyvsp[-1].pTypeDecl); + (yyval.pTypeDecl)->implicit = true; } break; case 798: /* type_declaration_no_options: type_declaration_no_options '-' '#' */ - { - (yyvsp[-2].pTypeDecl)->temporary = false; - (yyvsp[-2].pTypeDecl)->removeTemporary = true; - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + { + (yyvsp[-2].pTypeDecl)->temporary = false; + (yyvsp[-2].pTypeDecl)->removeTemporary = true; + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; case 799: /* type_declaration_no_options: type_declaration_no_options "==" "const" */ - { - (yyvsp[-2].pTypeDecl)->explicitConst = true; - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + { + (yyvsp[-2].pTypeDecl)->explicitConst = true; + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; case 800: /* type_declaration_no_options: type_declaration_no_options "==" '&' */ - { - (yyvsp[-2].pTypeDecl)->explicitRef = true; - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + { + (yyvsp[-2].pTypeDecl)->explicitRef = true; + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); } break; case 801: /* type_declaration_no_options: type_declaration_no_options '?' */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-1])); - (yyval.pTypeDecl)->firstType = (yyvsp[-1].pTypeDecl); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-1])); + (yyval.pTypeDecl)->firstType = (yyvsp[-1].pTypeDecl); } break; @@ -11295,21 +11297,21 @@ YYLTYPE yylloc = yyloc_default; break; case 804: /* type_declaration_no_options: "smart_ptr" '<' $@52 type_declaration '>' $@53 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - (yyval.pTypeDecl)->smartPtr = true; - (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + (yyval.pTypeDecl)->smartPtr = true; + (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); } break; case 805: /* type_declaration_no_options: type_declaration_no_options "??" */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-1])); - (yyval.pTypeDecl)->firstType = new TypeDecl(Type::tPointer); - (yyval.pTypeDecl)->firstType->at = tokAt(scanner,(yylsp[-1])); - (yyval.pTypeDecl)->firstType->firstType = (yyvsp[-1].pTypeDecl); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tPointer); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-1])); + (yyval.pTypeDecl)->firstType = new TypeDecl(Type::tPointer); + (yyval.pTypeDecl)->firstType->at = tokAt(scanner,(yylsp[-1])); + (yyval.pTypeDecl)->firstType->firstType = (yyvsp[-1].pTypeDecl); } break; @@ -11322,10 +11324,10 @@ YYLTYPE yylloc = yyloc_default; break; case 808: /* type_declaration_no_options: "array" '<' $@54 type_declaration '>' $@55 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tArray); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tArray); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); } break; @@ -11338,11 +11340,11 @@ YYLTYPE yylloc = yyloc_default; break; case 811: /* type_declaration_no_options: "table" '<' $@56 table_type_pair '>' $@57 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tTable); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - (yyval.pTypeDecl)->firstType = (yyvsp[-2].aTypePair).firstType; - (yyval.pTypeDecl)->secondType = (yyvsp[-2].aTypePair).secondType; + { + (yyval.pTypeDecl) = new TypeDecl(Type::tTable); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + (yyval.pTypeDecl)->firstType = (yyvsp[-2].aTypePair).firstType; + (yyval.pTypeDecl)->secondType = (yyvsp[-2].aTypePair).secondType; } break; @@ -11355,18 +11357,18 @@ YYLTYPE yylloc = yyloc_default; break; case 814: /* type_declaration_no_options: "iterator" '<' $@58 type_declaration '>' $@59 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tIterator); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tIterator); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); } break; case 815: /* type_declaration_no_options: "block" */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); - (yyval.pTypeDecl)->firstType = new TypeDecl(Type::tVoid); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); + (yyval.pTypeDecl)->firstType = new TypeDecl(Type::tVoid); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; @@ -11379,10 +11381,10 @@ YYLTYPE yylloc = yyloc_default; break; case 818: /* type_declaration_no_options: "block" '<' $@60 type_declaration '>' $@61 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); } break; @@ -11395,22 +11397,22 @@ YYLTYPE yylloc = yyloc_default; break; case 821: /* type_declaration_no_options: "block" '<' $@62 optional_function_argument_list optional_function_type '>' $@63 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); - (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); - if ( (yyvsp[-3].pVarDeclList) ) { - varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-3].pVarDeclList)); - deleteVariableDeclarationList((yyvsp[-3].pVarDeclList)); - } + { + (yyval.pTypeDecl) = new TypeDecl(Type::tBlock); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); + (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); + if ( (yyvsp[-3].pVarDeclList) ) { + varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-3].pVarDeclList)); + deleteVariableDeclarationList((yyvsp[-3].pVarDeclList)); + } } break; case 822: /* type_declaration_no_options: "function" */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); - (yyval.pTypeDecl)->firstType = new TypeDecl(Type::tVoid); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); + (yyval.pTypeDecl)->firstType = new TypeDecl(Type::tVoid); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; @@ -11423,10 +11425,10 @@ YYLTYPE yylloc = yyloc_default; break; case 825: /* type_declaration_no_options: "function" '<' $@64 type_declaration '>' $@65 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); } break; @@ -11439,22 +11441,22 @@ YYLTYPE yylloc = yyloc_default; break; case 828: /* type_declaration_no_options: "function" '<' $@66 optional_function_argument_list optional_function_type '>' $@67 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); - (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); - if ( (yyvsp[-3].pVarDeclList) ) { - varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-3].pVarDeclList)); - deleteVariableDeclarationList((yyvsp[-3].pVarDeclList)); - } + { + (yyval.pTypeDecl) = new TypeDecl(Type::tFunction); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); + (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); + if ( (yyvsp[-3].pVarDeclList) ) { + varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-3].pVarDeclList)); + deleteVariableDeclarationList((yyvsp[-3].pVarDeclList)); + } } break; case 829: /* type_declaration_no_options: "lambda" */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); - (yyval.pTypeDecl)->firstType = new TypeDecl(Type::tVoid); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); + (yyval.pTypeDecl)->firstType = new TypeDecl(Type::tVoid); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[0])); } break; @@ -11467,10 +11469,10 @@ YYLTYPE yylloc = yyloc_default; break; case 832: /* type_declaration_no_options: "lambda" '<' $@68 type_declaration '>' $@69 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); } break; @@ -11483,14 +11485,14 @@ YYLTYPE yylloc = yyloc_default; break; case 835: /* type_declaration_no_options: "lambda" '<' $@70 optional_function_argument_list optional_function_type '>' $@71 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); - (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); - if ( (yyvsp[-3].pVarDeclList) ) { - varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-3].pVarDeclList)); - deleteVariableDeclarationList((yyvsp[-3].pVarDeclList)); - } + { + (yyval.pTypeDecl) = new TypeDecl(Type::tLambda); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-6])); + (yyval.pTypeDecl)->firstType = (yyvsp[-2].pTypeDecl); + if ( (yyvsp[-3].pVarDeclList) ) { + varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-3].pVarDeclList)); + deleteVariableDeclarationList((yyvsp[-3].pVarDeclList)); + } } break; @@ -11503,11 +11505,11 @@ YYLTYPE yylloc = yyloc_default; break; case 838: /* type_declaration_no_options: "tuple" '<' $@72 tuple_type_list '>' $@73 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tTuple); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-2].pVarDeclList), true); - deleteVariableDeclarationList((yyvsp[-2].pVarDeclList)); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tTuple); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-2].pVarDeclList), true); + deleteVariableDeclarationList((yyvsp[-2].pVarDeclList)); } break; @@ -11520,47 +11522,47 @@ YYLTYPE yylloc = yyloc_default; break; case 841: /* type_declaration_no_options: "variant" '<' $@74 variant_type_list '>' $@75 */ - { - (yyval.pTypeDecl) = new TypeDecl(Type::tVariant); - (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); - varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-2].pVarDeclList), true); - deleteVariableDeclarationList((yyvsp[-2].pVarDeclList)); + { + (yyval.pTypeDecl) = new TypeDecl(Type::tVariant); + (yyval.pTypeDecl)->at = tokAt(scanner,(yylsp[-5])); + varDeclToTypeDecl(scanner, (yyval.pTypeDecl), (yyvsp[-2].pVarDeclList), true); + deleteVariableDeclarationList((yyvsp[-2].pVarDeclList)); } break; case 842: /* type_declaration: type_declaration_no_options */ - { - (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); + { + (yyval.pTypeDecl) = (yyvsp[0].pTypeDecl); } break; case 843: /* type_declaration: type_declaration '|' type_declaration_no_options */ - { - if ( (yyvsp[-2].pTypeDecl)->baseType==Type::option ) { - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); - (yyval.pTypeDecl)->argTypes.push_back((yyvsp[0].pTypeDecl)); - } else { - (yyval.pTypeDecl) = new TypeDecl(Type::option); - (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])); - (yyval.pTypeDecl)->argTypes.push_back((yyvsp[-2].pTypeDecl)); - (yyval.pTypeDecl)->argTypes.push_back((yyvsp[0].pTypeDecl)); - } + { + if ( (yyvsp[-2].pTypeDecl)->baseType==Type::option ) { + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + (yyval.pTypeDecl)->argTypes.push_back((yyvsp[0].pTypeDecl)); + } else { + (yyval.pTypeDecl) = new TypeDecl(Type::option); + (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])); + (yyval.pTypeDecl)->argTypes.push_back((yyvsp[-2].pTypeDecl)); + (yyval.pTypeDecl)->argTypes.push_back((yyvsp[0].pTypeDecl)); + } } break; case 844: /* type_declaration: type_declaration '|' '#' */ - { - if ( (yyvsp[-2].pTypeDecl)->baseType==Type::option ) { - (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); - (yyval.pTypeDecl)->argTypes.push_back(new TypeDecl(*(yyvsp[-2].pTypeDecl)->argTypes.back())); - (yyvsp[-2].pTypeDecl)->argTypes.back()->temporary ^= true; - } else { - (yyval.pTypeDecl) = new TypeDecl(Type::option); - (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])); - (yyval.pTypeDecl)->argTypes.push_back((yyvsp[-2].pTypeDecl)); - (yyval.pTypeDecl)->argTypes.push_back(new TypeDecl(*(yyvsp[-2].pTypeDecl))); - (yyval.pTypeDecl)->argTypes.back()->temporary ^= true; - } + { + if ( (yyvsp[-2].pTypeDecl)->baseType==Type::option ) { + (yyval.pTypeDecl) = (yyvsp[-2].pTypeDecl); + (yyval.pTypeDecl)->argTypes.push_back(new TypeDecl(*(yyvsp[-2].pTypeDecl)->argTypes.back())); + (yyvsp[-2].pTypeDecl)->argTypes.back()->temporary ^= true; + } else { + (yyval.pTypeDecl) = new TypeDecl(Type::option); + (yyval.pTypeDecl)->at = tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])); + (yyval.pTypeDecl)->argTypes.push_back((yyvsp[-2].pTypeDecl)); + (yyval.pTypeDecl)->argTypes.push_back(new TypeDecl(*(yyvsp[-2].pTypeDecl))); + (yyval.pTypeDecl)->argTypes.back()->temporary ^= true; + } } break; @@ -11569,57 +11571,57 @@ YYLTYPE yylloc = yyloc_default; break; case 846: /* $@77: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeTuple(atvname); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeTuple(atvname); + } } break; case 847: /* $@78: %empty */ - { - if (format::is_replace_braces() && (yyvsp[0].ui) != 0xdeadbeef && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { - format::get_writer() << " {"; - format::finish_rule(format::Pos::from(tokAt(scanner,(yylsp[0])))); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-2])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeTupleEntries(atvname); - } + { + if (format::is_replace_braces() && (yyvsp[0].ui) != 0xdeadbeef && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { + format::get_writer() << " {"; + format::finish_rule(format::Pos::from(tokAt(scanner,(yylsp[0])))); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-2])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeTupleEntries(atvname); + } } break; case 848: /* $@79: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-4])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterTupleEntries(atvname); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-4])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterTupleEntries(atvname); + } } break; case 849: /* tuple_alias_declaration: "tuple" optional_public_or_private_alias $@76 "name" $@77 open_block $@78 tuple_alias_type_list $@79 close_block */ - { - if (format::is_replace_braces() && (yyvsp[-4].ui) != 0xdeadbeef && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { - format::get_writer() << "\n" << string((yyvsp[0].ui) * yyextra->das_tab_size, ' ') + "}"; - format::finish_rule(format::Pos::from(tokAt(scanner,(yylsp[0])))); - } - auto vtype = new TypeDecl(Type::tTuple); - vtype->alias = *(yyvsp[-6].s); - vtype->at = tokAt(scanner,(yylsp[-6])); - vtype->isPrivateAlias = !(yyvsp[-8].b); - varDeclToTypeDecl(scanner, vtype, (yyvsp[-2].pVarDeclList), true); - deleteVariableDeclarationList((yyvsp[-2].pVarDeclList)); - if ( !yyextra->g_Program->addAlias(vtype) ) { - das_yyerror(scanner,"type alias is already defined "+*(yyvsp[-6].s),tokAt(scanner,(yylsp[-6])), - CompilationError::type_alias_already_declared); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-6])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterTuple((yyvsp[-6].s)->c_str(),atvname); - } - delete (yyvsp[-6].s); + { + if (format::is_replace_braces() && (yyvsp[-4].ui) != 0xdeadbeef && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { + format::get_writer() << "\n" << string((yyvsp[0].ui) * yyextra->das_tab_size, ' ') + "}"; + format::finish_rule(format::Pos::from(tokAt(scanner,(yylsp[0])))); + } + auto vtype = new TypeDecl(Type::tTuple); + vtype->alias = *(yyvsp[-6].s); + vtype->at = tokAt(scanner,(yylsp[-6])); + vtype->isPrivateAlias = !(yyvsp[-8].b); + varDeclToTypeDecl(scanner, vtype, (yyvsp[-2].pVarDeclList), true); + deleteVariableDeclarationList((yyvsp[-2].pVarDeclList)); + if ( !yyextra->g_Program->addAlias(vtype) ) { + das_yyerror(scanner,"type alias is already defined "+*(yyvsp[-6].s),tokAt(scanner,(yylsp[-6])), + CompilationError::type_alias_already_declared); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-6])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterTuple((yyvsp[-6].s)->c_str(),atvname); + } + delete (yyvsp[-6].s); } break; @@ -11628,58 +11630,58 @@ YYLTYPE yylloc = yyloc_default; break; case 851: /* $@81: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeVariant(atvname); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeVariant(atvname); + } } break; case 852: /* $@82: %empty */ - { - if (format::is_replace_braces() && (yyvsp[0].ui) != 0xdeadbeef && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { - format::get_writer() << " {"; - format::finish_rule(format::Pos::from(tokAt(scanner,(yylsp[0])))); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-2])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeVariantEntries(atvname); - } - + { + if (format::is_replace_braces() && (yyvsp[0].ui) != 0xdeadbeef && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { + format::get_writer() << " {"; + format::finish_rule(format::Pos::from(tokAt(scanner,(yylsp[0])))); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-2])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeVariantEntries(atvname); + } + } break; case 853: /* $@83: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-4])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterVariantEntries(atvname); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-4])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterVariantEntries(atvname); + } } break; case 854: /* variant_alias_declaration: "variant" optional_public_or_private_alias $@80 "name" $@81 open_block $@82 variant_alias_type_list $@83 close_block */ - { - if (format::is_replace_braces() && (yyvsp[0].ui) != 0xdeadbeef && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { - format::get_writer() << "\n" << string((yyvsp[0].ui) * yyextra->das_tab_size, ' ') + "}"; - format::finish_rule(format::Pos::from(tokAt(scanner,(yylsp[0])))); - } - auto vtype = new TypeDecl(Type::tVariant); - vtype->alias = *(yyvsp[-6].s); - vtype->at = tokAt(scanner,(yylsp[-6])); - vtype->isPrivateAlias = !(yyvsp[-8].b); - varDeclToTypeDecl(scanner, vtype, (yyvsp[-2].pVarDeclList), true); - deleteVariableDeclarationList((yyvsp[-2].pVarDeclList)); - if ( !yyextra->g_Program->addAlias(vtype) ) { - das_yyerror(scanner,"type alias is already defined "+*(yyvsp[-6].s),tokAt(scanner,(yylsp[-6])), - CompilationError::type_alias_already_declared); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-6])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterVariant((yyvsp[-6].s)->c_str(),atvname); - } - delete (yyvsp[-6].s); + { + if (format::is_replace_braces() && (yyvsp[0].ui) != 0xdeadbeef && format::prepare_rule(format::Pos::from(tokAt(scanner, (yylsp[0]))))) { + format::get_writer() << "\n" << string((yyvsp[0].ui) * yyextra->das_tab_size, ' ') + "}"; + format::finish_rule(format::Pos::from(tokAt(scanner,(yylsp[0])))); + } + auto vtype = new TypeDecl(Type::tVariant); + vtype->alias = *(yyvsp[-6].s); + vtype->at = tokAt(scanner,(yylsp[-6])); + vtype->isPrivateAlias = !(yyvsp[-8].b); + varDeclToTypeDecl(scanner, vtype, (yyvsp[-2].pVarDeclList), true); + deleteVariableDeclarationList((yyvsp[-2].pVarDeclList)); + if ( !yyextra->g_Program->addAlias(vtype) ) { + das_yyerror(scanner,"type alias is already defined "+*(yyvsp[-6].s),tokAt(scanner,(yylsp[-6])), + CompilationError::type_alias_already_declared); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-6])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterVariant((yyvsp[-6].s)->c_str(),atvname); + } + delete (yyvsp[-6].s); } break; @@ -11688,58 +11690,58 @@ YYLTYPE yylloc = yyloc_default; break; case 856: /* $@85: %empty */ - { - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[0])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeBitfield(atvname); - } + { + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[0])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeBitfield(atvname); + } } break; case 857: /* bitfield_alias_declaration: "bitfield" optional_public_or_private_alias $@84 "name" $@85 bitfield_basic_type_declaration open_block bitfield_alias_bits close_block */ - { - const auto prev_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); - handle_brace(prev_loc, (yyvsp[-2].ui), - format::get_substring(prev_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), - yyextra->das_tab_size, - format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-5])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeBitfieldEntries(atvname); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-5])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntries(atvname); - } - auto btype = new TypeDecl((yyvsp[-3].type)); - btype->alias = *(yyvsp[-5].s); - btype->at = tokAt(scanner,(yylsp[-5])); - btype->isPrivateAlias = !(yyvsp[-7].b); - for ( auto & p : *(yyvsp[-1].pNameExprList) ) { - if ( !get<1>(p) ) { - btype->argNames.push_back(get<0>(p)); - } - } - auto maxBits = btype->maxBitfieldBits(); - if ( btype->argNames.size()>maxBits ) { - das_yyerror(scanner,"only " + to_string(maxBits) + " different bits are allowed in a bitfield",tokAt(scanner,(yylsp[-5])), - CompilationError::invalid_type); - } - for ( auto & p : *(yyvsp[-1].pNameExprList) ) { - if ( get<1>(p) ) { - ast_globalBitfieldConst ( scanner, btype, (yyvsp[-7].b), get<0>(p), get<1>(p) ); - } - } - if ( !yyextra->g_Program->addAlias(btype) ) { - das_yyerror(scanner,"type alias is already defined "+*(yyvsp[-5].s),tokAt(scanner,(yylsp[-5])), - CompilationError::type_alias_already_declared); - } - if ( !yyextra->g_CommentReaders.empty() ) { - auto atvname = tokAt(scanner,(yylsp[-5])); - for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfield((yyvsp[-5].s)->c_str(),atvname); - } - delete (yyvsp[-5].s); - delete (yyvsp[-1].pNameExprList); + { + const auto prev_loc = format::Pos::from(tokAt(scanner,(yylsp[-2]))); + handle_brace(prev_loc, (yyvsp[-2].ui), + format::get_substring(prev_loc, format::Pos::from_last(tokAt(scanner,(yylsp[-1])))), + yyextra->das_tab_size, + format::Pos::from_last(tokAt(scanner,(yylsp[-1])))); + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-5])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->beforeBitfieldEntries(atvname); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-5])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfieldEntries(atvname); + } + auto btype = new TypeDecl((yyvsp[-3].type)); + btype->alias = *(yyvsp[-5].s); + btype->at = tokAt(scanner,(yylsp[-5])); + btype->isPrivateAlias = !(yyvsp[-7].b); + for ( auto & p : *(yyvsp[-1].pNameExprList) ) { + if ( !get<1>(p) ) { + btype->argNames.push_back(get<0>(p)); + } + } + auto maxBits = btype->maxBitfieldBits(); + if ( btype->argNames.size()>maxBits ) { + das_yyerror(scanner,"only " + to_string(maxBits) + " different bits are allowed in a bitfield",tokAt(scanner,(yylsp[-5])), + CompilationError::invalid_type); + } + for ( auto & p : *(yyvsp[-1].pNameExprList) ) { + if ( get<1>(p) ) { + ast_globalBitfieldConst ( scanner, btype, (yyvsp[-7].b), get<0>(p), get<1>(p) ); + } + } + if ( !yyextra->g_Program->addAlias(btype) ) { + das_yyerror(scanner,"type alias is already defined "+*(yyvsp[-5].s),tokAt(scanner,(yylsp[-5])), + CompilationError::type_alias_already_declared); + } + if ( !yyextra->g_CommentReaders.empty() ) { + auto atvname = tokAt(scanner,(yylsp[-5])); + for ( auto & crd : yyextra->g_CommentReaders ) crd->afterBitfield((yyvsp[-5].s)->c_str(),atvname); + } + delete (yyvsp[-5].s); + delete (yyvsp[-1].pNameExprList); } break; @@ -11764,142 +11766,142 @@ YYLTYPE yylloc = yyloc_default; break; case 863: /* make_struct_fields: "name" copy_or_move expr */ - { - auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),*(yyvsp[-2].s),(yyvsp[0].pExpression),(yyvsp[-1].b),false); - delete (yyvsp[-2].s); - auto msd = new MakeStruct(); - msd->push_back(mfd); - (yyval.pMakeStruct) = msd; + { + auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),*(yyvsp[-2].s),(yyvsp[0].pExpression),(yyvsp[-1].b),false); + delete (yyvsp[-2].s); + auto msd = new MakeStruct(); + msd->push_back(mfd); + (yyval.pMakeStruct) = msd; } break; case 864: /* make_struct_fields: "name" ":=" expr */ - { - auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),*(yyvsp[-2].s),(yyvsp[0].pExpression),false,true); - delete (yyvsp[-2].s); - auto msd = new MakeStruct(); - msd->push_back(mfd); - (yyval.pMakeStruct) = msd; + { + auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),*(yyvsp[-2].s),(yyvsp[0].pExpression),false,true); + delete (yyvsp[-2].s); + auto msd = new MakeStruct(); + msd->push_back(mfd); + (yyval.pMakeStruct) = msd; } break; case 865: /* make_struct_fields: make_struct_fields ',' "name" copy_or_move expr */ - { - auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),*(yyvsp[-2].s),(yyvsp[0].pExpression),(yyvsp[-1].b),false); - delete (yyvsp[-2].s); - ((MakeStruct *)(yyvsp[-4].pMakeStruct))->push_back(mfd); - (yyval.pMakeStruct) = (yyvsp[-4].pMakeStruct); + { + auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),*(yyvsp[-2].s),(yyvsp[0].pExpression),(yyvsp[-1].b),false); + delete (yyvsp[-2].s); + ((MakeStruct *)(yyvsp[-4].pMakeStruct))->push_back(mfd); + (yyval.pMakeStruct) = (yyvsp[-4].pMakeStruct); } break; case 866: /* make_struct_fields: make_struct_fields ',' "name" ":=" expr */ - { - auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),*(yyvsp[-2].s),(yyvsp[0].pExpression),false,true); - delete (yyvsp[-2].s); - ((MakeStruct *)(yyvsp[-4].pMakeStruct))->push_back(mfd); - (yyval.pMakeStruct) = (yyvsp[-4].pMakeStruct); + { + auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0])),*(yyvsp[-2].s),(yyvsp[0].pExpression),false,true); + delete (yyvsp[-2].s); + ((MakeStruct *)(yyvsp[-4].pMakeStruct))->push_back(mfd); + (yyval.pMakeStruct) = (yyvsp[-4].pMakeStruct); } break; case 867: /* make_struct_fields: "$f" '(' expr2 ')' copy_or_move expr */ - { - auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-5]), (yylsp[0])),"``MACRO``TAG``FIELD``",(yyvsp[0].pExpression),(yyvsp[-1].b),false); - mfd->tag = (yyvsp[-3].pExpression); - auto msd = new MakeStruct(); - msd->push_back(mfd); - (yyval.pMakeStruct) = msd; + { + auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-5]), (yylsp[0])),"``MACRO``TAG``FIELD``",(yyvsp[0].pExpression),(yyvsp[-1].b),false); + mfd->tag = (yyvsp[-3].pExpression); + auto msd = new MakeStruct(); + msd->push_back(mfd); + (yyval.pMakeStruct) = msd; } break; case 868: /* make_struct_fields: "$f" '(' expr2 ')' ":=" expr */ - { - auto mfd = new MakeFieldDecl(tokRangeAt(scanner, (yylsp[-5]), (yylsp[0])),"``MACRO``TAG``FIELD``",(yyvsp[0].pExpression),false,true); - mfd->tag = (yyvsp[-3].pExpression); - auto msd = new MakeStruct(); - msd->push_back(mfd); - (yyval.pMakeStruct) = msd; + { + auto mfd = new MakeFieldDecl(tokRangeAt(scanner, (yylsp[-5]), (yylsp[0])),"``MACRO``TAG``FIELD``",(yyvsp[0].pExpression),false,true); + mfd->tag = (yyvsp[-3].pExpression); + auto msd = new MakeStruct(); + msd->push_back(mfd); + (yyval.pMakeStruct) = msd; } break; case 869: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr2 ')' copy_or_move expr */ - { - auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-5]),(yylsp[0])),"``MACRO``TAG``FIELD``",(yyvsp[0].pExpression),(yyvsp[-1].b),false); - mfd->tag = (yyvsp[-3].pExpression); - ((MakeStruct *)(yyvsp[-7].pMakeStruct))->push_back(mfd); - (yyval.pMakeStruct) = (yyvsp[-7].pMakeStruct); + { + auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-5]),(yylsp[0])),"``MACRO``TAG``FIELD``",(yyvsp[0].pExpression),(yyvsp[-1].b),false); + mfd->tag = (yyvsp[-3].pExpression); + ((MakeStruct *)(yyvsp[-7].pMakeStruct))->push_back(mfd); + (yyval.pMakeStruct) = (yyvsp[-7].pMakeStruct); } break; case 870: /* make_struct_fields: make_struct_fields ',' "$f" '(' expr2 ')' ":=" expr */ - { - auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-5]), (yylsp[0])),"``MACRO``TAG``FIELD``",(yyvsp[0].pExpression),false,true); - mfd->tag = (yyvsp[-3].pExpression); - ((MakeStruct *)(yyvsp[-7].pMakeStruct))->push_back(mfd); - (yyval.pMakeStruct) = (yyvsp[-7].pMakeStruct); + { + auto mfd = new MakeFieldDecl(tokRangeAt(scanner,(yylsp[-5]), (yylsp[0])),"``MACRO``TAG``FIELD``",(yyvsp[0].pExpression),false,true); + mfd->tag = (yyvsp[-3].pExpression); + ((MakeStruct *)(yyvsp[-7].pMakeStruct))->push_back(mfd); + (yyval.pMakeStruct) = (yyvsp[-7].pMakeStruct); } break; case 871: /* make_variant_dim: %empty */ - { - (yyval.pExpression) = ast_makeStructToMakeVariant(nullptr, LineInfo()); + { + (yyval.pExpression) = ast_makeStructToMakeVariant(nullptr, LineInfo()); } break; case 872: /* make_variant_dim: make_struct_fields */ - { - (yyval.pExpression) = ast_makeStructToMakeVariant((yyvsp[0].pMakeStruct), tokAt(scanner,(yylsp[0]))); + { + (yyval.pExpression) = ast_makeStructToMakeVariant((yyvsp[0].pMakeStruct), tokAt(scanner,(yylsp[0]))); } break; case 873: /* make_struct_single: make_struct_fields optional_comma */ - { - auto msd = new ExprMakeStruct(); - msd->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); - (yyval.pExpression) = msd; + { + auto msd = new ExprMakeStruct(); + msd->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); + (yyval.pExpression) = msd; } break; case 874: /* make_struct_dim: make_struct_fields */ - { - auto msd = new ExprMakeStruct(); - msd->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); - (yyval.pExpression) = msd; + { + auto msd = new ExprMakeStruct(); + msd->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); + (yyval.pExpression) = msd; } break; case 875: /* make_struct_dim: make_struct_dim semicolon make_struct_fields */ - { - ((ExprMakeStruct *) (yyvsp[-2].pExpression))->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); - (yyval.pExpression) = (yyvsp[-2].pExpression); + { + ((ExprMakeStruct *) (yyvsp[-2].pExpression))->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); + (yyval.pExpression) = (yyvsp[-2].pExpression); } break; case 876: /* make_struct_dim_list: '(' make_struct_fields ')' */ - { - auto msd = new ExprMakeStruct(); - msd->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); - (yyval.pExpression) = msd; + { + auto msd = new ExprMakeStruct(); + msd->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); + (yyval.pExpression) = msd; } break; case 877: /* make_struct_dim_list: make_struct_dim_list ',' '(' make_struct_fields ')' */ - { - ((ExprMakeStruct *) (yyvsp[-4].pExpression))->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); - (yyval.pExpression) = (yyvsp[-4].pExpression); + { + ((ExprMakeStruct *) (yyvsp[-4].pExpression))->structs.push_back(MakeStructPtr((yyvsp[-1].pMakeStruct))); + (yyval.pExpression) = (yyvsp[-4].pExpression); } break; case 878: /* make_struct_dim_decl: make_struct_fields */ - { - auto msd = new ExprMakeStruct(); - msd->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); - (yyval.pExpression) = msd; + { + auto msd = new ExprMakeStruct(); + msd->structs.push_back(MakeStructPtr((yyvsp[0].pMakeStruct))); + (yyval.pExpression) = msd; } break; case 879: /* make_struct_dim_decl: make_struct_dim_list optional_comma */ - { - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; @@ -11928,172 +11930,172 @@ YYLTYPE yylloc = yyloc_default; break; case 898: /* make_struct_decl: "[[" type_declaration_no_options make_struct_dim optional_block optional_trailing_delim_sqr_sqr */ - { - // std::cout << "case1" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-4]))))) { - auto type = format::type_to_string((yyvsp[-3].pTypeDecl), tokAt(scanner,(yylsp[-3]))).value_or(""); - const bool is_initialized = false; - const auto before = format::substring_between(tokAt(scanner,(yylsp[-4])), tokAt(scanner, (yylsp[-3]))); - const auto internal = format::handle_msd(tokAt(scanner, (yylsp[-3])), - static_cast((yyvsp[-2].pExpression)), - tokAt(scanner, (yyvsp[-1].pExpression) != nullptr ? (yylsp[-1]) : (yylsp[0])), - type, is_initialized); - if (static_cast((yyvsp[-2].pExpression))->structs.size() == 1) { - // single struct - if (type.find('[') != size_t(-1)) { - format::get_writer() << "fixed_array(" << before << internal << ")"; - } else { - format::get_writer() << before << internal; - } - if ((yyvsp[-1].pExpression) != nullptr) { - format::get_writer() << " <| " << format::get_substring((yyvsp[-1].pExpression)->at); - } - } else { - // array of structs - // const auto internal = format::get_substring(format::Pos::from(tokAt(scanner,@msd)), - // format::Pos::from(tokAt(scanner,@end))); - format::get_writer() << "fixed_array(" << internal << ")"; - } - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = (yyvsp[-3].pTypeDecl); - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); - (yyvsp[-2].pExpression)->at = tokAt(scanner,(yylsp[-4])); - (yyval.pExpression) = (yyvsp[-2].pExpression); + { + // std::cout << "case1" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-4]))))) { + auto type = format::type_to_string((yyvsp[-3].pTypeDecl), tokAt(scanner,(yylsp[-3]))).value_or(""); + const bool is_initialized = false; + const auto before = format::substring_between(tokAt(scanner,(yylsp[-4])), tokAt(scanner, (yylsp[-3]))); + const auto internal = format::handle_msd(tokAt(scanner, (yylsp[-3])), + static_cast((yyvsp[-2].pExpression)), + tokAt(scanner, (yyvsp[-1].pExpression) != nullptr ? (yylsp[-1]) : (yylsp[0])), + type, is_initialized); + if (static_cast((yyvsp[-2].pExpression))->structs.size() == 1) { + // single struct + if (type.find('[') != size_t(-1)) { + format::get_writer() << "fixed_array(" << before << internal << ")"; + } else { + format::get_writer() << before << internal; + } + if ((yyvsp[-1].pExpression) != nullptr) { + format::get_writer() << " <| " << format::get_substring((yyvsp[-1].pExpression)->at); + } + } else { + // array of structs + // const auto internal = format::get_substring(format::Pos::from(tokAt(scanner,@msd)), + // format::Pos::from(tokAt(scanner,@end))); + format::get_writer() << "fixed_array(" << internal << ")"; + } + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = (yyvsp[-3].pTypeDecl); + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); + (yyvsp[-2].pExpression)->at = tokAt(scanner,(yylsp[-4])); + (yyval.pExpression) = (yyvsp[-2].pExpression); } break; case 899: /* make_struct_decl: "[[" type_declaration_no_options optional_block optional_trailing_delim_sqr_sqr */ - { - // // std::cout << "case2" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-3]))))) { - auto type = format::type_to_string((yyvsp[-2].pTypeDecl), tokAt(scanner,(yylsp[-2]))); - das_hash_set always_init = { - // Is there a method to describe all this types? - "structisPointer()) { - format::get_writer() << "default<" << type.value() << ">"; - suffix.clear(); - } else if (any_of(always_init.begin(), always_init.end(), - [&type](auto t){ return type.value_or("").find(t) == 0; })) { - format::get_writer() << type.value_or("") << "("; - } else { - format::get_writer() << type.value_or("") << "("; // Possible uninitialized - } - format::get_writer() << before << after << suffix; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - - auto msd = new ExprMakeStruct(); - msd->makeType = (yyvsp[-2].pTypeDecl); - msd->block = (yyvsp[-1].pExpression); - msd->at = tokAt(scanner,(yylsp[-3])); - (yyval.pExpression) = msd; + { + // // std::cout << "case2" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-3]))))) { + auto type = format::type_to_string((yyvsp[-2].pTypeDecl), tokAt(scanner,(yylsp[-2]))); + das_hash_set always_init = { + // Is there a method to describe all this types? + "structisPointer()) { + format::get_writer() << "default<" << type.value() << ">"; + suffix.clear(); + } else if (any_of(always_init.begin(), always_init.end(), + [&type](auto t){ return type.value_or("").find(t) == 0; })) { + format::get_writer() << type.value_or("") << "("; + } else { + format::get_writer() << type.value_or("") << "("; // Possible uninitialized + } + format::get_writer() << before << after << suffix; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + + auto msd = new ExprMakeStruct(); + msd->makeType = (yyvsp[-2].pTypeDecl); + msd->block = (yyvsp[-1].pExpression); + msd->at = tokAt(scanner,(yylsp[-3])); + (yyval.pExpression) = msd; } break; case 900: /* make_struct_decl: "[[" type_declaration_no_options '(' ')' optional_block optional_trailing_delim_sqr_sqr */ - { - // std::cout << "case3" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-5]))))) { - const auto type_name = format::type_to_string((yyvsp[-4].pTypeDecl), tokAt(scanner,(yylsp[-4]))); - auto maybe_init = (format::can_default_init(type_name.value_or(""))) ? "" : ""; // Possible uninitialized - format::get_writer() << type_name.value_or("") << "(" - << format::substring_between(tokAt(scanner,(yylsp[-5])), tokAt(scanner, (yylsp[-4]))) - << format::substring_between(tokAt(scanner,(yylsp[-3])), tokAt(scanner, (yylsp[-2]))) - << format::substring_between(tokAt(scanner,(yylsp[-2])), tokAt(scanner, (yylsp[0]))) - << maybe_init << ")"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - auto msd = new ExprMakeStruct(); - msd->makeType = (yyvsp[-4].pTypeDecl); - msd->useInitializer = true; - msd->block = (yyvsp[-1].pExpression); - msd->at = tokAt(scanner,(yylsp[-5])); - (yyval.pExpression) = msd; + { + // std::cout << "case3" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-5]))))) { + const auto type_name = format::type_to_string((yyvsp[-4].pTypeDecl), tokAt(scanner,(yylsp[-4]))); + auto maybe_init = (format::can_default_init(type_name.value_or(""))) ? "" : ""; // Possible uninitialized + format::get_writer() << type_name.value_or("") << "(" + << format::substring_between(tokAt(scanner,(yylsp[-5])), tokAt(scanner, (yylsp[-4]))) + << format::substring_between(tokAt(scanner,(yylsp[-3])), tokAt(scanner, (yylsp[-2]))) + << format::substring_between(tokAt(scanner,(yylsp[-2])), tokAt(scanner, (yylsp[0]))) + << maybe_init << ")"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + auto msd = new ExprMakeStruct(); + msd->makeType = (yyvsp[-4].pTypeDecl); + msd->useInitializer = true; + msd->block = (yyvsp[-1].pExpression); + msd->at = tokAt(scanner,(yylsp[-5])); + (yyval.pExpression) = msd; } break; case 901: /* make_struct_decl: "[[" type_declaration_no_options '(' ')' make_struct_dim optional_block optional_trailing_delim_sqr_sqr */ - { - // std::cout << "case4" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { - auto type_name = format::type_to_string((yyvsp[-5].pTypeDecl), tokAt(scanner,(yylsp[-5]))).value_or(""); - const auto internal = format::handle_msd(tokAt(scanner, (yylsp[-3])), - static_cast((yyvsp[-2].pExpression)), - tokAt(scanner, (yylsp[0])), - type_name); - format::get_writer() << format::substring_between(tokAt(scanner, (yylsp[-6])), tokAt(scanner, (yylsp[-5]))) - << format::substring_between(tokAt(scanner, (yylsp[-4])), tokAt(scanner, (yylsp[-3]))) - << internal; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = (yyvsp[-5].pTypeDecl); - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->useInitializer = true; - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); - (yyvsp[-2].pExpression)->at = tokAt(scanner,(yylsp[-6])); - (yyval.pExpression) = (yyvsp[-2].pExpression); + { + // std::cout << "case4" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { + auto type_name = format::type_to_string((yyvsp[-5].pTypeDecl), tokAt(scanner,(yylsp[-5]))).value_or(""); + const auto internal = format::handle_msd(tokAt(scanner, (yylsp[-3])), + static_cast((yyvsp[-2].pExpression)), + tokAt(scanner, (yylsp[0])), + type_name); + format::get_writer() << format::substring_between(tokAt(scanner, (yylsp[-6])), tokAt(scanner, (yylsp[-5]))) + << format::substring_between(tokAt(scanner, (yylsp[-4])), tokAt(scanner, (yylsp[-3]))) + << internal; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = (yyvsp[-5].pTypeDecl); + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->useInitializer = true; + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); + (yyvsp[-2].pExpression)->at = tokAt(scanner,(yylsp[-6])); + (yyval.pExpression) = (yyvsp[-2].pExpression); } break; case 902: /* make_struct_decl: "[{" type_declaration_no_options make_struct_dim optional_block optional_trailing_delim_cur_sqr */ - { - // std::cout << "case6" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-4]))))) { - auto type_name = format::type_to_string((yyvsp[-3].pTypeDecl), tokAt(scanner,(yylsp[-3]))).value_or(""); - format::get_writer() << "[" << format::substring_between(tokAt(scanner, (yylsp[-4])), tokAt(scanner, (yylsp[-3]))) - << format::handle_msd(tokAt(scanner, (yylsp[-3])), - static_cast((yyvsp[-2].pExpression)), - tokAt(scanner, (yylsp[0])), - type_name) - << "]"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = (yyvsp[-3].pTypeDecl); - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); - (yyvsp[-2].pExpression)->at = tokAt(scanner,(yylsp[-4])); - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-4])),"to_array_move"); - tam->arguments.push_back((yyvsp[-2].pExpression)); - (yyval.pExpression) = tam; + { + // std::cout << "case6" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-4]))))) { + auto type_name = format::type_to_string((yyvsp[-3].pTypeDecl), tokAt(scanner,(yylsp[-3]))).value_or(""); + format::get_writer() << "[" << format::substring_between(tokAt(scanner, (yylsp[-4])), tokAt(scanner, (yylsp[-3]))) + << format::handle_msd(tokAt(scanner, (yylsp[-3])), + static_cast((yyvsp[-2].pExpression)), + tokAt(scanner, (yylsp[0])), + type_name) + << "]"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = (yyvsp[-3].pTypeDecl); + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); + (yyvsp[-2].pExpression)->at = tokAt(scanner,(yylsp[-4])); + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-4])),"to_array_move"); + tam->arguments.push_back((yyvsp[-2].pExpression)); + (yyval.pExpression) = tam; } break; case 903: /* make_struct_decl: "[{" type_declaration_no_options '(' ')' make_struct_dim optional_block optional_trailing_delim_cur_sqr */ - { - // std::cout << "case7" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { - auto type_name = format::type_to_string((yyvsp[-5].pTypeDecl), tokAt(scanner,(yylsp[-5]))).value_or(""); - format::get_writer() << "[" << format::substring_between(tokAt(scanner, (yylsp[-6])), tokAt(scanner, (yylsp[-5]))) - << format::handle_msd(tokAt(scanner, (yylsp[-3])), - static_cast((yyvsp[-2].pExpression)), - tokAt(scanner, (yylsp[0])), - type_name) - << "]"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = (yyvsp[-5].pTypeDecl); - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->useInitializer = true; - ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); - (yyvsp[-2].pExpression)->at = tokAt(scanner,(yylsp[-6])); - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),"to_array_move"); - tam->arguments.push_back((yyvsp[-2].pExpression)); - (yyval.pExpression) = tam; + { + // std::cout << "case7" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { + auto type_name = format::type_to_string((yyvsp[-5].pTypeDecl), tokAt(scanner,(yylsp[-5]))).value_or(""); + format::get_writer() << "[" << format::substring_between(tokAt(scanner, (yylsp[-6])), tokAt(scanner, (yylsp[-5]))) + << format::handle_msd(tokAt(scanner, (yylsp[-3])), + static_cast((yyvsp[-2].pExpression)), + tokAt(scanner, (yylsp[0])), + type_name) + << "]"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->makeType = (yyvsp[-5].pTypeDecl); + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->useInitializer = true; + ((ExprMakeStruct *)(yyvsp[-2].pExpression))->block = (yyvsp[-1].pExpression); + (yyvsp[-2].pExpression)->at = tokAt(scanner,(yylsp[-6])); + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),"to_array_move"); + tam->arguments.push_back((yyvsp[-2].pExpression)); + (yyval.pExpression) = tam; } break; @@ -12106,13 +12108,13 @@ YYLTYPE yylloc = yyloc_default; break; case 906: /* make_struct_decl: "struct" '<' $@86 type_declaration_no_options '>' $@87 '(' use_initializer optional_make_struct_dim_decl ')' */ - { - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-6].pTypeDecl); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceStruct = true; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-6].pTypeDecl); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceStruct = true; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; @@ -12125,12 +12127,12 @@ YYLTYPE yylloc = yyloc_default; break; case 909: /* make_struct_decl: "class" '<' $@88 type_declaration_no_options '>' $@89 '(' use_initializer optional_make_struct_dim_decl ')' */ - { - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-6].pTypeDecl); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceClass = true; - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-6].pTypeDecl); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceClass = true; + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; @@ -12143,16 +12145,16 @@ YYLTYPE yylloc = yyloc_default; break; case 912: /* make_struct_decl: "variant" '<' $@90 variant_type_list '>' $@91 '(' use_initializer make_variant_dim ')' */ - { - auto mkt = new TypeDecl(Type::tVariant); - mkt->at = tokAt(scanner,(yylsp[-9])); - varDeclToTypeDecl(scanner, mkt, (yyvsp[-6].pVarDeclList), true); - deleteVariableDeclarationList((yyvsp[-6].pVarDeclList)); - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = mkt; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceVariant = true; - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + auto mkt = new TypeDecl(Type::tVariant); + mkt->at = tokAt(scanner,(yylsp[-9])); + varDeclToTypeDecl(scanner, mkt, (yyvsp[-6].pVarDeclList), true); + deleteVariableDeclarationList((yyvsp[-6].pVarDeclList)); + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = mkt; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceVariant = true; + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; @@ -12165,69 +12167,69 @@ YYLTYPE yylloc = yyloc_default; break; case 915: /* make_struct_decl: "default" '<' $@92 type_declaration_no_options '>' $@93 use_initializer */ - { - auto msd = new ExprMakeStruct(); - msd->at = tokAt(scanner,(yylsp[-6])); - msd->makeType = (yyvsp[-3].pTypeDecl); - msd->useInitializer = (yyvsp[0].b); - msd->alwaysUseInitializer = true; - (yyval.pExpression) = msd; + { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-6])); + msd->makeType = (yyvsp[-3].pTypeDecl); + msd->useInitializer = (yyvsp[0].b); + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; } break; case 916: /* make_tuple: expr */ - { - (yyvsp[0].pExpression)->at = tokAt(scanner,(yylsp[0])); - (yyval.pExpression) = (yyvsp[0].pExpression); + { + (yyvsp[0].pExpression)->at = tokAt(scanner,(yylsp[0])); + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 917: /* make_tuple: expr "=>" expr */ - { - ExprMakeTuple * mt = new ExprMakeTuple(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0]))); - mt->values.push_back((yyvsp[-2].pExpression)); - mt->values.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = mt; + { + ExprMakeTuple * mt = new ExprMakeTuple(tokRangeAt(scanner,(yylsp[-2]), (yylsp[0]))); + mt->values.push_back((yyvsp[-2].pExpression)); + mt->values.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = mt; } break; case 918: /* make_tuple: make_tuple ',' expr */ - { - (yyvsp[0].pExpression)->at = tokAt(scanner,(yylsp[0])); - ExprMakeTuple * mt; - if ( (yyvsp[-2].pExpression)->rtti_isMakeTuple() ) { - mt = static_cast((yyvsp[-2].pExpression)); - } else { - mt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); - mt->values.push_back((yyvsp[-2].pExpression)); - } - mt->values.push_back((yyvsp[0].pExpression)); - mt->at = format::concat(mt->at, tokAt(scanner, (yylsp[0]))); - (yyval.pExpression) = mt; + { + (yyvsp[0].pExpression)->at = tokAt(scanner,(yylsp[0])); + ExprMakeTuple * mt; + if ( (yyvsp[-2].pExpression)->rtti_isMakeTuple() ) { + mt = static_cast((yyvsp[-2].pExpression)); + } else { + mt = new ExprMakeTuple(tokAt(scanner,(yylsp[-2]))); + mt->values.push_back((yyvsp[-2].pExpression)); + } + mt->values.push_back((yyvsp[0].pExpression)); + mt->at = format::concat(mt->at, tokAt(scanner, (yylsp[0]))); + (yyval.pExpression) = mt; } break; case 919: /* make_map_tuple: expr "=>" expr */ - { - ExprMakeTuple * mt = new ExprMakeTuple(tokRangeAt(scanner,(yylsp[-2]),(yylsp[0]))); - mt->values.push_back((yyvsp[-2].pExpression)); - mt->values.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = mt; + { + ExprMakeTuple * mt = new ExprMakeTuple(tokRangeAt(scanner,(yylsp[-2]),(yylsp[0]))); + mt->values.push_back((yyvsp[-2].pExpression)); + mt->values.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = mt; } break; case 920: /* make_map_tuple: expr */ - { - (yyval.pExpression) = (yyvsp[0].pExpression); + { + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 921: /* make_tuple_call: "tuple" '(' expr_list optional_comma ')' */ - { - auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-4]))); - mkt->values = sequenceToList((yyvsp[-2].pExpression)); - mkt->makeType = new TypeDecl(Type::autoinfer); - (yyval.pExpression) = mkt; + { + auto mkt = new ExprMakeTuple(tokAt(scanner,(yylsp[-4]))); + mkt->values = sequenceToList((yyvsp[-2].pExpression)); + mkt->makeType = new TypeDecl(Type::autoinfer); + (yyval.pExpression) = mkt; } break; @@ -12240,112 +12242,112 @@ YYLTYPE yylloc = yyloc_default; break; case 924: /* make_tuple_call: "tuple" '<' $@94 tuple_type_list '>' $@95 '(' use_initializer optional_make_struct_dim_decl ')' */ - { - auto mkt = new TypeDecl(Type::tTuple); - mkt->at = tokAt(scanner,(yylsp[-9])); - varDeclToTypeDecl(scanner, mkt, (yyvsp[-6].pVarDeclList), true); - deleteVariableDeclarationList((yyvsp[-6].pVarDeclList)); - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = mkt; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceTuple = true; - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + auto mkt = new TypeDecl(Type::tTuple); + mkt->at = tokAt(scanner,(yylsp[-9])); + varDeclToTypeDecl(scanner, mkt, (yyvsp[-6].pVarDeclList), true); + deleteVariableDeclarationList((yyvsp[-6].pVarDeclList)); + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = mkt; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceTuple = true; + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; case 925: /* make_dim: make_tuple */ - { - auto mka = new ExprMakeArray(); - mka->values.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = mka; + { + auto mka = new ExprMakeArray(); + mka->values.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = mka; } break; case 926: /* make_dim: make_dim semicolon make_tuple */ - { - ((ExprMakeArray *) (yyvsp[-2].pExpression))->values.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = (yyvsp[-2].pExpression); + { + ((ExprMakeArray *) (yyvsp[-2].pExpression))->values.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = (yyvsp[-2].pExpression); } break; case 927: /* make_dim_decl: '[' optional_expr_list ']' */ - { - if ( (yyvsp[-1].pExpression) ) { - auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-2]))); - mka->values = sequenceToList((yyvsp[-1].pExpression)); - mka->makeType = new TypeDecl(Type::autoinfer); - mka->gen2 = true; - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),"to_array_move"); - tam->arguments.push_back(mka); - (yyval.pExpression) = tam; - } else { - auto mks = new ExprMakeStruct(); - mks->at = tokAt(scanner,(yylsp[-2])); - mks->makeType = new TypeDecl(Type::tArray); - mks->makeType->firstType = new TypeDecl(Type::autoinfer); - mks->useInitializer = true; - mks->alwaysUseInitializer = true; - (yyval.pExpression) = mks; - } - + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-2]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = new TypeDecl(Type::autoinfer); + mka->gen2 = true; + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),"to_array_move"); + tam->arguments.push_back(mka); + (yyval.pExpression) = tam; + } else { + auto mks = new ExprMakeStruct(); + mks->at = tokAt(scanner,(yylsp[-2])); + mks->makeType = new TypeDecl(Type::tArray); + mks->makeType->firstType = new TypeDecl(Type::autoinfer); + mks->useInitializer = true; + mks->alwaysUseInitializer = true; + (yyval.pExpression) = mks; + } + } break; case 928: /* make_dim_decl: "[[" type_declaration_no_options make_dim optional_trailing_semicolon_sqr_sqr */ - { - // std::cout << "case13" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-3]))))) { - auto type_name = format::type_to_string((yyvsp[-2].pTypeDecl), tokAt(scanner,(yylsp[-2]))); - auto internal = format::handle_mka(tokAt(scanner, (yylsp[-2])), - static_cast((yyvsp[-1].pExpression)), - tokAt(scanner, (yylsp[0]))); - const auto before = format::substring_between(tokAt(scanner, (yylsp[-3])), tokAt(scanner, (yylsp[-2]))); - if (static_cast((yyvsp[-1].pExpression))->values.size() == 1) { - // single element - if (type_name.value_or("").find('[') != size_t(-1)) { - format::get_writer() << "fixed_array(" << before << internal << ")"; - } else { - format::get_writer() << before << internal; - } - } else { - format::get_writer() << "fixed_array"; - if (!(yyvsp[-2].pTypeDecl)->isAuto()) { - format::get_writer() << "<" << type_name.value().substr(0, type_name.value().find('[')) << ">"; - } - format::get_writer() << "(" << before << internal << ")"; - } - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - ((ExprMakeArray *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-2].pTypeDecl); - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-3])); - (yyval.pExpression) = (yyvsp[-1].pExpression); + { + // std::cout << "case13" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-3]))))) { + auto type_name = format::type_to_string((yyvsp[-2].pTypeDecl), tokAt(scanner,(yylsp[-2]))); + auto internal = format::handle_mka(tokAt(scanner, (yylsp[-2])), + static_cast((yyvsp[-1].pExpression)), + tokAt(scanner, (yylsp[0]))); + const auto before = format::substring_between(tokAt(scanner, (yylsp[-3])), tokAt(scanner, (yylsp[-2]))); + if (static_cast((yyvsp[-1].pExpression))->values.size() == 1) { + // single element + if (type_name.value_or("").find('[') != size_t(-1)) { + format::get_writer() << "fixed_array(" << before << internal << ")"; + } else { + format::get_writer() << before << internal; + } + } else { + format::get_writer() << "fixed_array"; + if (!(yyvsp[-2].pTypeDecl)->isAuto()) { + format::get_writer() << "<" << type_name.value().substr(0, type_name.value().find('[')) << ">"; + } + format::get_writer() << "(" << before << internal << ")"; + } + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + ((ExprMakeArray *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-2].pTypeDecl); + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-3])); + (yyval.pExpression) = (yyvsp[-1].pExpression); } break; case 929: /* make_dim_decl: "[{" type_declaration_no_options make_dim optional_trailing_semicolon_cur_sqr */ - { - // std::cout << "case8" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-3]))))) { - string prefix = "["; - string suffix = "]"; - if (!(yyvsp[-2].pTypeDecl)->isAuto()) { - prefix = "array<" + format::get_substring(tokAt(scanner,(yylsp[-2]))) + ">("; - suffix = ")"; - } - format::get_writer() << prefix - << format::substring_between(tokAt(scanner, (yylsp[-3])), tokAt(scanner, (yylsp[-2]))) - << format::handle_mka(tokAt(scanner, (yylsp[-2])), - static_cast((yyvsp[-1].pExpression)), - tokAt(scanner, (yylsp[0]))) - << suffix; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - - ((ExprMakeArray *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-2].pTypeDecl); - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-3])); - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),"to_array_move"); - tam->arguments.push_back((yyvsp[-1].pExpression)); - (yyval.pExpression) = tam; + { + // std::cout << "case8" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-3]))))) { + string prefix = "["; + string suffix = "]"; + if (!(yyvsp[-2].pTypeDecl)->isAuto()) { + prefix = "array<" + format::get_substring(tokAt(scanner,(yylsp[-2]))) + ">("; + suffix = ")"; + } + format::get_writer() << prefix + << format::substring_between(tokAt(scanner, (yylsp[-3])), tokAt(scanner, (yylsp[-2]))) + << format::handle_mka(tokAt(scanner, (yylsp[-2])), + static_cast((yyvsp[-1].pExpression)), + tokAt(scanner, (yylsp[0]))) + << suffix; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + + ((ExprMakeArray *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-2].pTypeDecl); + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-3])); + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),"to_array_move"); + tam->arguments.push_back((yyvsp[-1].pExpression)); + (yyval.pExpression) = tam; } break; @@ -12358,15 +12360,15 @@ YYLTYPE yylloc = yyloc_default; break; case 932: /* make_dim_decl: "array" "struct" '<' $@96 type_declaration_no_options '>' $@97 '(' use_initializer optional_make_struct_dim_decl ')' */ - { - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-10])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-6].pTypeDecl); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceStruct = true; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-10])),"to_array_move"); - tam->arguments.push_back((yyvsp[-1].pExpression)); - (yyval.pExpression) = tam; + { + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-10])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = (yyvsp[-6].pTypeDecl); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceStruct = true; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-10])),"to_array_move"); + tam->arguments.push_back((yyvsp[-1].pExpression)); + (yyval.pExpression) = tam; } break; @@ -12379,19 +12381,19 @@ YYLTYPE yylloc = yyloc_default; break; case 935: /* make_dim_decl: "array" "tuple" '<' $@98 tuple_type_list '>' $@99 '(' use_initializer optional_make_struct_dim_decl ')' */ - { - auto mkt = new TypeDecl(Type::tTuple); - mkt->at = tokAt(scanner,(yylsp[-10])); - varDeclToTypeDecl(scanner, mkt, (yyvsp[-6].pVarDeclList), true); - deleteVariableDeclarationList((yyvsp[-6].pVarDeclList)); - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-10])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = mkt; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceTuple = true; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-10])),"to_array_move"); - tam->arguments.push_back((yyvsp[-1].pExpression)); - (yyval.pExpression) = tam; + { + auto mkt = new TypeDecl(Type::tTuple); + mkt->at = tokAt(scanner,(yylsp[-10])); + varDeclToTypeDecl(scanner, mkt, (yyvsp[-6].pVarDeclList), true); + deleteVariableDeclarationList((yyvsp[-6].pVarDeclList)); + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-10])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = mkt; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = (yyvsp[-2].b); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceTuple = true; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-10])),"to_array_move"); + tam->arguments.push_back((yyvsp[-1].pExpression)); + (yyval.pExpression) = tam; } break; @@ -12404,31 +12406,31 @@ YYLTYPE yylloc = yyloc_default; break; case 938: /* make_dim_decl: "array" "variant" '<' $@100 variant_type_list '>' $@101 '(' make_variant_dim ')' */ - { - auto mkt = new TypeDecl(Type::tVariant); - mkt->at = tokAt(scanner,(yylsp[-9])); - varDeclToTypeDecl(scanner, mkt, (yyvsp[-5].pVarDeclList), true); - deleteVariableDeclarationList((yyvsp[-5].pVarDeclList)); - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = mkt; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = true; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceVariant = true; - ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-9])),"to_array_move"); - tam->arguments.push_back((yyvsp[-1].pExpression)); - (yyval.pExpression) = tam; + { + auto mkt = new TypeDecl(Type::tVariant); + mkt->at = tokAt(scanner,(yylsp[-9])); + varDeclToTypeDecl(scanner, mkt, (yyvsp[-5].pVarDeclList), true); + deleteVariableDeclarationList((yyvsp[-5].pVarDeclList)); + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-9])); + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->makeType = mkt; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->useInitializer = true; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->forceVariant = true; + ((ExprMakeStruct *)(yyvsp[-1].pExpression))->alwaysUseInitializer = true; + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-9])),"to_array_move"); + tam->arguments.push_back((yyvsp[-1].pExpression)); + (yyval.pExpression) = tam; } break; case 939: /* make_dim_decl: "array" '(' expr_list optional_comma ')' */ - { - auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-4]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); - mka->makeType = new TypeDecl(Type::autoinfer); - mka->gen2 = true; - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-4])),"to_array_move"); - tam->arguments.push_back(mka); - (yyval.pExpression) = tam; + { + auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-4]))); + mka->values = sequenceToList((yyvsp[-2].pExpression)); + mka->makeType = new TypeDecl(Type::autoinfer); + mka->gen2 = true; + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-4])),"to_array_move"); + tam->arguments.push_back(mka); + (yyval.pExpression) = tam; } break; @@ -12441,35 +12443,35 @@ YYLTYPE yylloc = yyloc_default; break; case 942: /* make_dim_decl: "array" '<' $@102 type_declaration_no_options '>' $@103 '(' optional_expr_list ')' */ - { - if ( (yyvsp[-1].pExpression) ) { - auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-8]))); - mka->values = sequenceToList((yyvsp[-1].pExpression)); - mka->makeType = (yyvsp[-5].pTypeDecl); - mka->gen2 = true; - auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-8])),"to_array_move"); - tam->arguments.push_back(mka); - (yyval.pExpression) = tam; - } else { - auto msd = new ExprMakeStruct(); - msd->at = tokAt(scanner,(yylsp[-8])); - msd->makeType = new TypeDecl(Type::tArray); - msd->makeType->firstType = (yyvsp[-5].pTypeDecl); - msd->at = tokAt(scanner,(yylsp[-5])); - msd->useInitializer = true; - msd->alwaysUseInitializer = true; - (yyval.pExpression) = msd; - } + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-8]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = (yyvsp[-5].pTypeDecl); + mka->gen2 = true; + auto tam = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-8])),"to_array_move"); + tam->arguments.push_back(mka); + (yyval.pExpression) = tam; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-8])); + msd->makeType = new TypeDecl(Type::tArray); + msd->makeType->firstType = (yyvsp[-5].pTypeDecl); + msd->at = tokAt(scanner,(yylsp[-5])); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; + } } break; case 943: /* make_dim_decl: "fixed_array" '(' expr_list optional_comma ')' */ - { - auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-4]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); - mka->makeType = new TypeDecl(Type::autoinfer); - mka->gen2 = true; - (yyval.pExpression) = mka; + { + auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-4]))); + mka->values = sequenceToList((yyvsp[-2].pExpression)); + mka->makeType = new TypeDecl(Type::autoinfer); + mka->gen2 = true; + (yyval.pExpression) = mka; } break; @@ -12482,143 +12484,143 @@ YYLTYPE yylloc = yyloc_default; break; case 946: /* make_dim_decl: "fixed_array" '<' $@104 type_declaration_no_options '>' $@105 '(' expr_list optional_comma ')' */ - { - auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-9]))); - mka->values = sequenceToList((yyvsp[-2].pExpression)); - mka->makeType = (yyvsp[-6].pTypeDecl); - mka->gen2 = true; - (yyval.pExpression) = mka; + { + auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-9]))); + mka->values = sequenceToList((yyvsp[-2].pExpression)); + mka->makeType = (yyvsp[-6].pTypeDecl); + mka->gen2 = true; + (yyval.pExpression) = mka; } break; case 947: /* make_table: make_map_tuple */ - { - auto mka = new ExprMakeArray(); - mka->values.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = mka; + { + auto mka = new ExprMakeArray(); + mka->values.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = mka; } break; case 948: /* make_table: make_table semicolon make_map_tuple */ - { - ((ExprMakeArray *) (yyvsp[-2].pExpression))->values.push_back((yyvsp[0].pExpression)); - (yyval.pExpression) = (yyvsp[-2].pExpression); + { + ((ExprMakeArray *) (yyvsp[-2].pExpression))->values.push_back((yyvsp[0].pExpression)); + (yyval.pExpression) = (yyvsp[-2].pExpression); } break; case 949: /* expr_map_tuple_list: make_map_tuple */ - { - (yyval.pExpression) = (yyvsp[0].pExpression); + { + (yyval.pExpression) = (yyvsp[0].pExpression); } break; case 950: /* expr_map_tuple_list: expr_map_tuple_list ',' make_map_tuple */ - { - (yyval.pExpression) = new ExprSequence(tokAt(scanner,(yylsp[-2])),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); + { + (yyval.pExpression) = new ExprSequence(tokAt(scanner,(yylsp[-2])),(yyvsp[-2].pExpression),(yyvsp[0].pExpression)); } break; case 951: /* make_table_decl: open_block optional_expr_map_tuple_list close_block */ - { - if ( (yyvsp[-1].pExpression) ) { - auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-2]))); - mka->values = sequenceToList((yyvsp[-1].pExpression)); - mka->makeType = new TypeDecl(Type::autoinfer); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),"to_table_move"); - ttm->arguments.push_back(mka); - (yyval.pExpression) = ttm; - } else { - auto mks = new ExprMakeStruct(); - mks->at = tokAt(scanner,(yylsp[-2])); - mks->makeType = new TypeDecl(Type::tTable); - mks->makeType->firstType = new TypeDecl(Type::autoinfer); - mks->makeType->secondType = new TypeDecl(Type::autoinfer); - mks->useInitializer = true; - mks->alwaysUseInitializer = true; - (yyval.pExpression) = mks; - } - + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-2]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = new TypeDecl(Type::autoinfer); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),"to_table_move"); + ttm->arguments.push_back(mka); + (yyval.pExpression) = ttm; + } else { + auto mks = new ExprMakeStruct(); + mks->at = tokAt(scanner,(yylsp[-2])); + mks->makeType = new TypeDecl(Type::tTable); + mks->makeType->firstType = new TypeDecl(Type::autoinfer); + mks->makeType->secondType = new TypeDecl(Type::autoinfer); + mks->useInitializer = true; + mks->alwaysUseInitializer = true; + (yyval.pExpression) = mks; + } + } break; case 952: /* make_table_decl: "{{" make_table optional_trailing_semicolon_cur_cur */ - { - // std::cout << "case10" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-2]))))) { - format::get_writer() << "{" - << format::substring_between(tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1]))) - << format::convert_to_string(((ExprMakeArray *)(yyvsp[-1].pExpression))->values, ",", ";") - << format::substring_between(tokAt(scanner, (yylsp[-1])), tokAt(scanner, (yylsp[0]))) - << "}"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - - auto mkt = new TypeDecl(Type::autoinfer); - mkt->dim.push_back(TypeDecl::dimAuto); - ((ExprMakeArray *)(yyvsp[-1].pExpression))->makeType = mkt; - (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-2])); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),"to_table_move"); - ttm->arguments.push_back((yyvsp[-1].pExpression)); - (yyval.pExpression) = ttm; + { + // std::cout << "case10" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-2]))))) { + format::get_writer() << "{" + << format::substring_between(tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1]))) + << format::convert_to_string(((ExprMakeArray *)(yyvsp[-1].pExpression))->values, ",", ";") + << format::substring_between(tokAt(scanner, (yylsp[-1])), tokAt(scanner, (yylsp[0]))) + << "}"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + + auto mkt = new TypeDecl(Type::autoinfer); + mkt->dim.push_back(TypeDecl::dimAuto); + ((ExprMakeArray *)(yyvsp[-1].pExpression))->makeType = mkt; + (yyvsp[-1].pExpression)->at = tokAt(scanner,(yylsp[-2])); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-2])),"to_table_move"); + ttm->arguments.push_back((yyvsp[-1].pExpression)); + (yyval.pExpression) = ttm; } break; case 953: /* make_table_decl: "table" '(' optional_expr_map_tuple_list ')' */ - { - auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-3]))); - mka->values = sequenceToList((yyvsp[-1].pExpression)); - mka->makeType = new TypeDecl(Type::autoinfer); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),"to_table_move"); - ttm->arguments.push_back(mka); - (yyval.pExpression) = ttm; + { + auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-3]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = new TypeDecl(Type::autoinfer); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-3])),"to_table_move"); + ttm->arguments.push_back(mka); + (yyval.pExpression) = ttm; } break; case 954: /* make_table_decl: "table" '<' type_declaration_no_options '>' '(' optional_expr_map_tuple_list ')' */ - { - if ( (yyvsp[-1].pExpression) ) { - auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-6]))); - mka->values = sequenceToList((yyvsp[-1].pExpression)); - mka->makeType = (yyvsp[-4].pTypeDecl); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),"to_table_move"); - ttm->arguments.push_back(mka); - (yyval.pExpression) = ttm; - } else { - auto msd = new ExprMakeStruct(); - msd->at = tokAt(scanner,(yylsp[-6])); - msd->makeType = new TypeDecl(Type::tTable); - msd->makeType->firstType = (yyvsp[-4].pTypeDecl); - msd->makeType->secondType = new TypeDecl(Type::tVoid); - msd->at = tokAt(scanner,(yylsp[-6])); - msd->useInitializer = true; - msd->alwaysUseInitializer = true; - (yyval.pExpression) = msd; - } + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-6]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = (yyvsp[-4].pTypeDecl); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-6])),"to_table_move"); + ttm->arguments.push_back(mka); + (yyval.pExpression) = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-6])); + msd->makeType = new TypeDecl(Type::tTable); + msd->makeType->firstType = (yyvsp[-4].pTypeDecl); + msd->makeType->secondType = new TypeDecl(Type::tVoid); + msd->at = tokAt(scanner,(yylsp[-6])); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; + } } break; case 955: /* make_table_decl: "table" '<' type_declaration_no_options c_or_s type_declaration_no_options '>' '(' optional_expr_map_tuple_list ')' */ - { - if ( (yyvsp[-1].pExpression) ) { - auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-8]))); - mka->values = sequenceToList((yyvsp[-1].pExpression)); - mka->makeType = new TypeDecl(Type::tTuple); - mka->makeType->argTypes.push_back((yyvsp[-6].pTypeDecl)); - mka->makeType->argTypes.push_back((yyvsp[-4].pTypeDecl)); - auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-8])),"to_table_move"); - ttm->arguments.push_back(mka); - (yyval.pExpression) = ttm; - } else { - auto msd = new ExprMakeStruct(); - msd->at = tokAt(scanner,(yylsp[-8])); - msd->makeType = new TypeDecl(Type::tTable); - msd->makeType->firstType = (yyvsp[-6].pTypeDecl); - msd->makeType->secondType = (yyvsp[-4].pTypeDecl); - msd->at = tokAt(scanner,(yylsp[-8])); - msd->useInitializer = true; - msd->alwaysUseInitializer = true; - (yyval.pExpression) = msd; - } + { + if ( (yyvsp[-1].pExpression) ) { + auto mka = new ExprMakeArray(tokAt(scanner,(yylsp[-8]))); + mka->values = sequenceToList((yyvsp[-1].pExpression)); + mka->makeType = new TypeDecl(Type::tTuple); + mka->makeType->argTypes.push_back((yyvsp[-6].pTypeDecl)); + mka->makeType->argTypes.push_back((yyvsp[-4].pTypeDecl)); + auto ttm = yyextra->g_Program->makeCall(tokAt(scanner,(yylsp[-8])),"to_table_move"); + ttm->arguments.push_back(mka); + (yyval.pExpression) = ttm; + } else { + auto msd = new ExprMakeStruct(); + msd->at = tokAt(scanner,(yylsp[-8])); + msd->makeType = new TypeDecl(Type::tTable); + msd->makeType->firstType = (yyvsp[-6].pTypeDecl); + msd->makeType->secondType = (yyvsp[-4].pTypeDecl); + msd->at = tokAt(scanner,(yylsp[-8])); + msd->useInitializer = true; + msd->alwaysUseInitializer = true; + (yyval.pExpression) = msd; + } } break; @@ -12639,97 +12641,97 @@ YYLTYPE yylloc = yyloc_default; break; case 960: /* array_comprehension: '[' "for" variable_name_with_pos_list "in" expr_list "end of expression" expr2 array_comprehension_where ']' */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { - format::get_writer() << "(" << format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-6]))), - format::Pos::from_last(tokAt(scanner,(yylsp[-4])))) << ")"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-4])))); - } - - (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,false); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { + format::get_writer() << "(" << format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-6]))), + format::Pos::from_last(tokAt(scanner,(yylsp[-4])))) << ")"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-4])))); + } + + (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,false); } break; case 961: /* array_comprehension: '[' "for" '(' variable_name_with_pos_list "in" expr_list ')' "end of expression" expr2 array_comprehension_where ']' */ - { - (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-9])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,false); + { + (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-9])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,false); } break; case 962: /* array_comprehension: '[' "iterator" "for" '(' variable_name_with_pos_list "in" expr_list ')' "end of expression" expr2 array_comprehension_where ']' */ - { - (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-9])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),true,false); + { + (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-9])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),true,false); } break; case 963: /* array_comprehension: "begin of code block" "for" '(' variable_name_with_pos_list "in" expr_list ')' "end of expression" make_map_tuple array_comprehension_where "end of code block" */ - { - (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-9])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,true); + { + (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-9])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,true); } break; case 964: /* array_comprehension: '[' "iterator" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr2 array_comprehension_where ']' */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { - format::get_writer() << "(" << format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-6]))), - format::Pos::from_last(tokAt(scanner,(yylsp[-4])))) << ")"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-4])))); - } - (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),true,false); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { + format::get_writer() << "(" << format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-6]))), + format::Pos::from_last(tokAt(scanner,(yylsp[-4])))) << ")"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-4])))); + } + (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),true,false); } break; case 965: /* array_comprehension: "[[" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr2 array_comprehension_where ']' ']' */ - { - // std::cout << "case5" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-9]))))) { - auto internal = format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-8]))), format::Pos::from_last(tokAt(scanner,(yylsp[-2])))); - format::get_writer() << "[iterator " << internal << "]"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-8])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])),true,false); + { + // std::cout << "case5" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-9]))))) { + auto internal = format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-8]))), format::Pos::from_last(tokAt(scanner,(yylsp[-2])))); + format::get_writer() << "[iterator " << internal << "]"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-8])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])),true,false); } break; case 966: /* array_comprehension: "[{" "for" variable_name_with_pos_list "in" expr_list "end of expression" expr2 array_comprehension_where "end of code block" ']' */ - { - // std::cout << "case9" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-9]))))) { - auto internal = format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-8]))), format::Pos::from_last(tokAt(scanner,(yylsp[-2])))); - format::get_writer() << "[" << format::substring_between(tokAt(scanner, (yylsp[-9])), tokAt(scanner, (yylsp[-8]))) - << internal - << format::substring_between(tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1]))) << "]"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - - (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-8])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])),false,false); + { + // std::cout << "case9" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-9]))))) { + auto internal = format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-8]))), format::Pos::from_last(tokAt(scanner,(yylsp[-2])))); + format::get_writer() << "[" << format::substring_between(tokAt(scanner, (yylsp[-9])), tokAt(scanner, (yylsp[-8]))) + << internal + << format::substring_between(tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1]))) << "]"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + + (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-8])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])),false,false); } break; case 967: /* array_comprehension: open_block "for" variable_name_with_pos_list "in" expr_list "end of expression" make_map_tuple array_comprehension_where close_block */ - { - if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { - format::get_writer() << "(" << format::substring_between(tokAt(scanner, (yylsp[-8])), tokAt(scanner, (yylsp[-7]))) - << format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-6]))), - format::Pos::from_last(tokAt(scanner,(yylsp[-4])))) - << format::substring_between(tokAt(scanner, (yylsp[-1])), tokAt(scanner, (yylsp[0]))) << ")"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-4])))); - } - (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,true); + { + if (format::is_replace_braces() && format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-6]))))) { + format::get_writer() << "(" << format::substring_between(tokAt(scanner, (yylsp[-8])), tokAt(scanner, (yylsp[-7]))) + << format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-6]))), + format::Pos::from_last(tokAt(scanner,(yylsp[-4])))) + << format::substring_between(tokAt(scanner, (yylsp[-1])), tokAt(scanner, (yylsp[0]))) << ")"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[-4])))); + } + (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-7])),(yyvsp[-6].pNameWithPosList),(yyvsp[-4].pExpression),(yyvsp[-2].pExpression),(yyvsp[-1].pExpression),tokRangeAt(scanner,(yylsp[-2]),(yylsp[0])),false,true); } break; case 968: /* array_comprehension: "{{" "for" variable_name_with_pos_list "in" expr_list "end of expression" make_map_tuple array_comprehension_where close_block close_block */ - { - // std::cout << "case12" << std::endl; - if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-9]))))) { - auto internal = format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-8]))), format::Pos::from_last(tokAt(scanner,(yylsp[-2])))); - format::get_writer() << "[" << format::substring_between(tokAt(scanner, (yylsp[-9])), tokAt(scanner, (yylsp[-8]))) - << internal - << format::substring_between(tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1]))) << "]"; - format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); - } - (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-8])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])),true,true); + { + // std::cout << "case12" << std::endl; + if (format::prepare_rule(format::Pos::from(tokAt(scanner,(yylsp[-9]))))) { + auto internal = format::get_substring(format::Pos::from(tokAt(scanner,(yylsp[-8]))), format::Pos::from_last(tokAt(scanner,(yylsp[-2])))); + format::get_writer() << "[" << format::substring_between(tokAt(scanner, (yylsp[-9])), tokAt(scanner, (yylsp[-8]))) + << internal + << format::substring_between(tokAt(scanner, (yylsp[-2])), tokAt(scanner, (yylsp[-1]))) << "]"; + format::finish_rule(format::Pos::from_last(tokAt(scanner,(yylsp[0])))); + } + (yyval.pExpression) = ast_arrayComprehension(scanner,tokAt(scanner,(yylsp[-8])),(yyvsp[-7].pNameWithPosList),(yyvsp[-5].pExpression),(yyvsp[-3].pExpression),(yyvsp[-2].pExpression),tokRangeAt(scanner,(yylsp[-3]),(yylsp[0])),true,true); } break; @@ -12962,4 +12964,4 @@ YYLTYPE yylloc = yyloc_default; return yyresult; } - + diff --git a/utils/dasFormatter/ds_parser.ypp b/utils/dasFormatter/ds_parser.ypp index 79ad3b63fa..573727d8ad 100644 --- a/utils/dasFormatter/ds_parser.ypp +++ b/utils/dasFormatter/ds_parser.ypp @@ -2349,10 +2349,12 @@ expr2 if ( $subexpr->rtti_isSequence() ) { auto mkt = new ExprMakeTuple(tokAt(scanner,@subexpr)); mkt->values = sequenceToList($subexpr); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); $$ = mkt; } else if ( $comma ) { auto mkt = new ExprMakeTuple(tokAt(scanner,@subexpr)); mkt->values.push_back($subexpr); + mkt->shorthandRecordNames = ast_tupleCollectShorthandNames(mkt->values); $$ = mkt; } else { $subexpr->at = tokAt(scanner, @subexpr); From 7118ce405ab97b74a9129bb5107f7c55af5ae7cd Mon Sep 17 00:00:00 2001 From: Churkin Aleksey Date: Thu, 14 May 2026 17:58:15 +0300 Subject: [PATCH 2/3] compiler: tuples unnamed -> named promotion in return types Support unnamed -> named promotion for return tuples as well. --- doc/source/reference/language/tuples.rst | 4 +++ .../tutorials/11_tuples_and_variants.rst | 7 +++++ src/ast/ast_infer_type.cpp | 14 +++++++++- ...failed_tuple_shorthand_return_mismatch.das | 10 +++++++ tests/language/tuple.das | 28 +++++++++++++++++++ tutorials/language/11_tuples_and_variants.das | 12 ++++++++ 6 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 tests/language/failed_tuple_shorthand_return_mismatch.das diff --git a/doc/source/reference/language/tuples.rst b/doc/source/reference/language/tuples.rst index 9a1317f883..e3449247e4 100644 --- a/doc/source/reference/language/tuples.rst +++ b/doc/source/reference/language/tuples.rst @@ -58,6 +58,10 @@ and the variable names match the field names in order: var arr : array> arr |> push((eid, distSq)) // ok, promoted + def make_hit(eid : int; distSq : float) : tuple { + return (eid, distSq) // ok, promoted + } + Promotion is a fallback: if a matching overload already exists for the unnamed tuple type, that overload wins and no promotion happens. If you want the named overload, use the explicit named-field literal: diff --git a/doc/source/reference/tutorials/11_tuples_and_variants.rst b/doc/source/reference/tutorials/11_tuples_and_variants.rst index bac396a2ad..f2ea08a847 100644 --- a/doc/source/reference/tutorials/11_tuples_and_variants.rst +++ b/doc/source/reference/tutorials/11_tuples_and_variants.rst @@ -73,6 +73,13 @@ field names:: var hits : array> hits |> push((eid, distSq)) // ok, promoted +It also fires in return position when the function's declared result is a +named tuple:: + + def make_hit(eid : int; distSq : float) : tuple { + return (eid, distSq) // ok, promoted + } + Promotion is fallback-only: if an unnamed-tuple overload already matches, it wins. Use the explicit ``(name = value)`` literal to force the named overload:: diff --git a/src/ast/ast_infer_type.cpp b/src/ast/ast_infer_type.cpp index 4b32cd29d0..b74905e37a 100644 --- a/src/ast/ast_infer_type.cpp +++ b/src/ast/ast_infer_type.cpp @@ -4209,8 +4209,20 @@ namespace das { if (scopes[i]->isClosure) break; } - if (expr->subexpr) + if (expr->subexpr) { markNoDiscard(expr->subexpr); + // unnamed -> named tuple shorthand at return position: + // seed the makeTuple's recordType from the enclosing return type + // (function->result, or innermost block's declared returnType) so + // the regular ExprMakeTuple infer path can promote the literal. + if (blocks.empty()) { + if (func) seedTupleShorthandFromTargetType(func->result, expr->subexpr); + } else { + auto block = blocks.back(); + if (block && block->returnType) + seedTupleShorthandFromTargetType(block->returnType, expr->subexpr); + } + } } ExpressionPtr InferTypes::visit(ExprReturn *expr) { if (blocks.size()) { diff --git a/tests/language/failed_tuple_shorthand_return_mismatch.das b/tests/language/failed_tuple_shorthand_return_mismatch.das new file mode 100644 index 0000000000..1f2e740eb9 --- /dev/null +++ b/tests/language/failed_tuple_shorthand_return_mismatch.das @@ -0,0 +1,10 @@ +options gen2 +expect 30343 // incompatible return type: shorthand var names don't match declared named-tuple result + +require dastest/testing_boost public + +def fail_return_name_mismatch() : tuple { + let foo = 1 + let bar = 1.1 + return (foo, bar) +} diff --git a/tests/language/tuple.das b/tests/language/tuple.das index 111a7f88ff..e631cff620 100644 --- a/tests/language/tuple.das +++ b/tests/language/tuple.das @@ -20,6 +20,18 @@ def overload_pick(x : tuple) { return 2 } +// return-position shorthand: positional bare-var tuple promotes to the +// function's declared named-tuple result type +def make_hit_return(eid : int; distSq : float) : tuple { + return (eid, distSq) +} + +def make_hit_locals() : tuple { + let eid = 17 + let distSq = 4.25 + return (eid, distSq) +} + [test] def test_tuple(t : T?) { t |> run("basic creation and named fields") @(t : T?) { @@ -123,6 +135,22 @@ def test_tuple(t : T?) { t |> equal(arr[0]._0, 1) t |> equal(arr[0]._1, 2) } + t |> run("shorthand named via return from named-tuple-typed fn") @(t : T?) { + let r = make_hit_return(7, 2.5) + t |> equal(r.eid, 7) + t |> equal(r.distSq, 2.5) + } + t |> run("shorthand named via return using local bare vars") @(t : T?) { + let r = make_hit_locals() + t |> equal(r.eid, 17) + t |> equal(r.distSq, 4.25) + } + t |> run("return-promoted tuple pushes into named-tuple array") @(t : T?) { + var arr : array> + arr |> push(make_hit_return(3, 1.5)) + t |> equal(arr[0].eid, 3) + t |> equal(arr[0].distSq, 1.5) + } t |> run("fixed array of tuples") @(t : T?) { let mkta = fixed_array>((1, 2.0), (3, 4.0)) t |> equal(mkta[0]._0, 1) diff --git a/tutorials/language/11_tuples_and_variants.das b/tutorials/language/11_tuples_and_variants.das index 421ea36e65..8e64ee96b9 100644 --- a/tutorials/language/11_tuples_and_variants.das +++ b/tutorials/language/11_tuples_and_variants.das @@ -89,6 +89,11 @@ def main { // Promotion is fallback-only: if an unnamed overload also matches, it wins. // Use the explicit (name = value) literal to force the named overload. + // Promotion also fires in return position when the function's declared + // result is a named tuple — see make_hit() defined below. + let made = make_hit(8, 9.5) + print("made.eid = {made.eid}, made.distSq = {made.distSq}\n") + // --- Tuple with tuple() constructor --- let triple = tuple(1, 2.0, "three") print("triple = ({triple._0}, {triple._1}, {triple._2})\n") @@ -187,6 +192,12 @@ def divmod_tuple(a, b : int) : tuple { return (a / b, a % b) } +// Return-position shorthand: the bare-var positional literal promotes to the +// declared named-tuple result type when the names match in order. +def make_hit(eid : int; distSq : float) : tuple { + return (eid, distSq) +} + // output: // pair = (42, 3.14) // modified pair._0 = 100 @@ -195,6 +206,7 @@ def divmod_tuple(a, b : int) : tuple { // hit.eid = 7, hit.distSq = 2.5 // hits[0].eid = 7 // raw[0] = (1, 2) +// made.eid = 8, made.distSq = 9.5 // triple = (1, 2, three) // kv = (age, 25) // one => 1 From 36bbfc537b7ebd7976a5ccafab519ed83b383e36 Mon Sep 17 00:00:00 2001 From: Boris Batkin Date: Thu, 14 May 2026 08:26:48 -0700 Subject: [PATCH 3/3] infer/aot: allow C++-keyword function names via AOT name-mangling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `def float(...)`, `def int(...)`, `def double(...)`, `def do(...)` were rejected with error[30163] "invalid function name" — surprising next to `def string(...)` and `def float2(...)`, which compiled fine. The parser accepts all of them (function_name → das_type_name); a post-parse lint guard was the gate, rejecting any name in a hardcoded C++-keyword set. The asymmetry was just that set: `float` / `int` / `double` are C++ keywords, but `float2` / `string` / `int2` aren't. Drop the function-name guard and have the AOT emitter mangle keyword names the same way it already mangles operator overloads. - daslib/aot_cpp.das: aotSuffixNameEx now seeds prefix = is_cpp_keyword, so `def float` AOTs to `_Funcfloat_` (valid C++) instead of literal `float`. - src/ast/ast_lint.cpp: remove isValidFunctionName + its callsite. The other 5 isCppKeyword guards (module/enum/enum-value/struct/field) stay — those embed 1:1 into C++ and need the guard. - tests/language/failed_reserved_names.das: drop the `def do` case and 30163 from the expect line. - tests/aot/test_cpp_keyword_names.das: positive test exercising `def float`/`def int`/`def double`/`def do` via interpreter, AOT, and JIT. Co-Authored-By: Claude Opus 4.7 (1M context) --- daslib/aot_cpp.das | 2 +- ...les-keyword-and-operator-function-names.md | 93 +++++++++++++++++++ ...d-prefix-expected-compile-failure-tests.md | 63 +++++++++++++ ...d-but-def-string-and-def-float2-allowed.md | 54 +++++++++++ src/ast/ast_lint.cpp | 7 -- tests/aot/test_cpp_keyword_names.das | 39 ++++++++ tests/language/failed_reserved_names.das | 8 +- 7 files changed, 252 insertions(+), 14 deletions(-) create mode 100644 mouse-data/docs/daslang-aot-cpp-emitter-mangles-keyword-and-operator-function-names.md create mode 100644 mouse-data/docs/dastest-failed-cant-invalid-prefix-expected-compile-failure-tests.md create mode 100644 mouse-data/docs/why-is-def-float-rejected-but-def-string-and-def-float2-allowed.md create mode 100644 tests/aot/test_cpp_keyword_names.das diff --git a/daslib/aot_cpp.das b/daslib/aot_cpp.das index 4f2480efb4..63935cb49f 100644 --- a/daslib/aot_cpp.das +++ b/daslib/aot_cpp.das @@ -221,7 +221,7 @@ def hex_char(var Ch : int) { } def aotSuffixNameEx(funcName : das_string; suffix : string) { - var prefix = false; + var prefix = is_cpp_keyword(string(funcName)); let name = build_string() $(var writer) { for (ch in string(funcName)) { diff --git a/mouse-data/docs/daslang-aot-cpp-emitter-mangles-keyword-and-operator-function-names.md b/mouse-data/docs/daslang-aot-cpp-emitter-mangles-keyword-and-operator-function-names.md new file mode 100644 index 0000000000..42f195ca92 --- /dev/null +++ b/mouse-data/docs/daslang-aot-cpp-emitter-mangles-keyword-and-operator-function-names.md @@ -0,0 +1,93 @@ +--- +slug: daslang-aot-cpp-emitter-mangles-keyword-and-operator-function-names +title: How does the daslang AOT C++ emitter mangle function names — for operator overloads and C++ keywords? +created: 2026-05-14 +last_verified: 2026-05-14 +links: [] +--- + +The AOT C++ emitter lives in `daslib/aot_cpp.das` (NOT the emptied `src/ast/ast_aot_cpp.cpp`). + +**The function-name mangler is `aotFuncName`** at `daslib/aot_cpp.das:928-935`: + +```daslang +def public aotFuncName(func : Function?) { + if (func.hash != uint64(0)) { + return "{aotSuffixNameEx(func.name,"_Func")}_{func.hash:x}"; + } else { + return "{aotSuffixNameEx(func.name,"_Func")}"; + } +} +``` + +All daslang→C++ call sites and def sites go through this helper (verified: `daslib/aot_cpp.das:1084` def site, `:2950/:2966/:3459/:3785` call sites). No bypass paths. + +**`aotSuffixNameEx`** (line 223-267) is where the rewriting happens: + +```daslang +def aotSuffixNameEx(funcName : das_string; suffix : string) { + var prefix = is_cpp_keyword(string(funcName)); // <-- added 2026-05-14 + let name = build_string() $(var writer) { + for (ch in string(funcName)) { + if (is_alnum(ch) || ch == '_') { + writer |> write_char(ch); + } else { + prefix = true; + var t_ch : string; + match (ch) { + if ('=') { t_ch = "Equ"; } + if ('+') { t_ch = "Add"; } + if ('-') { t_ch = "Sub"; } + if ('*') { t_ch = "Mul"; } + if ('/') { t_ch = "Div"; } + if ('%') { t_ch = "Mod"; } + if ('&') { t_ch = "And"; } + if ('|') { t_ch = "Or"; } + if ('^') { t_ch = "Xor"; } + if ('?') { t_ch = "Qmark"; } + if ('~') { t_ch = "Tilda"; } + if ('!') { t_ch = "Excl"; } + if ('>') { t_ch = "Greater"; } + if ('<') { t_ch = "Less"; } + if ('[') { t_ch = "Sqbl"; } + if (']') { t_ch = "Sqbr"; } + if ('.') { t_ch = "Dot"; } + if ('`') { t_ch = "Tick"; } + if (',') { t_ch = "Comma"; } + if (_) { t_ch = "_0x{hex(ch)}_" } // unmapped chars → hex escape + } + write(writer, "{t_ch}") + } + } + } + return prefix ? (suffix + name) : name; // suffix prepended (yes, prepended) iff prefix flag set +} +``` + +The `prefix` boolean controls whether the `suffix` arg ("_Func" for functions, "" for structs via `aotStructName`) is *prepended* to the mangled body. The flag fires in two conditions: + +1. **Any non-alnum char in the name** (operator overloads, backtick-encoded names): the substitution loop sets `prefix = true` as a side effect. +2. **The name is a C++ keyword** (since 2026-05-14): `is_cpp_keyword(name)` seeds the flag. + +**Example emissions:** + +| daslang | C++ name | +|---|---| +| `def foo()` | `foo_` (no prefix — alnum, not keyword) | +| `def operator+()` | `_FuncAdd_` | +| `def \`testing\`equal\``() | `_FunctestingTickequalTick_` | +| `def float()` | `_Funcfloat_` (was rejected by lint pre-2026-05-14) | +| `def do()` | `_Funcdo_` | + +**`aotStructName`** (line 269-271) uses the same helper with `suffix=""` — struct names need no prefix because the C++-keyword-name lint guard at `ast_lint.cpp:307` is still in force (relaxing struct names would need a different emit strategy, since struct names embed 1:1 into `struct Foo { ... }` syntax). + +**`is_cpp_keyword(name : string) : bool`** is the daslang binding of C++ `isCppKeyword` (`src/builtin/module_builtin_ast.cpp:1572-1573`). + +## Questions +- How does the daslang AOT emitter handle C++ keyword names like `def float`? +- How are operator overloads (`def +`, `def ==`) mangled in AOT C++ output? +- Where in daslang is the AOT C++ function-name mangler? +- What's `aotSuffixNameEx` and when does it prepend the `_Func` prefix? +- What does `_FuncAdd_` mean in generated AOT C++? +- Is there a way to find an AOT-emitted C++ symbol from a daslang function name? +- Can I call `is_cpp_keyword` from a daslang macro? diff --git a/mouse-data/docs/dastest-failed-cant-invalid-prefix-expected-compile-failure-tests.md b/mouse-data/docs/dastest-failed-cant-invalid-prefix-expected-compile-failure-tests.md new file mode 100644 index 0000000000..cafca9b501 --- /dev/null +++ b/mouse-data/docs/dastest-failed-cant-invalid-prefix-expected-compile-failure-tests.md @@ -0,0 +1,63 @@ +--- +slug: dastest-failed-cant-invalid-prefix-expected-compile-failure-tests +title: How does dastest treat `failed_*`, `cant_*`, `invalid_*` test files? +created: 2026-05-14 +last_verified: 2026-05-14 +links: [] +--- + +**Files in `tests/` whose basename starts with `failed_`, `cant_`, or `invalid_` are expected-compile-failure tests.** They declare which compile errors must fire, not what runtime behavior to test. + +**dastest skip:** `dastest/dastest.das:160-166` (inside `serializeAst`): + +```daslang +let base = base_name(file) +if (base |> starts_with("cant_") || base |> starts_with("failed_") || base |> starts_with("invalid_")) { + continue // skip AST serialization — they don't compile +} +``` + +**CMake skip:** Most `tests//CMakeLists.txt` GLOB filters exclude them from AOT compilation: +```cmake +list(FILTER AOT_FOO_FILES EXCLUDE REGEX "failed_") +``` +because trying to AOT-compile a file that intentionally fails to compile would just break the build. + +**The `expect` line** sits at the top of the file (after `options gen2`): + +```daslang +options gen2 +expect 30106:3, 30146, 30148, 30152, 30240, 30282 +``` + +- Comma-separated list of expected error codes. +- `code:N` syntax = "exactly N occurrences" (default 1). Above: three 30106 errors plus one each of the rest. +- Order doesn't matter; line numbers don't matter; what matters is that the compiler emits exactly those codes those many times. +- PASS when the actual error set matches the expect set. + +**Run via MCP:** + +``` +mcp__daslang__run_test tests/language/failed_reserved_names.das +``` + +emits the compile errors AND reports `PASS` (1 test, 1 passed) when codes match. + +**Maintenance when you relax or remove a compile-time guard:** + +1. If the now-passing case lives inside a `failed_*` file, delete that case from the file. +2. Drop the corresponding code from the `expect` line. +3. (Ideal) add a positive test elsewhere that exercises the now-legal form, ideally with AOT round-trip if codegen could break. + +Example (2026-05-14): when the function-name C++-keyword guard was dropped, `def do(a : int)` moved from `tests/language/failed_reserved_names.das` (with `30163` dropped from expect) to a new `tests/aot/test_cpp_keyword_names.das` as a positive case (exercising interpreter + AOT + JIT). + +The prefix is just convention so dastest and CMake know to skip them. `invalid_*` and `cant_*` behave identically to `failed_*`. + +## Questions +- What's the convention for daslang tests that expect a compile error? +- How does the `expect` line work in dastest? +- Why do `failed_*.das` files in tests/ not get AOT-compiled? +- What does `expect 30106:3` mean in a daslang test file? +- Where in dastest are expected-failure tests skipped from AST serialization? +- How do I write a test that asserts the compiler emits a specific error code? +- What should I do with a `failed_*` test after I relax the guard it was checking? diff --git a/mouse-data/docs/why-is-def-float-rejected-but-def-string-and-def-float2-allowed.md b/mouse-data/docs/why-is-def-float-rejected-but-def-string-and-def-float2-allowed.md new file mode 100644 index 0000000000..be7d365a7b --- /dev/null +++ b/mouse-data/docs/why-is-def-float-rejected-but-def-string-and-def-float2-allowed.md @@ -0,0 +1,54 @@ +--- +slug: why-is-def-float-rejected-but-def-string-and-def-float2-allowed +title: Why is `def float(...)` rejected but `def string(...)` and `def float2(...)` allowed? +created: 2026-05-14 +last_verified: 2026-05-14 +links: [] +--- + +The asymmetry is **not** in the parser. The grammar at `src/parser/ds2_parser.ypp:1316-1408` says: + +``` +function_name + : NAME // user identifiers + | DAS_OPERATOR ... // operator overloads + | das_type_name // any type-name TOKEN + ; +``` + +`das_type_name` accepts every type-keyword token: `DAS_TBOOL`, `DAS_TSTRING`, `DAS_TINT`, `DAS_TINT2`, `DAS_TFLOAT`, `DAS_TFLOAT2`, `DAS_TDOUBLE`, etc. So at the parser level `def float`, `def int`, `def string`, `def float2`, `def double` all parse identically. + +**The rejection is a post-parse lint guard at `src/ast/ast_lint.cpp:867-884`** (pre-2026-05-14): + +```cpp +bool isValidFunctionName(const string & str) const { + return !isCppKeyword(str.c_str()); +} +virtual void preVisit ( Function * fn ) override { + if (!isValidFunctionName(fn->name)) + program->error("invalid function name " + fn->name, ..., CompilationError::invalid_function_name); + ... +} +``` + +`isCppKeyword` (`src/builtin/module_builtin_ast.cpp:68-84`) is a hardcoded **C++**-keyword set. That set contains `float`, `int`, `double`, `bool`, `char`, `void`, `do`, `class`, `new`, `delete`, ... It does NOT contain `string` (that's `std::string` in C++ — qualified, not a keyword), nor `float2`/`int2`/`uint3`/etc. (daslang-specific typedefs, not C++ keywords). That's exactly the observed asymmetry. + +The lint guard existed because the AOT C++ emitter would otherwise generate a literal `float(...)` C++ function which wouldn't compile. + +**Status (2026-05-14, PR landed):** the function-name guard was dropped. `daslib/aot_cpp.das:223-267` (`aotSuffixNameEx`) now detects C++ keywords and applies the same `_Func` prefix it already used for operator-character names — so `def float` AOTs to `_Funcfloat_` (a valid C++ identifier). The other 5 `isCppKeyword` lint sites stay (module/enum/enum-value/struct/struct-field names) — those emit 1:1 into C++ and need the guard. + +The 6 callsites that *still* reject C++ keywords (post-PR): +- `ast_lint.cpp:253` module name → error 30210 +- `ast_lint.cpp:263` enumeration name → 30146 +- `ast_lint.cpp:266` enumeration value → 30148 +- `ast_lint.cpp:307` structure name → 30240 +- `ast_lint.cpp:349` struct field / variable / arg name → 30152 / 30282 / 30106 + +`is_cpp_keyword(name : string) : bool` is exposed to daslang via `module_builtin_ast.cpp:1572-1573` if you ever need to call it from a macro or AOT emitter. + +## Questions +- Why does `def float(...)` give error 30163 "invalid function name" but `def string(...)` doesn't? +- Where does daslang reject function names that are C++ keywords? +- Is the parser the gate for `def ` overloads, or is it the lint pass? +- Can I define a daslang function called `int` or `double`? +- What error code is "invalid function name" and where is it emitted? diff --git a/src/ast/ast_lint.cpp b/src/ast/ast_lint.cpp index 5dce702d46..01d86212c3 100644 --- a/src/ast/ast_lint.cpp +++ b/src/ast/ast_lint.cpp @@ -864,9 +864,6 @@ namespace das { } } } - bool isValidFunctionName(const string & str) const { - return !isCppKeyword(str.c_str()); - } virtual bool canVisitFunction ( Function * fun ) override { return !fun->stub && !fun->isTemplate; // we don't do a thing with templates } @@ -878,10 +875,6 @@ namespace das { virtual void preVisit ( Function * fn ) override { Visitor::preVisit(fn); func = fn; - if (!isValidFunctionName(fn->name)) { - program->error("invalid function name " + fn->name, "", "", - fn->at, CompilationError::invalid_function_name ); - } if ( !fn->result->isVoid() && !fn->result->isAuto() ) { if ( !exprReturns(fn->body) ) { program->error("not all control paths return value", "", "", diff --git a/tests/aot/test_cpp_keyword_names.das b/tests/aot/test_cpp_keyword_names.das new file mode 100644 index 0000000000..bcbc322a68 --- /dev/null +++ b/tests/aot/test_cpp_keyword_names.das @@ -0,0 +1,39 @@ +options gen2 +require dastest/testing_boost public + +struct Foo { + a : int +} + +def float(h : Foo) : int { + return h.a + 1 +} + +def int(h : Foo) : float { + return float(h.a) * 2.0 +} + +def double(h : Foo) : int { + return h.a + h.a +} + +def do(h : Foo) : int { + return h.a * 10 +} + +[test] +def test_cpp_keyword_function_names(t : T?) { + let h = Foo(a = 21) + t |> run("def float") @(t : T?) { + t |> equal(float(Foo(a = 41)), 42) + } + t |> run("def int") @(t : T?) { + t |> equal(int(Foo(a = 3)), 6.0) + } + t |> run("def double") @(t : T?) { + t |> equal(double(h), 42) + } + t |> run("def do") @(t : T?) { + t |> equal(do(Foo(a = 4)), 40) + } +} diff --git a/tests/language/failed_reserved_names.das b/tests/language/failed_reserved_names.das index af75db375f..956b9e9014 100644 --- a/tests/language/failed_reserved_names.das +++ b/tests/language/failed_reserved_names.das @@ -1,9 +1,9 @@ // reserved identifier names // verifies compiler rejects using reserved words (like 'register', 'do') -// as enum names, enum values, struct names, struct fields, function names, +// as enum names, enum values, struct names, struct fields, // function args, local variables, and lambda parameters options gen2 -expect 30106:3, 30146, 30148, 30152, 30163, 30240, 30282 +expect 30106:3, 30146, 30148, 30152, 30240, 30282 enum do {// 30116: invalid name foo @@ -23,10 +23,6 @@ struct register {// 30116: invalid name foo : int } -def do(a : int) {// 30116: invalid name - return a -} - def foo(register : int) {// 30116: invalid name return register }