diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 b/src/main/java/dk/camelot64/kickc/parser/KickC.g4 index 71659b44f..ca11b2848 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 +++ b/src/main/java/dk/camelot64/kickc/parser/KickC.g4 @@ -77,7 +77,7 @@ forDeclaration ; forIteration - : ';' expr ';' expr # forClassic + : ';' expr ';' expr? # forClassic | ':' expr ( '..' ) expr #forRange ; diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java index 52b35a9c4..6f11f5c9a 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java @@ -1856,8 +1856,9 @@ public class KickCParser extends Parser { public final ForIterationContext forIteration() throws RecognitionException { ForIterationContext _localctx = new ForIterationContext(_ctx, getState()); enterRule(_localctx, 28, RULE_forIteration); + int _la; try { - setState(287); + setState(288); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -1870,23 +1871,31 @@ public class KickCParser extends Parser { expr(0); setState(279); match(T__2); - setState(280); - expr(0); + setState(281); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__28) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__42) | (1L << T__43))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (STRING - 77)) | (1L << (CHAR - 77)) | (1L << (BOOLEAN - 77)) | (1L << (NUMBER - 77)) | (1L << (NAME - 77)))) != 0)) { + { + setState(280); + expr(0); + } + } + } break; case T__24: _localctx = new ForRangeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(282); - match(T__24); setState(283); + match(T__24); + setState(284); expr(0); { - setState(284); + setState(285); match(T__25); } - setState(285); + setState(286); expr(0); } break; @@ -2046,7 +2055,7 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(297); + setState(298); _errHandler.sync(this); switch (_input.LA(1)) { case T__3: @@ -2055,11 +2064,11 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(290); - match(T__3); setState(291); - typeDecl(0); + match(T__3); setState(292); + typeDecl(0); + setState(293); match(T__4); } break; @@ -2068,7 +2077,7 @@ public class KickCParser extends Parser { _localctx = new TypeSimpleContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(294); + setState(295); match(SIMPLETYPE); } break; @@ -2078,7 +2087,7 @@ public class KickCParser extends Parser { _localctx = new TypeSignedSimpleContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(295); + setState(296); _la = _input.LA(1); if ( !(_la==T__26 || _la==T__27) ) { _errHandler.recoverInline(this); @@ -2088,7 +2097,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(296); + setState(297); match(SIMPLETYPE); } break; @@ -2096,24 +2105,24 @@ public class KickCParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(312); + setState(313); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(310); + setState(311); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { case 1: { _localctx = new TypePtrContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(299); - if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); setState(300); + if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); + setState(301); match(T__28); } break; @@ -2121,21 +2130,21 @@ public class KickCParser extends Parser { { _localctx = new TypeArrayContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(301); - if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); setState(302); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(303); match(T__29); - setState(304); + setState(305); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__28) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__42) | (1L << T__43))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (STRING - 77)) | (1L << (CHAR - 77)) | (1L << (BOOLEAN - 77)) | (1L << (NUMBER - 77)) | (1L << (NAME - 77)))) != 0)) { { - setState(303); + setState(304); expr(0); } } - setState(306); + setState(307); match(T__30); } break; @@ -2143,20 +2152,20 @@ public class KickCParser extends Parser { { _localctx = new TypeProcedureContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(307); - if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); setState(308); - match(T__3); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); setState(309); + match(T__3); + setState(310); match(T__4); } break; } } } - setState(314); + setState(315); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } } } @@ -2555,20 +2564,20 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(349); + setState(350); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { _localctx = new ExprParContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(316); - match(T__3); setState(317); - expr(0); + match(T__3); setState(318); + expr(0); + setState(319); match(T__4); } break; @@ -2577,13 +2586,13 @@ public class KickCParser extends Parser { _localctx = new ExprCastContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(320); - match(T__3); setState(321); - typeDecl(0); + match(T__3); setState(322); - match(T__4); + typeDecl(0); setState(323); + match(T__4); + setState(324); expr(24); } break; @@ -2592,7 +2601,7 @@ public class KickCParser extends Parser { _localctx = new ExprPreModContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(325); + setState(326); _la = _input.LA(1); if ( !(_la==T__31 || _la==T__32) ) { _errHandler.recoverInline(this); @@ -2602,7 +2611,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(326); + setState(327); expr(23); } break; @@ -2611,9 +2620,9 @@ public class KickCParser extends Parser { _localctx = new ExprPtrContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(327); - match(T__28); setState(328); + match(T__28); + setState(329); expr(21); } break; @@ -2622,7 +2631,7 @@ public class KickCParser extends Parser { _localctx = new ExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(329); + setState(330); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37))) != 0)) ) { _errHandler.recoverInline(this); @@ -2632,7 +2641,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(330); + setState(331); expr(20); } break; @@ -2641,7 +2650,7 @@ public class KickCParser extends Parser { _localctx = new ExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(331); + setState(332); _la = _input.LA(1); if ( !(_la==T__42 || _la==T__43) ) { _errHandler.recoverInline(this); @@ -2651,7 +2660,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(332); + setState(333); expr(16); } break; @@ -2660,27 +2669,27 @@ public class KickCParser extends Parser { _localctx = new InitListContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(333); - match(T__5); setState(334); + match(T__5); + setState(335); expr(0); - setState(339); + setState(340); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__7) { { { - setState(335); - match(T__7); setState(336); + match(T__7); + setState(337); expr(0); } } - setState(341); + setState(342); _errHandler.sync(this); _la = _input.LA(1); } - setState(342); + setState(343); match(T__6); } break; @@ -2689,7 +2698,7 @@ public class KickCParser extends Parser { _localctx = new ExprIdContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(344); + setState(345); match(NAME); } break; @@ -2698,7 +2707,7 @@ public class KickCParser extends Parser { _localctx = new ExprNumberContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(345); + setState(346); match(NUMBER); } break; @@ -2707,7 +2716,7 @@ public class KickCParser extends Parser { _localctx = new ExprStringContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(346); + setState(347); match(STRING); } break; @@ -2716,7 +2725,7 @@ public class KickCParser extends Parser { _localctx = new ExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(347); + setState(348); match(CHAR); } break; @@ -2725,30 +2734,30 @@ public class KickCParser extends Parser { _localctx = new ExprBoolContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(348); + setState(349); match(BOOLEAN); } break; } _ctx.stop = _input.LT(-1); - setState(405); + setState(406); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + _alt = getInterpreter().adaptivePredict(_input,40,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(403); + setState(404); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(351); - if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); setState(352); + if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); + setState(353); _la = _input.LA(1); if ( !(_la==T__38 || _la==T__39) ) { _errHandler.recoverInline(this); @@ -2758,7 +2767,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(353); + setState(354); expr(20); } break; @@ -2766,9 +2775,9 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(354); - if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); setState(355); + if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); + setState(356); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__28) | (1L << T__40) | (1L << T__41))) != 0)) ) { _errHandler.recoverInline(this); @@ -2778,7 +2787,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(356); + setState(357); expr(19); } break; @@ -2786,9 +2795,9 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(357); - if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); setState(358); + if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); + setState(359); _la = _input.LA(1); if ( !(_la==T__33 || _la==T__34) ) { _errHandler.recoverInline(this); @@ -2798,7 +2807,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(359); + setState(360); expr(18); } break; @@ -2806,9 +2815,9 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(360); - if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); setState(361); + if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); + setState(362); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__46) | (1L << T__47))) != 0)) ) { _errHandler.recoverInline(this); @@ -2818,7 +2827,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(362); + setState(363); expr(16); } break; @@ -2826,13 +2835,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(363); + setState(364); if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); { - setState(364); + setState(365); match(T__36); } - setState(365); + setState(366); expr(15); } break; @@ -2840,13 +2849,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(366); + setState(367); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); { - setState(367); + setState(368); match(T__48); } - setState(368); + setState(369); expr(14); } break; @@ -2854,13 +2863,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(369); + setState(370); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); { - setState(370); + setState(371); match(T__49); } - setState(371); + setState(372); expr(13); } break; @@ -2868,13 +2877,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(372); + setState(373); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); { - setState(373); + setState(374); match(T__50); } - setState(374); + setState(375); expr(12); } break; @@ -2882,13 +2891,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(375); + setState(376); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); { - setState(376); + setState(377); match(T__51); } - setState(377); + setState(378); expr(11); } break; @@ -2896,15 +2905,15 @@ public class KickCParser extends Parser { { _localctx = new ExprTernaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(378); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); setState(379); - match(T__52); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); setState(380); - expr(0); + match(T__52); setState(381); - match(T__24); + expr(0); setState(382); + match(T__24); + setState(383); expr(10); } break; @@ -2912,11 +2921,11 @@ public class KickCParser extends Parser { { _localctx = new ExprAssignmentContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(384); - if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); setState(385); - match(T__1); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); setState(386); + match(T__1); + setState(387); expr(8); } break; @@ -2924,9 +2933,9 @@ public class KickCParser extends Parser { { _localctx = new ExprAssignmentCompoundContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(387); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); setState(388); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + setState(389); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__53) | (1L << T__54) | (1L << T__55) | (1L << T__56) | (1L << T__57) | (1L << T__58) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0)) ) { _errHandler.recoverInline(this); @@ -2936,7 +2945,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(389); + setState(390); expr(7); } break; @@ -2944,21 +2953,21 @@ public class KickCParser extends Parser { { _localctx = new ExprCallContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(390); - if (!(precpred(_ctx, 26))) throw new FailedPredicateException(this, "precpred(_ctx, 26)"); setState(391); + if (!(precpred(_ctx, 26))) throw new FailedPredicateException(this, "precpred(_ctx, 26)"); + setState(392); match(T__3); - setState(393); + setState(394); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << T__28) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__42) | (1L << T__43))) != 0) || ((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (STRING - 77)) | (1L << (CHAR - 77)) | (1L << (BOOLEAN - 77)) | (1L << (NUMBER - 77)) | (1L << (NAME - 77)))) != 0)) { { - setState(392); + setState(393); parameterList(); } } - setState(395); + setState(396); match(T__4); } break; @@ -2966,13 +2975,13 @@ public class KickCParser extends Parser { { _localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(396); - if (!(precpred(_ctx, 25))) throw new FailedPredicateException(this, "precpred(_ctx, 25)"); setState(397); - match(T__29); + if (!(precpred(_ctx, 25))) throw new FailedPredicateException(this, "precpred(_ctx, 25)"); setState(398); - expr(0); + match(T__29); setState(399); + expr(0); + setState(400); match(T__30); } break; @@ -2980,9 +2989,9 @@ public class KickCParser extends Parser { { _localctx = new ExprPostModContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(401); - if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)"); setState(402); + if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)"); + setState(403); _la = _input.LA(1); if ( !(_la==T__31 || _la==T__32) ) { _errHandler.recoverInline(this); @@ -2997,9 +3006,9 @@ public class KickCParser extends Parser { } } } - setState(407); + setState(408); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + _alt = getInterpreter().adaptivePredict(_input,40,_ctx); } } } @@ -3047,21 +3056,21 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(408); + setState(409); expr(0); - setState(413); + setState(414); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__7) { { { - setState(409); - match(T__7); setState(410); + match(T__7); + setState(411); expr(0); } } - setState(415); + setState(416); _errHandler.sync(this); _la = _input.LA(1); } @@ -3109,19 +3118,19 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(416); + setState(417); match(T__63); - setState(418); + setState(419); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__3) { { - setState(417); + setState(418); asmDirectives(); } } - setState(420); + setState(421); match(KICKASM); } } @@ -3169,27 +3178,27 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(422); - match(T__3); setState(423); + match(T__3); + setState(424); asmDirective(); - setState(428); + setState(429); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__7) { { { - setState(424); - match(T__7); setState(425); + match(T__7); + setState(426); asmDirective(); } } - setState(430); + setState(431); _errHandler.sync(this); _la = _input.LA(1); } - setState(431); + setState(432); match(T__4); } } @@ -3328,16 +3337,16 @@ public class KickCParser extends Parser { AsmDirectiveContext _localctx = new AsmDirectiveContext(_ctx, getState()); enterRule(_localctx, 40, RULE_asmDirective); try { - setState(448); + setState(449); _errHandler.sync(this); switch (_input.LA(1)) { case T__64: _localctx = new AsmDirectiveResourceContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(433); - match(T__64); setState(434); + match(T__64); + setState(435); match(STRING); } break; @@ -3345,9 +3354,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveUsesContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(435); - match(T__65); setState(436); + match(T__65); + setState(437); match(NAME); } break; @@ -3355,9 +3364,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveClobberContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(437); - match(T__66); setState(438); + match(T__66); + setState(439); match(STRING); } break; @@ -3365,9 +3374,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveBytesContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(439); - match(T__67); setState(440); + match(T__67); + setState(441); expr(0); } break; @@ -3375,9 +3384,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveCyclesContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(441); - match(T__68); setState(442); + match(T__68); + setState(443); expr(0); } break; @@ -3385,14 +3394,14 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveAddressContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(443); + setState(444); match(T__69); - setState(446); + setState(447); _errHandler.sync(this); switch (_input.LA(1)) { case T__12: { - setState(444); + setState(445); match(T__12); } break; @@ -3414,7 +3423,7 @@ public class KickCParser extends Parser { case NUMBER: case NAME: { - setState(445); + setState(446); expr(0); } break; @@ -3471,17 +3480,17 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(453); + setState(454); _errHandler.sync(this); _la = _input.LA(1); while (((((_la - 36)) & ~0x3f) == 0 && ((1L << (_la - 36)) & ((1L << (T__35 - 36)) | (1L << (T__70 - 36)) | (1L << (MNEMONIC - 36)) | (1L << (NAME - 36)))) != 0)) { { { - setState(450); + setState(451); asmLine(); } } - setState(455); + setState(456); _errHandler.sync(this); _la = _input.LA(1); } @@ -3531,28 +3540,28 @@ public class KickCParser extends Parser { AsmLineContext _localctx = new AsmLineContext(_ctx, getState()); enterRule(_localctx, 44, RULE_asmLine); try { - setState(459); + setState(460); _errHandler.sync(this); switch (_input.LA(1)) { case T__35: case NAME: enterOuterAlt(_localctx, 1); { - setState(456); + setState(457); asmLabel(); } break; case MNEMONIC: enterOuterAlt(_localctx, 2); { - setState(457); + setState(458); asmInstruction(); } break; case T__70: enterOuterAlt(_localctx, 3); { - setState(458); + setState(459); asmBytes(); } break; @@ -3622,16 +3631,16 @@ public class KickCParser extends Parser { enterRule(_localctx, 46, RULE_asmLabel); int _la; try { - setState(468); + setState(469); _errHandler.sync(this); switch (_input.LA(1)) { case NAME: _localctx = new AsmLabelNameContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(461); - match(NAME); setState(462); + match(NAME); + setState(463); match(T__24); } break; @@ -3639,19 +3648,19 @@ public class KickCParser extends Parser { _localctx = new AsmLabelMultiContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(463); + setState(464); match(T__35); - setState(465); + setState(466); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAME) { { - setState(464); + setState(465); match(NAME); } } - setState(467); + setState(468); match(T__24); } break; @@ -3700,14 +3709,14 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(470); + setState(471); match(MNEMONIC); - setState(472); + setState(473); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(471); + setState(472); asmParamMode(); } break; @@ -3758,23 +3767,23 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(474); - match(T__70); setState(475); + match(T__70); + setState(476); asmExpr(0); - setState(480); + setState(481); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__7) { { { - setState(476); - match(T__7); setState(477); + match(T__7); + setState(478); asmExpr(0); } } - setState(482); + setState(483); _errHandler.sync(this); _la = _input.LA(1); } @@ -3924,14 +3933,14 @@ public class KickCParser extends Parser { AsmParamModeContext _localctx = new AsmParamModeContext(_ctx, getState()); enterRule(_localctx, 52, RULE_asmParamMode); try { - setState(506); + setState(507); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: _localctx = new AsmModeAbsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(483); + setState(484); asmExpr(0); } break; @@ -3939,9 +3948,9 @@ public class KickCParser extends Parser { _localctx = new AsmModeImmContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(484); - match(T__71); setState(485); + match(T__71); + setState(486); asmExpr(0); } break; @@ -3949,11 +3958,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeAbsXYContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(486); - asmExpr(0); setState(487); - match(T__7); + asmExpr(0); setState(488); + match(T__7); + setState(489); match(NAME); } break; @@ -3961,15 +3970,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndIdxXYContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(490); - match(T__3); setState(491); - asmExpr(0); + match(T__3); setState(492); - match(T__4); + asmExpr(0); setState(493); - match(T__7); + match(T__4); setState(494); + match(T__7); + setState(495); match(NAME); } break; @@ -3977,15 +3986,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIdxIndXYContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(496); - match(T__3); setState(497); - asmExpr(0); + match(T__3); setState(498); - match(T__7); + asmExpr(0); setState(499); - match(NAME); + match(T__7); setState(500); + match(NAME); + setState(501); match(T__4); } break; @@ -3993,11 +4002,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(502); - match(T__3); setState(503); - asmExpr(0); + match(T__3); setState(504); + asmExpr(0); + setState(505); match(T__4); } break; @@ -4187,7 +4196,7 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(522); + setState(523); _errHandler.sync(this); switch (_input.LA(1)) { case T__29: @@ -4196,11 +4205,11 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(509); - match(T__29); setState(510); - asmExpr(0); + match(T__29); setState(511); + asmExpr(0); + setState(512); match(T__30); } break; @@ -4212,7 +4221,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(513); + setState(514); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__33) | (1L << T__34) | (1L << T__42) | (1L << T__43))) != 0)) ) { _errHandler.recoverInline(this); @@ -4222,7 +4231,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(514); + setState(515); asmExpr(8); } break; @@ -4231,7 +4240,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(515); + setState(516); match(NAME); } break; @@ -4240,7 +4249,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelRelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(516); + setState(517); match(ASMREL); } break; @@ -4249,11 +4258,11 @@ public class KickCParser extends Parser { _localctx = new AsmExprReplaceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(517); - match(T__5); setState(518); - match(NAME); + match(T__5); setState(519); + match(NAME); + setState(520); match(T__6); } break; @@ -4262,7 +4271,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprIntContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(520); + setState(521); match(NUMBER); } break; @@ -4271,7 +4280,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(521); + setState(522); match(CHAR); } break; @@ -4279,28 +4288,28 @@ public class KickCParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(538); + setState(539); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,54,_ctx); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(536); + setState(537); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(524); + setState(525); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); { - setState(525); + setState(526); match(T__72); } - setState(526); + setState(527); asmExpr(11); } break; @@ -4308,9 +4317,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(527); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); setState(528); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + setState(529); _la = _input.LA(1); if ( !(_la==T__38 || _la==T__39) ) { _errHandler.recoverInline(this); @@ -4320,7 +4329,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(529); + setState(530); asmExpr(10); } break; @@ -4328,9 +4337,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(530); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); setState(531); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + setState(532); _la = _input.LA(1); if ( !(_la==T__28 || _la==T__40) ) { _errHandler.recoverInline(this); @@ -4340,7 +4349,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(532); + setState(533); asmExpr(8); } break; @@ -4348,9 +4357,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(533); - if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); setState(534); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + setState(535); _la = _input.LA(1); if ( !(_la==T__33 || _la==T__34) ) { _errHandler.recoverInline(this); @@ -4360,16 +4369,16 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(535); + setState(536); asmExpr(7); } break; } } } - setState(540); + setState(541); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,54,_ctx); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); } } } @@ -4456,7 +4465,7 @@ public class KickCParser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3_\u0220\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3_\u0221\4\2\t\2\4"+ "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -4478,198 +4487,199 @@ public class KickCParser extends Parser { "\3\16\3\16\3\16\5\16\u00fb\n\16\3\16\3\16\3\16\3\16\3\16\5\16\u0102\n"+ "\16\3\17\7\17\u0105\n\17\f\17\16\17\u0108\13\17\3\17\5\17\u010b\n\17\3"+ "\17\7\17\u010e\n\17\f\17\16\17\u0111\13\17\3\17\3\17\3\17\5\17\u0116\n"+ - "\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u0122\n\20"+ - "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5\21\u012c\n\21\3\21\3\21\3\21"+ - "\3\21\3\21\5\21\u0133\n\21\3\21\3\21\3\21\3\21\7\21\u0139\n\21\f\21\16"+ - "\21\u013c\13\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ - "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u0154\n\22"+ - "\f\22\16\22\u0157\13\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\5\22\u0160"+ - "\n\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ + "\17\3\20\3\20\3\20\3\20\5\20\u011c\n\20\3\20\3\20\3\20\3\20\3\20\5\20"+ + "\u0123\n\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5\21\u012d\n\21\3"+ + "\21\3\21\3\21\3\21\3\21\5\21\u0134\n\21\3\21\3\21\3\21\3\21\7\21\u013a"+ + "\n\21\f\21\16\21\u013d\13\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3"+ + "\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\7"+ + "\22\u0155\n\22\f\22\16\22\u0158\13\22\3\22\3\22\3\22\3\22\3\22\3\22\3"+ + "\22\5\22\u0161\n\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ - "\3\22\5\22\u018c\n\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u0196"+ - "\n\22\f\22\16\22\u0199\13\22\3\23\3\23\3\23\7\23\u019e\n\23\f\23\16\23"+ - "\u01a1\13\23\3\24\3\24\5\24\u01a5\n\24\3\24\3\24\3\25\3\25\3\25\3\25\7"+ - "\25\u01ad\n\25\f\25\16\25\u01b0\13\25\3\25\3\25\3\26\3\26\3\26\3\26\3"+ - "\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u01c1\n\26\5\26\u01c3"+ - "\n\26\3\27\7\27\u01c6\n\27\f\27\16\27\u01c9\13\27\3\30\3\30\3\30\5\30"+ - "\u01ce\n\30\3\31\3\31\3\31\3\31\5\31\u01d4\n\31\3\31\5\31\u01d7\n\31\3"+ - "\32\3\32\5\32\u01db\n\32\3\33\3\33\3\33\3\33\7\33\u01e1\n\33\f\33\16\33"+ - "\u01e4\13\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3"+ - "\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01fd"+ - "\n\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+ - "\3\35\5\35\u020d\n\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+ - "\3\35\3\35\7\35\u021b\n\35\f\35\16\35\u021e\13\35\3\35\2\5 \"8\36\2\4"+ - "\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668\2\r\3\2\35\36"+ - "\3\2\"#\3\2$(\3\2-.\3\2)*\4\2\37\37+,\3\2$%\3\2-\62\3\28A\4\2$%-.\4\2"+ - "\37\37++\2\u0273\2:\3\2\2\2\4>\3\2\2\2\6D\3\2\2\2\bG\3\2\2\2\nK\3\2\2"+ - "\2\fR\3\2\2\2\16W\3\2\2\2\20k\3\2\2\2\22\u0081\3\2\2\2\24\u0099\3\2\2"+ - "\2\26\u00ad\3\2\2\2\30\u00b0\3\2\2\2\32\u0101\3\2\2\2\34\u0106\3\2\2\2"+ - "\36\u0121\3\2\2\2 \u012b\3\2\2\2\"\u015f\3\2\2\2$\u019a\3\2\2\2&\u01a2"+ - "\3\2\2\2(\u01a8\3\2\2\2*\u01c2\3\2\2\2,\u01c7\3\2\2\2.\u01cd\3\2\2\2\60"+ - "\u01d6\3\2\2\2\62\u01d8\3\2\2\2\64\u01dc\3\2\2\2\66\u01fc\3\2\2\28\u020c"+ - "\3\2\2\2:;\5\6\4\2;<\5\n\6\2<=\7\2\2\3=\3\3\2\2\2>?\5,\27\2?@\7\2\2\3"+ - "@\5\3\2\2\2AC\5\b\5\2BA\3\2\2\2CF\3\2\2\2DB\3\2\2\2DE\3\2\2\2E\7\3\2\2"+ - "\2FD\3\2\2\2GH\7\3\2\2HI\7O\2\2I\t\3\2\2\2JL\5\f\7\2KJ\3\2\2\2LM\3\2\2"+ - "\2MK\3\2\2\2MN\3\2\2\2N\13\3\2\2\2OS\5\16\b\2PS\5\20\t\2QS\5&\24\2RO\3"+ - "\2\2\2RP\3\2\2\2RQ\3\2\2\2S\r\3\2\2\2TV\5\26\f\2UT\3\2\2\2VY\3\2\2\2W"+ - "U\3\2\2\2WX\3\2\2\2XZ\3\2\2\2YW\3\2\2\2Z^\5 \21\2[]\5\26\f\2\\[\3\2\2"+ - "\2]`\3\2\2\2^\\\3\2\2\2^_\3\2\2\2_a\3\2\2\2`^\3\2\2\2ad\7[\2\2bc\7\4\2"+ - "\2ce\5\"\22\2db\3\2\2\2de\3\2\2\2ef\3\2\2\2fg\7\5\2\2g\17\3\2\2\2hj\5"+ - "\26\f\2ih\3\2\2\2jm\3\2\2\2ki\3\2\2\2kl\3\2\2\2ln\3\2\2\2mk\3\2\2\2nr"+ - "\5 \21\2oq\5\26\f\2po\3\2\2\2qt\3\2\2\2rp\3\2\2\2rs\3\2\2\2su\3\2\2\2"+ - "tr\3\2\2\2uv\7[\2\2vx\7\6\2\2wy\5\22\n\2xw\3\2\2\2xy\3\2\2\2yz\3\2\2\2"+ - "z{\7\7\2\2{}\7\b\2\2|~\5\30\r\2}|\3\2\2\2}~\3\2\2\2~\177\3\2\2\2\177\u0080"+ - "\7\t\2\2\u0080\21\3\2\2\2\u0081\u0086\5\24\13\2\u0082\u0083\7\n\2\2\u0083"+ - "\u0085\5\24\13\2\u0084\u0082\3\2\2\2\u0085\u0088\3\2\2\2\u0086\u0084\3"+ - "\2\2\2\u0086\u0087\3\2\2\2\u0087\23\3\2\2\2\u0088\u0086\3\2\2\2\u0089"+ - "\u008b\5\26\f\2\u008a\u0089\3\2\2\2\u008b\u008e\3\2\2\2\u008c\u008a\3"+ - "\2\2\2\u008c\u008d\3\2\2\2\u008d\u008f\3\2\2\2\u008e\u008c\3\2\2\2\u008f"+ - "\u0093\5 \21\2\u0090\u0092\5\26\f\2\u0091\u0090\3\2\2\2\u0092\u0095\3"+ - "\2\2\2\u0093\u0091\3\2\2\2\u0093\u0094\3\2\2\2\u0094\u0096\3\2\2\2\u0095"+ - "\u0093\3\2\2\2\u0096\u0097\7[\2\2\u0097\u009a\3\2\2\2\u0098\u009a\7N\2"+ - "\2\u0099\u008c\3\2\2\2\u0099\u0098\3\2\2\2\u009a\25\3\2\2\2\u009b\u00ae"+ - "\7\13\2\2\u009c\u00ae\7\f\2\2\u009d\u009e\7\r\2\2\u009e\u009f\7\6\2\2"+ - "\u009f\u00a0\7R\2\2\u00a0\u00ae\7\7\2\2\u00a1\u00a2\7\16\2\2\u00a2\u00a3"+ - "\7\6\2\2\u00a3\u00a4\7[\2\2\u00a4\u00ae\7\7\2\2\u00a5\u00ae\7\17\2\2\u00a6"+ - "\u00ae\7\20\2\2\u00a7\u00ab\7\21\2\2\u00a8\u00a9\7\6\2\2\u00a9\u00aa\7"+ - "[\2\2\u00aa\u00ac\7\7\2\2\u00ab\u00a8\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac"+ - "\u00ae\3\2\2\2\u00ad\u009b\3\2\2\2\u00ad\u009c\3\2\2\2\u00ad\u009d\3\2"+ - "\2\2\u00ad\u00a1\3\2\2\2\u00ad\u00a5\3\2\2\2\u00ad\u00a6\3\2\2\2\u00ad"+ - "\u00a7\3\2\2\2\u00ae\27\3\2\2\2\u00af\u00b1\5\32\16\2\u00b0\u00af\3\2"+ - "\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b0\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3"+ - "\31\3\2\2\2\u00b4\u0102\5\16\b\2\u00b5\u00b7\7\b\2\2\u00b6\u00b8\5\30"+ - "\r\2\u00b7\u00b6\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\u00b9\3\2\2\2\u00b9"+ - "\u0102\7\t\2\2\u00ba\u00bb\5\"\22\2\u00bb\u00bc\7\5\2\2\u00bc\u0102\3"+ - "\2\2\2\u00bd\u00be\7\22\2\2\u00be\u00bf\7\6\2\2\u00bf\u00c0\5\"\22\2\u00c0"+ - "\u00c1\7\7\2\2\u00c1\u00c4\5\32\16\2\u00c2\u00c3\7\23\2\2\u00c3\u00c5"+ - "\5\32\16\2\u00c4\u00c2\3\2\2\2\u00c4\u00c5\3\2\2\2\u00c5\u0102\3\2\2\2"+ - "\u00c6\u00c8\5\26\f\2\u00c7\u00c6\3\2\2\2\u00c8\u00cb\3\2\2\2\u00c9\u00c7"+ - "\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cc\3\2\2\2\u00cb\u00c9\3\2\2\2\u00cc"+ - "\u00cd\7\24\2\2\u00cd\u00ce\7\6\2\2\u00ce\u00cf\5\"\22\2\u00cf\u00d0\7"+ - "\7\2\2\u00d0\u00d1\5\32\16\2\u00d1\u0102\3\2\2\2\u00d2\u00d4\5\26\f\2"+ - "\u00d3\u00d2\3\2\2\2\u00d4\u00d7\3\2\2\2\u00d5\u00d3\3\2\2\2\u00d5\u00d6"+ - "\3\2\2\2\u00d6\u00d8\3\2\2\2\u00d7\u00d5\3\2\2\2\u00d8\u00d9\7\25\2\2"+ - "\u00d9\u00da\5\32\16\2\u00da\u00db\7\24\2\2\u00db\u00dc\7\6\2\2\u00dc"+ - "\u00dd\5\"\22\2\u00dd\u00de\7\7\2\2\u00de\u00df\7\5\2\2\u00df\u0102\3"+ - "\2\2\2\u00e0\u00e2\5\26\f\2\u00e1\u00e0\3\2\2\2\u00e2\u00e5\3\2\2\2\u00e3"+ - "\u00e1\3\2\2\2\u00e3\u00e4\3\2\2\2\u00e4\u00e6\3\2\2\2\u00e5\u00e3\3\2"+ - "\2\2\u00e6\u00e7\7\26\2\2\u00e7\u00e9\7\6\2\2\u00e8\u00ea\5\34\17\2\u00e9"+ - "\u00e8\3\2\2\2\u00e9\u00ea\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ec\5\36"+ - "\20\2\u00ec\u00ed\7\7\2\2\u00ed\u00ee\5\32\16\2\u00ee\u0102\3\2\2\2\u00ef"+ - "\u00f1\7\27\2\2\u00f0\u00f2\5\"\22\2\u00f1\u00f0\3\2\2\2\u00f1\u00f2\3"+ - "\2\2\2\u00f2\u00f3\3\2\2\2\u00f3\u0102\7\5\2\2\u00f4\u00f5\7\30\2\2\u00f5"+ - "\u0102\7\5\2\2\u00f6\u00f7\7\31\2\2\u00f7\u0102\7\5\2\2\u00f8\u00fa\7"+ - "\32\2\2\u00f9\u00fb\5(\25\2\u00fa\u00f9\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb"+ - "\u00fc\3\2\2\2\u00fc\u00fd\7\b\2\2\u00fd\u00fe\5,\27\2\u00fe\u00ff\7\t"+ - "\2\2\u00ff\u0102\3\2\2\2\u0100\u0102\5&\24\2\u0101\u00b4\3\2\2\2\u0101"+ - "\u00b5\3\2\2\2\u0101\u00ba\3\2\2\2\u0101\u00bd\3\2\2\2\u0101\u00c9\3\2"+ - "\2\2\u0101\u00d5\3\2\2\2\u0101\u00e3\3\2\2\2\u0101\u00ef\3\2\2\2\u0101"+ - "\u00f4\3\2\2\2\u0101\u00f6\3\2\2\2\u0101\u00f8\3\2\2\2\u0101\u0100\3\2"+ - "\2\2\u0102\33\3\2\2\2\u0103\u0105\5\26\f\2\u0104\u0103\3\2\2\2\u0105\u0108"+ - "\3\2\2\2\u0106\u0104\3\2\2\2\u0106\u0107\3\2\2\2\u0107\u010a\3\2\2\2\u0108"+ - "\u0106\3\2\2\2\u0109\u010b\5 \21\2\u010a\u0109\3\2\2\2\u010a\u010b\3\2"+ - "\2\2\u010b\u010f\3\2\2\2\u010c\u010e\5\26\f\2\u010d\u010c\3\2\2\2\u010e"+ - "\u0111\3\2\2\2\u010f\u010d\3\2\2\2\u010f\u0110\3\2\2\2\u0110\u0112\3\2"+ - "\2\2\u0111\u010f\3\2\2\2\u0112\u0115\7[\2\2\u0113\u0114\7\4\2\2\u0114"+ - "\u0116\5\"\22\2\u0115\u0113\3\2\2\2\u0115\u0116\3\2\2\2\u0116\35\3\2\2"+ - "\2\u0117\u0118\7\5\2\2\u0118\u0119\5\"\22\2\u0119\u011a\7\5\2\2\u011a"+ - "\u011b\5\"\22\2\u011b\u0122\3\2\2\2\u011c\u011d\7\33\2\2\u011d\u011e\5"+ - "\"\22\2\u011e\u011f\7\34\2\2\u011f\u0120\5\"\22\2\u0120\u0122\3\2\2\2"+ - "\u0121\u0117\3\2\2\2\u0121\u011c\3\2\2\2\u0122\37\3\2\2\2\u0123\u0124"+ - "\b\21\1\2\u0124\u0125\7\6\2\2\u0125\u0126\5 \21\2\u0126\u0127\7\7\2\2"+ - "\u0127\u012c\3\2\2\2\u0128\u012c\7N\2\2\u0129\u012a\t\2\2\2\u012a\u012c"+ - "\7N\2\2\u012b\u0123\3\2\2\2\u012b\u0128\3\2\2\2\u012b\u0129\3\2\2\2\u012c"+ - "\u013a\3\2\2\2\u012d\u012e\f\5\2\2\u012e\u0139\7\37\2\2\u012f\u0130\f"+ - "\4\2\2\u0130\u0132\7 \2\2\u0131\u0133\5\"\22\2\u0132\u0131\3\2\2\2\u0132"+ - "\u0133\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0139\7!\2\2\u0135\u0136\f\3"+ - "\2\2\u0136\u0137\7\6\2\2\u0137\u0139\7\7\2\2\u0138\u012d\3\2\2\2\u0138"+ - "\u012f\3\2\2\2\u0138\u0135\3\2\2\2\u0139\u013c\3\2\2\2\u013a\u0138\3\2"+ - "\2\2\u013a\u013b\3\2\2\2\u013b!\3\2\2\2\u013c\u013a\3\2\2\2\u013d\u013e"+ - "\b\22\1\2\u013e\u013f\7\6\2\2\u013f\u0140\5\"\22\2\u0140\u0141\7\7\2\2"+ - "\u0141\u0160\3\2\2\2\u0142\u0143\7\6\2\2\u0143\u0144\5 \21\2\u0144\u0145"+ - "\7\7\2\2\u0145\u0146\5\"\22\32\u0146\u0160\3\2\2\2\u0147\u0148\t\3\2\2"+ - "\u0148\u0160\5\"\22\31\u0149\u014a\7\37\2\2\u014a\u0160\5\"\22\27\u014b"+ - "\u014c\t\4\2\2\u014c\u0160\5\"\22\26\u014d\u014e\t\5\2\2\u014e\u0160\5"+ - "\"\22\22\u014f\u0150\7\b\2\2\u0150\u0155\5\"\22\2\u0151\u0152\7\n\2\2"+ - "\u0152\u0154\5\"\22\2\u0153\u0151\3\2\2\2\u0154\u0157\3\2\2\2\u0155\u0153"+ - "\3\2\2\2\u0155\u0156\3\2\2\2\u0156\u0158\3\2\2\2\u0157\u0155\3\2\2\2\u0158"+ - "\u0159\7\t\2\2\u0159\u0160\3\2\2\2\u015a\u0160\7[\2\2\u015b\u0160\7R\2"+ - "\2\u015c\u0160\7O\2\2\u015d\u0160\7P\2\2\u015e\u0160\7Q\2\2\u015f\u013d"+ - "\3\2\2\2\u015f\u0142\3\2\2\2\u015f\u0147\3\2\2\2\u015f\u0149\3\2\2\2\u015f"+ - "\u014b\3\2\2\2\u015f\u014d\3\2\2\2\u015f\u014f\3\2\2\2\u015f\u015a\3\2"+ - "\2\2\u015f\u015b\3\2\2\2\u015f\u015c\3\2\2\2\u015f\u015d\3\2\2\2\u015f"+ - "\u015e\3\2\2\2\u0160\u0197\3\2\2\2\u0161\u0162\f\25\2\2\u0162\u0163\t"+ - "\6\2\2\u0163\u0196\5\"\22\26\u0164\u0165\f\24\2\2\u0165\u0166\t\7\2\2"+ - "\u0166\u0196\5\"\22\25\u0167\u0168\f\23\2\2\u0168\u0169\t\b\2\2\u0169"+ - "\u0196\5\"\22\24\u016a\u016b\f\21\2\2\u016b\u016c\t\t\2\2\u016c\u0196"+ - "\5\"\22\22\u016d\u016e\f\20\2\2\u016e\u016f\7\'\2\2\u016f\u0196\5\"\22"+ - "\21\u0170\u0171\f\17\2\2\u0171\u0172\7\63\2\2\u0172\u0196\5\"\22\20\u0173"+ - "\u0174\f\16\2\2\u0174\u0175\7\64\2\2\u0175\u0196\5\"\22\17\u0176\u0177"+ - "\f\r\2\2\u0177\u0178\7\65\2\2\u0178\u0196\5\"\22\16\u0179\u017a\f\f\2"+ - "\2\u017a\u017b\7\66\2\2\u017b\u0196\5\"\22\r\u017c\u017d\f\13\2\2\u017d"+ - "\u017e\7\67\2\2\u017e\u017f\5\"\22\2\u017f\u0180\7\33\2\2\u0180\u0181"+ - "\5\"\22\f\u0181\u0196\3\2\2\2\u0182\u0183\f\n\2\2\u0183\u0184\7\4\2\2"+ - "\u0184\u0196\5\"\22\n\u0185\u0186\f\t\2\2\u0186\u0187\t\n\2\2\u0187\u0196"+ - "\5\"\22\t\u0188\u0189\f\34\2\2\u0189\u018b\7\6\2\2\u018a\u018c\5$\23\2"+ - "\u018b\u018a\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d\3\2\2\2\u018d\u0196"+ - "\7\7\2\2\u018e\u018f\f\33\2\2\u018f\u0190\7 \2\2\u0190\u0191\5\"\22\2"+ - "\u0191\u0192\7!\2\2\u0192\u0196\3\2\2\2\u0193\u0194\f\30\2\2\u0194\u0196"+ - "\t\3\2\2\u0195\u0161\3\2\2\2\u0195\u0164\3\2\2\2\u0195\u0167\3\2\2\2\u0195"+ - "\u016a\3\2\2\2\u0195\u016d\3\2\2\2\u0195\u0170\3\2\2\2\u0195\u0173\3\2"+ - "\2\2\u0195\u0176\3\2\2\2\u0195\u0179\3\2\2\2\u0195\u017c\3\2\2\2\u0195"+ - "\u0182\3\2\2\2\u0195\u0185\3\2\2\2\u0195\u0188\3\2\2\2\u0195\u018e\3\2"+ - "\2\2\u0195\u0193\3\2\2\2\u0196\u0199\3\2\2\2\u0197\u0195\3\2\2\2\u0197"+ - "\u0198\3\2\2\2\u0198#\3\2\2\2\u0199\u0197\3\2\2\2\u019a\u019f\5\"\22\2"+ - "\u019b\u019c\7\n\2\2\u019c\u019e\5\"\22\2\u019d\u019b\3\2\2\2\u019e\u01a1"+ - "\3\2\2\2\u019f\u019d\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0%\3\2\2\2\u01a1"+ - "\u019f\3\2\2\2\u01a2\u01a4\7B\2\2\u01a3\u01a5\5(\25\2\u01a4\u01a3\3\2"+ - "\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a7\7M\2\2\u01a7"+ - "\'\3\2\2\2\u01a8\u01a9\7\6\2\2\u01a9\u01ae\5*\26\2\u01aa\u01ab\7\n\2\2"+ - "\u01ab\u01ad\5*\26\2\u01ac\u01aa\3\2\2\2\u01ad\u01b0\3\2\2\2\u01ae\u01ac"+ - "\3\2\2\2\u01ae\u01af\3\2\2\2\u01af\u01b1\3\2\2\2\u01b0\u01ae\3\2\2\2\u01b1"+ - "\u01b2\7\7\2\2\u01b2)\3\2\2\2\u01b3\u01b4\7C\2\2\u01b4\u01c3\7O\2\2\u01b5"+ - "\u01b6\7D\2\2\u01b6\u01c3\7[\2\2\u01b7\u01b8\7E\2\2\u01b8\u01c3\7O\2\2"+ - "\u01b9\u01ba\7F\2\2\u01ba\u01c3\5\"\22\2\u01bb\u01bc\7G\2\2\u01bc\u01c3"+ - "\5\"\22\2\u01bd\u01c0\7H\2\2\u01be\u01c1\7\17\2\2\u01bf\u01c1\5\"\22\2"+ - "\u01c0\u01be\3\2\2\2\u01c0\u01bf\3\2\2\2\u01c1\u01c3\3\2\2\2\u01c2\u01b3"+ - "\3\2\2\2\u01c2\u01b5\3\2\2\2\u01c2\u01b7\3\2\2\2\u01c2\u01b9\3\2\2\2\u01c2"+ - "\u01bb\3\2\2\2\u01c2\u01bd\3\2\2\2\u01c3+\3\2\2\2\u01c4\u01c6\5.\30\2"+ - "\u01c5\u01c4\3\2\2\2\u01c6\u01c9\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c7\u01c8"+ - "\3\2\2\2\u01c8-\3\2\2\2\u01c9\u01c7\3\2\2\2\u01ca\u01ce\5\60\31\2\u01cb"+ - "\u01ce\5\62\32\2\u01cc\u01ce\5\64\33\2\u01cd\u01ca\3\2\2\2\u01cd\u01cb"+ - "\3\2\2\2\u01cd\u01cc\3\2\2\2\u01ce/\3\2\2\2\u01cf\u01d0\7[\2\2\u01d0\u01d7"+ - "\7\33\2\2\u01d1\u01d3\7&\2\2\u01d2\u01d4\7[\2\2\u01d3\u01d2\3\2\2\2\u01d3"+ - "\u01d4\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d7\7\33\2\2\u01d6\u01cf\3"+ - "\2\2\2\u01d6\u01d1\3\2\2\2\u01d7\61\3\2\2\2\u01d8\u01da\7L\2\2\u01d9\u01db"+ - "\5\66\34\2\u01da\u01d9\3\2\2\2\u01da\u01db\3\2\2\2\u01db\63\3\2\2\2\u01dc"+ - "\u01dd\7I\2\2\u01dd\u01e2\58\35\2\u01de\u01df\7\n\2\2\u01df\u01e1\58\35"+ - "\2\u01e0\u01de\3\2\2\2\u01e1\u01e4\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e2\u01e3"+ - "\3\2\2\2\u01e3\65\3\2\2\2\u01e4\u01e2\3\2\2\2\u01e5\u01fd\58\35\2\u01e6"+ - "\u01e7\7J\2\2\u01e7\u01fd\58\35\2\u01e8\u01e9\58\35\2\u01e9\u01ea\7\n"+ - "\2\2\u01ea\u01eb\7[\2\2\u01eb\u01fd\3\2\2\2\u01ec\u01ed\7\6\2\2\u01ed"+ - "\u01ee\58\35\2\u01ee\u01ef\7\7\2\2\u01ef\u01f0\7\n\2\2\u01f0\u01f1\7["+ - "\2\2\u01f1\u01fd\3\2\2\2\u01f2\u01f3\7\6\2\2\u01f3\u01f4\58\35\2\u01f4"+ - "\u01f5\7\n\2\2\u01f5\u01f6\7[\2\2\u01f6\u01f7\7\7\2\2\u01f7\u01fd\3\2"+ - "\2\2\u01f8\u01f9\7\6\2\2\u01f9\u01fa\58\35\2\u01fa\u01fb\7\7\2\2\u01fb"+ - "\u01fd\3\2\2\2\u01fc\u01e5\3\2\2\2\u01fc\u01e6\3\2\2\2\u01fc\u01e8\3\2"+ - "\2\2\u01fc\u01ec\3\2\2\2\u01fc\u01f2\3\2\2\2\u01fc\u01f8\3\2\2\2\u01fd"+ - "\67\3\2\2\2\u01fe\u01ff\b\35\1\2\u01ff\u0200\7 \2\2\u0200\u0201\58\35"+ - "\2\u0201\u0202\7!\2\2\u0202\u020d\3\2\2\2\u0203\u0204\t\13\2\2\u0204\u020d"+ - "\58\35\n\u0205\u020d\7[\2\2\u0206\u020d\7\\\2\2\u0207\u0208\7\b\2\2\u0208"+ - "\u0209\7[\2\2\u0209\u020d\7\t\2\2\u020a\u020d\7R\2\2\u020b\u020d\7P\2"+ - "\2\u020c\u01fe\3\2\2\2\u020c\u0203\3\2\2\2\u020c\u0205\3\2\2\2\u020c\u0206"+ - "\3\2\2\2\u020c\u0207\3\2\2\2\u020c\u020a\3\2\2\2\u020c\u020b\3\2\2\2\u020d"+ - "\u021c\3\2\2\2\u020e\u020f\f\f\2\2\u020f\u0210\7K\2\2\u0210\u021b\58\35"+ - "\r\u0211\u0212\f\13\2\2\u0212\u0213\t\6\2\2\u0213\u021b\58\35\f\u0214"+ - "\u0215\f\t\2\2\u0215\u0216\t\f\2\2\u0216\u021b\58\35\n\u0217\u0218\f\b"+ - "\2\2\u0218\u0219\t\b\2\2\u0219\u021b\58\35\t\u021a\u020e\3\2\2\2\u021a"+ - "\u0211\3\2\2\2\u021a\u0214\3\2\2\2\u021a\u0217\3\2\2\2\u021b\u021e\3\2"+ - "\2\2\u021c\u021a\3\2\2\2\u021c\u021d\3\2\2\2\u021d9\3\2\2\2\u021e\u021c"+ - "\3\2\2\29DMRW^dkrx}\u0086\u008c\u0093\u0099\u00ab\u00ad\u00b2\u00b7\u00c4"+ - "\u00c9\u00d5\u00e3\u00e9\u00f1\u00fa\u0101\u0106\u010a\u010f\u0115\u0121"+ - "\u012b\u0132\u0138\u013a\u0155\u015f\u018b\u0195\u0197\u019f\u01a4\u01ae"+ - "\u01c0\u01c2\u01c7\u01cd\u01d3\u01d6\u01da\u01e2\u01fc\u020c\u021a\u021c"; + "\3\22\3\22\3\22\3\22\5\22\u018d\n\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ + "\3\22\7\22\u0197\n\22\f\22\16\22\u019a\13\22\3\23\3\23\3\23\7\23\u019f"+ + "\n\23\f\23\16\23\u01a2\13\23\3\24\3\24\5\24\u01a6\n\24\3\24\3\24\3\25"+ + "\3\25\3\25\3\25\7\25\u01ae\n\25\f\25\16\25\u01b1\13\25\3\25\3\25\3\26"+ + "\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u01c2"+ + "\n\26\5\26\u01c4\n\26\3\27\7\27\u01c7\n\27\f\27\16\27\u01ca\13\27\3\30"+ + "\3\30\3\30\5\30\u01cf\n\30\3\31\3\31\3\31\3\31\5\31\u01d5\n\31\3\31\5"+ + "\31\u01d8\n\31\3\32\3\32\5\32\u01dc\n\32\3\33\3\33\3\33\3\33\7\33\u01e2"+ + "\n\33\f\33\16\33\u01e5\13\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3"+ + "\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3"+ + "\34\5\34\u01fe\n\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+ + "\3\35\3\35\3\35\3\35\5\35\u020e\n\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+ + "\3\35\3\35\3\35\3\35\3\35\7\35\u021c\n\35\f\35\16\35\u021f\13\35\3\35"+ + "\2\5 \"8\36\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66"+ + "8\2\r\3\2\35\36\3\2\"#\3\2$(\3\2-.\3\2)*\4\2\37\37+,\3\2$%\3\2-\62\3\2"+ + "8A\4\2$%-.\4\2\37\37++\2\u0275\2:\3\2\2\2\4>\3\2\2\2\6D\3\2\2\2\bG\3\2"+ + "\2\2\nK\3\2\2\2\fR\3\2\2\2\16W\3\2\2\2\20k\3\2\2\2\22\u0081\3\2\2\2\24"+ + "\u0099\3\2\2\2\26\u00ad\3\2\2\2\30\u00b0\3\2\2\2\32\u0101\3\2\2\2\34\u0106"+ + "\3\2\2\2\36\u0122\3\2\2\2 \u012c\3\2\2\2\"\u0160\3\2\2\2$\u019b\3\2\2"+ + "\2&\u01a3\3\2\2\2(\u01a9\3\2\2\2*\u01c3\3\2\2\2,\u01c8\3\2\2\2.\u01ce"+ + "\3\2\2\2\60\u01d7\3\2\2\2\62\u01d9\3\2\2\2\64\u01dd\3\2\2\2\66\u01fd\3"+ + "\2\2\28\u020d\3\2\2\2:;\5\6\4\2;<\5\n\6\2<=\7\2\2\3=\3\3\2\2\2>?\5,\27"+ + "\2?@\7\2\2\3@\5\3\2\2\2AC\5\b\5\2BA\3\2\2\2CF\3\2\2\2DB\3\2\2\2DE\3\2"+ + "\2\2E\7\3\2\2\2FD\3\2\2\2GH\7\3\2\2HI\7O\2\2I\t\3\2\2\2JL\5\f\7\2KJ\3"+ + "\2\2\2LM\3\2\2\2MK\3\2\2\2MN\3\2\2\2N\13\3\2\2\2OS\5\16\b\2PS\5\20\t\2"+ + "QS\5&\24\2RO\3\2\2\2RP\3\2\2\2RQ\3\2\2\2S\r\3\2\2\2TV\5\26\f\2UT\3\2\2"+ + "\2VY\3\2\2\2WU\3\2\2\2WX\3\2\2\2XZ\3\2\2\2YW\3\2\2\2Z^\5 \21\2[]\5\26"+ + "\f\2\\[\3\2\2\2]`\3\2\2\2^\\\3\2\2\2^_\3\2\2\2_a\3\2\2\2`^\3\2\2\2ad\7"+ + "[\2\2bc\7\4\2\2ce\5\"\22\2db\3\2\2\2de\3\2\2\2ef\3\2\2\2fg\7\5\2\2g\17"+ + "\3\2\2\2hj\5\26\f\2ih\3\2\2\2jm\3\2\2\2ki\3\2\2\2kl\3\2\2\2ln\3\2\2\2"+ + "mk\3\2\2\2nr\5 \21\2oq\5\26\f\2po\3\2\2\2qt\3\2\2\2rp\3\2\2\2rs\3\2\2"+ + "\2su\3\2\2\2tr\3\2\2\2uv\7[\2\2vx\7\6\2\2wy\5\22\n\2xw\3\2\2\2xy\3\2\2"+ + "\2yz\3\2\2\2z{\7\7\2\2{}\7\b\2\2|~\5\30\r\2}|\3\2\2\2}~\3\2\2\2~\177\3"+ + "\2\2\2\177\u0080\7\t\2\2\u0080\21\3\2\2\2\u0081\u0086\5\24\13\2\u0082"+ + "\u0083\7\n\2\2\u0083\u0085\5\24\13\2\u0084\u0082\3\2\2\2\u0085\u0088\3"+ + "\2\2\2\u0086\u0084\3\2\2\2\u0086\u0087\3\2\2\2\u0087\23\3\2\2\2\u0088"+ + "\u0086\3\2\2\2\u0089\u008b\5\26\f\2\u008a\u0089\3\2\2\2\u008b\u008e\3"+ + "\2\2\2\u008c\u008a\3\2\2\2\u008c\u008d\3\2\2\2\u008d\u008f\3\2\2\2\u008e"+ + "\u008c\3\2\2\2\u008f\u0093\5 \21\2\u0090\u0092\5\26\f\2\u0091\u0090\3"+ + "\2\2\2\u0092\u0095\3\2\2\2\u0093\u0091\3\2\2\2\u0093\u0094\3\2\2\2\u0094"+ + "\u0096\3\2\2\2\u0095\u0093\3\2\2\2\u0096\u0097\7[\2\2\u0097\u009a\3\2"+ + "\2\2\u0098\u009a\7N\2\2\u0099\u008c\3\2\2\2\u0099\u0098\3\2\2\2\u009a"+ + "\25\3\2\2\2\u009b\u00ae\7\13\2\2\u009c\u00ae\7\f\2\2\u009d\u009e\7\r\2"+ + "\2\u009e\u009f\7\6\2\2\u009f\u00a0\7R\2\2\u00a0\u00ae\7\7\2\2\u00a1\u00a2"+ + "\7\16\2\2\u00a2\u00a3\7\6\2\2\u00a3\u00a4\7[\2\2\u00a4\u00ae\7\7\2\2\u00a5"+ + "\u00ae\7\17\2\2\u00a6\u00ae\7\20\2\2\u00a7\u00ab\7\21\2\2\u00a8\u00a9"+ + "\7\6\2\2\u00a9\u00aa\7[\2\2\u00aa\u00ac\7\7\2\2\u00ab\u00a8\3\2\2\2\u00ab"+ + "\u00ac\3\2\2\2\u00ac\u00ae\3\2\2\2\u00ad\u009b\3\2\2\2\u00ad\u009c\3\2"+ + "\2\2\u00ad\u009d\3\2\2\2\u00ad\u00a1\3\2\2\2\u00ad\u00a5\3\2\2\2\u00ad"+ + "\u00a6\3\2\2\2\u00ad\u00a7\3\2\2\2\u00ae\27\3\2\2\2\u00af\u00b1\5\32\16"+ + "\2\u00b0\u00af\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b0\3\2\2\2\u00b2\u00b3"+ + "\3\2\2\2\u00b3\31\3\2\2\2\u00b4\u0102\5\16\b\2\u00b5\u00b7\7\b\2\2\u00b6"+ + "\u00b8\5\30\r\2\u00b7\u00b6\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\u00b9\3"+ + "\2\2\2\u00b9\u0102\7\t\2\2\u00ba\u00bb\5\"\22\2\u00bb\u00bc\7\5\2\2\u00bc"+ + "\u0102\3\2\2\2\u00bd\u00be\7\22\2\2\u00be\u00bf\7\6\2\2\u00bf\u00c0\5"+ + "\"\22\2\u00c0\u00c1\7\7\2\2\u00c1\u00c4\5\32\16\2\u00c2\u00c3\7\23\2\2"+ + "\u00c3\u00c5\5\32\16\2\u00c4\u00c2\3\2\2\2\u00c4\u00c5\3\2\2\2\u00c5\u0102"+ + "\3\2\2\2\u00c6\u00c8\5\26\f\2\u00c7\u00c6\3\2\2\2\u00c8\u00cb\3\2\2\2"+ + "\u00c9\u00c7\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cc\3\2\2\2\u00cb\u00c9"+ + "\3\2\2\2\u00cc\u00cd\7\24\2\2\u00cd\u00ce\7\6\2\2\u00ce\u00cf\5\"\22\2"+ + "\u00cf\u00d0\7\7\2\2\u00d0\u00d1\5\32\16\2\u00d1\u0102\3\2\2\2\u00d2\u00d4"+ + "\5\26\f\2\u00d3\u00d2\3\2\2\2\u00d4\u00d7\3\2\2\2\u00d5\u00d3\3\2\2\2"+ + "\u00d5\u00d6\3\2\2\2\u00d6\u00d8\3\2\2\2\u00d7\u00d5\3\2\2\2\u00d8\u00d9"+ + "\7\25\2\2\u00d9\u00da\5\32\16\2\u00da\u00db\7\24\2\2\u00db\u00dc\7\6\2"+ + "\2\u00dc\u00dd\5\"\22\2\u00dd\u00de\7\7\2\2\u00de\u00df\7\5\2\2\u00df"+ + "\u0102\3\2\2\2\u00e0\u00e2\5\26\f\2\u00e1\u00e0\3\2\2\2\u00e2\u00e5\3"+ + "\2\2\2\u00e3\u00e1\3\2\2\2\u00e3\u00e4\3\2\2\2\u00e4\u00e6\3\2\2\2\u00e5"+ + "\u00e3\3\2\2\2\u00e6\u00e7\7\26\2\2\u00e7\u00e9\7\6\2\2\u00e8\u00ea\5"+ + "\34\17\2\u00e9\u00e8\3\2\2\2\u00e9\u00ea\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb"+ + "\u00ec\5\36\20\2\u00ec\u00ed\7\7\2\2\u00ed\u00ee\5\32\16\2\u00ee\u0102"+ + "\3\2\2\2\u00ef\u00f1\7\27\2\2\u00f0\u00f2\5\"\22\2\u00f1\u00f0\3\2\2\2"+ + "\u00f1\u00f2\3\2\2\2\u00f2\u00f3\3\2\2\2\u00f3\u0102\7\5\2\2\u00f4\u00f5"+ + "\7\30\2\2\u00f5\u0102\7\5\2\2\u00f6\u00f7\7\31\2\2\u00f7\u0102\7\5\2\2"+ + "\u00f8\u00fa\7\32\2\2\u00f9\u00fb\5(\25\2\u00fa\u00f9\3\2\2\2\u00fa\u00fb"+ + "\3\2\2\2\u00fb\u00fc\3\2\2\2\u00fc\u00fd\7\b\2\2\u00fd\u00fe\5,\27\2\u00fe"+ + "\u00ff\7\t\2\2\u00ff\u0102\3\2\2\2\u0100\u0102\5&\24\2\u0101\u00b4\3\2"+ + "\2\2\u0101\u00b5\3\2\2\2\u0101\u00ba\3\2\2\2\u0101\u00bd\3\2\2\2\u0101"+ + "\u00c9\3\2\2\2\u0101\u00d5\3\2\2\2\u0101\u00e3\3\2\2\2\u0101\u00ef\3\2"+ + "\2\2\u0101\u00f4\3\2\2\2\u0101\u00f6\3\2\2\2\u0101\u00f8\3\2\2\2\u0101"+ + "\u0100\3\2\2\2\u0102\33\3\2\2\2\u0103\u0105\5\26\f\2\u0104\u0103\3\2\2"+ + "\2\u0105\u0108\3\2\2\2\u0106\u0104\3\2\2\2\u0106\u0107\3\2\2\2\u0107\u010a"+ + "\3\2\2\2\u0108\u0106\3\2\2\2\u0109\u010b\5 \21\2\u010a\u0109\3\2\2\2\u010a"+ + "\u010b\3\2\2\2\u010b\u010f\3\2\2\2\u010c\u010e\5\26\f\2\u010d\u010c\3"+ + "\2\2\2\u010e\u0111\3\2\2\2\u010f\u010d\3\2\2\2\u010f\u0110\3\2\2\2\u0110"+ + "\u0112\3\2\2\2\u0111\u010f\3\2\2\2\u0112\u0115\7[\2\2\u0113\u0114\7\4"+ + "\2\2\u0114\u0116\5\"\22\2\u0115\u0113\3\2\2\2\u0115\u0116\3\2\2\2\u0116"+ + "\35\3\2\2\2\u0117\u0118\7\5\2\2\u0118\u0119\5\"\22\2\u0119\u011b\7\5\2"+ + "\2\u011a\u011c\5\"\22\2\u011b\u011a\3\2\2\2\u011b\u011c\3\2\2\2\u011c"+ + "\u0123\3\2\2\2\u011d\u011e\7\33\2\2\u011e\u011f\5\"\22\2\u011f\u0120\7"+ + "\34\2\2\u0120\u0121\5\"\22\2\u0121\u0123\3\2\2\2\u0122\u0117\3\2\2\2\u0122"+ + "\u011d\3\2\2\2\u0123\37\3\2\2\2\u0124\u0125\b\21\1\2\u0125\u0126\7\6\2"+ + "\2\u0126\u0127\5 \21\2\u0127\u0128\7\7\2\2\u0128\u012d\3\2\2\2\u0129\u012d"+ + "\7N\2\2\u012a\u012b\t\2\2\2\u012b\u012d\7N\2\2\u012c\u0124\3\2\2\2\u012c"+ + "\u0129\3\2\2\2\u012c\u012a\3\2\2\2\u012d\u013b\3\2\2\2\u012e\u012f\f\5"+ + "\2\2\u012f\u013a\7\37\2\2\u0130\u0131\f\4\2\2\u0131\u0133\7 \2\2\u0132"+ + "\u0134\5\"\22\2\u0133\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0135\3"+ + "\2\2\2\u0135\u013a\7!\2\2\u0136\u0137\f\3\2\2\u0137\u0138\7\6\2\2\u0138"+ + "\u013a\7\7\2\2\u0139\u012e\3\2\2\2\u0139\u0130\3\2\2\2\u0139\u0136\3\2"+ + "\2\2\u013a\u013d\3\2\2\2\u013b\u0139\3\2\2\2\u013b\u013c\3\2\2\2\u013c"+ + "!\3\2\2\2\u013d\u013b\3\2\2\2\u013e\u013f\b\22\1\2\u013f\u0140\7\6\2\2"+ + "\u0140\u0141\5\"\22\2\u0141\u0142\7\7\2\2\u0142\u0161\3\2\2\2\u0143\u0144"+ + "\7\6\2\2\u0144\u0145\5 \21\2\u0145\u0146\7\7\2\2\u0146\u0147\5\"\22\32"+ + "\u0147\u0161\3\2\2\2\u0148\u0149\t\3\2\2\u0149\u0161\5\"\22\31\u014a\u014b"+ + "\7\37\2\2\u014b\u0161\5\"\22\27\u014c\u014d\t\4\2\2\u014d\u0161\5\"\22"+ + "\26\u014e\u014f\t\5\2\2\u014f\u0161\5\"\22\22\u0150\u0151\7\b\2\2\u0151"+ + "\u0156\5\"\22\2\u0152\u0153\7\n\2\2\u0153\u0155\5\"\22\2\u0154\u0152\3"+ + "\2\2\2\u0155\u0158\3\2\2\2\u0156\u0154\3\2\2\2\u0156\u0157\3\2\2\2\u0157"+ + "\u0159\3\2\2\2\u0158\u0156\3\2\2\2\u0159\u015a\7\t\2\2\u015a\u0161\3\2"+ + "\2\2\u015b\u0161\7[\2\2\u015c\u0161\7R\2\2\u015d\u0161\7O\2\2\u015e\u0161"+ + "\7P\2\2\u015f\u0161\7Q\2\2\u0160\u013e\3\2\2\2\u0160\u0143\3\2\2\2\u0160"+ + "\u0148\3\2\2\2\u0160\u014a\3\2\2\2\u0160\u014c\3\2\2\2\u0160\u014e\3\2"+ + "\2\2\u0160\u0150\3\2\2\2\u0160\u015b\3\2\2\2\u0160\u015c\3\2\2\2\u0160"+ + "\u015d\3\2\2\2\u0160\u015e\3\2\2\2\u0160\u015f\3\2\2\2\u0161\u0198\3\2"+ + "\2\2\u0162\u0163\f\25\2\2\u0163\u0164\t\6\2\2\u0164\u0197\5\"\22\26\u0165"+ + "\u0166\f\24\2\2\u0166\u0167\t\7\2\2\u0167\u0197\5\"\22\25\u0168\u0169"+ + "\f\23\2\2\u0169\u016a\t\b\2\2\u016a\u0197\5\"\22\24\u016b\u016c\f\21\2"+ + "\2\u016c\u016d\t\t\2\2\u016d\u0197\5\"\22\22\u016e\u016f\f\20\2\2\u016f"+ + "\u0170\7\'\2\2\u0170\u0197\5\"\22\21\u0171\u0172\f\17\2\2\u0172\u0173"+ + "\7\63\2\2\u0173\u0197\5\"\22\20\u0174\u0175\f\16\2\2\u0175\u0176\7\64"+ + "\2\2\u0176\u0197\5\"\22\17\u0177\u0178\f\r\2\2\u0178\u0179\7\65\2\2\u0179"+ + "\u0197\5\"\22\16\u017a\u017b\f\f\2\2\u017b\u017c\7\66\2\2\u017c\u0197"+ + "\5\"\22\r\u017d\u017e\f\13\2\2\u017e\u017f\7\67\2\2\u017f\u0180\5\"\22"+ + "\2\u0180\u0181\7\33\2\2\u0181\u0182\5\"\22\f\u0182\u0197\3\2\2\2\u0183"+ + "\u0184\f\n\2\2\u0184\u0185\7\4\2\2\u0185\u0197\5\"\22\n\u0186\u0187\f"+ + "\t\2\2\u0187\u0188\t\n\2\2\u0188\u0197\5\"\22\t\u0189\u018a\f\34\2\2\u018a"+ + "\u018c\7\6\2\2\u018b\u018d\5$\23\2\u018c\u018b\3\2\2\2\u018c\u018d\3\2"+ + "\2\2\u018d\u018e\3\2\2\2\u018e\u0197\7\7\2\2\u018f\u0190\f\33\2\2\u0190"+ + "\u0191\7 \2\2\u0191\u0192\5\"\22\2\u0192\u0193\7!\2\2\u0193\u0197\3\2"+ + "\2\2\u0194\u0195\f\30\2\2\u0195\u0197\t\3\2\2\u0196\u0162\3\2\2\2\u0196"+ + "\u0165\3\2\2\2\u0196\u0168\3\2\2\2\u0196\u016b\3\2\2\2\u0196\u016e\3\2"+ + "\2\2\u0196\u0171\3\2\2\2\u0196\u0174\3\2\2\2\u0196\u0177\3\2\2\2\u0196"+ + "\u017a\3\2\2\2\u0196\u017d\3\2\2\2\u0196\u0183\3\2\2\2\u0196\u0186\3\2"+ + "\2\2\u0196\u0189\3\2\2\2\u0196\u018f\3\2\2\2\u0196\u0194\3\2\2\2\u0197"+ + "\u019a\3\2\2\2\u0198\u0196\3\2\2\2\u0198\u0199\3\2\2\2\u0199#\3\2\2\2"+ + "\u019a\u0198\3\2\2\2\u019b\u01a0\5\"\22\2\u019c\u019d\7\n\2\2\u019d\u019f"+ + "\5\"\22\2\u019e\u019c\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u019e\3\2\2\2"+ + "\u01a0\u01a1\3\2\2\2\u01a1%\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a3\u01a5\7"+ + "B\2\2\u01a4\u01a6\5(\25\2\u01a5\u01a4\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+ + "\u01a7\3\2\2\2\u01a7\u01a8\7M\2\2\u01a8\'\3\2\2\2\u01a9\u01aa\7\6\2\2"+ + "\u01aa\u01af\5*\26\2\u01ab\u01ac\7\n\2\2\u01ac\u01ae\5*\26\2\u01ad\u01ab"+ + "\3\2\2\2\u01ae\u01b1\3\2\2\2\u01af\u01ad\3\2\2\2\u01af\u01b0\3\2\2\2\u01b0"+ + "\u01b2\3\2\2\2\u01b1\u01af\3\2\2\2\u01b2\u01b3\7\7\2\2\u01b3)\3\2\2\2"+ + "\u01b4\u01b5\7C\2\2\u01b5\u01c4\7O\2\2\u01b6\u01b7\7D\2\2\u01b7\u01c4"+ + "\7[\2\2\u01b8\u01b9\7E\2\2\u01b9\u01c4\7O\2\2\u01ba\u01bb\7F\2\2\u01bb"+ + "\u01c4\5\"\22\2\u01bc\u01bd\7G\2\2\u01bd\u01c4\5\"\22\2\u01be\u01c1\7"+ + "H\2\2\u01bf\u01c2\7\17\2\2\u01c0\u01c2\5\"\22\2\u01c1\u01bf\3\2\2\2\u01c1"+ + "\u01c0\3\2\2\2\u01c2\u01c4\3\2\2\2\u01c3\u01b4\3\2\2\2\u01c3\u01b6\3\2"+ + "\2\2\u01c3\u01b8\3\2\2\2\u01c3\u01ba\3\2\2\2\u01c3\u01bc\3\2\2\2\u01c3"+ + "\u01be\3\2\2\2\u01c4+\3\2\2\2\u01c5\u01c7\5.\30\2\u01c6\u01c5\3\2\2\2"+ + "\u01c7\u01ca\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c8\u01c9\3\2\2\2\u01c9-\3"+ + "\2\2\2\u01ca\u01c8\3\2\2\2\u01cb\u01cf\5\60\31\2\u01cc\u01cf\5\62\32\2"+ + "\u01cd\u01cf\5\64\33\2\u01ce\u01cb\3\2\2\2\u01ce\u01cc\3\2\2\2\u01ce\u01cd"+ + "\3\2\2\2\u01cf/\3\2\2\2\u01d0\u01d1\7[\2\2\u01d1\u01d8\7\33\2\2\u01d2"+ + "\u01d4\7&\2\2\u01d3\u01d5\7[\2\2\u01d4\u01d3\3\2\2\2\u01d4\u01d5\3\2\2"+ + "\2\u01d5\u01d6\3\2\2\2\u01d6\u01d8\7\33\2\2\u01d7\u01d0\3\2\2\2\u01d7"+ + "\u01d2\3\2\2\2\u01d8\61\3\2\2\2\u01d9\u01db\7L\2\2\u01da\u01dc\5\66\34"+ + "\2\u01db\u01da\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc\63\3\2\2\2\u01dd\u01de"+ + "\7I\2\2\u01de\u01e3\58\35\2\u01df\u01e0\7\n\2\2\u01e0\u01e2\58\35\2\u01e1"+ + "\u01df\3\2\2\2\u01e2\u01e5\3\2\2\2\u01e3\u01e1\3\2\2\2\u01e3\u01e4\3\2"+ + "\2\2\u01e4\65\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e6\u01fe\58\35\2\u01e7\u01e8"+ + "\7J\2\2\u01e8\u01fe\58\35\2\u01e9\u01ea\58\35\2\u01ea\u01eb\7\n\2\2\u01eb"+ + "\u01ec\7[\2\2\u01ec\u01fe\3\2\2\2\u01ed\u01ee\7\6\2\2\u01ee\u01ef\58\35"+ + "\2\u01ef\u01f0\7\7\2\2\u01f0\u01f1\7\n\2\2\u01f1\u01f2\7[\2\2\u01f2\u01fe"+ + "\3\2\2\2\u01f3\u01f4\7\6\2\2\u01f4\u01f5\58\35\2\u01f5\u01f6\7\n\2\2\u01f6"+ + "\u01f7\7[\2\2\u01f7\u01f8\7\7\2\2\u01f8\u01fe\3\2\2\2\u01f9\u01fa\7\6"+ + "\2\2\u01fa\u01fb\58\35\2\u01fb\u01fc\7\7\2\2\u01fc\u01fe\3\2\2\2\u01fd"+ + "\u01e6\3\2\2\2\u01fd\u01e7\3\2\2\2\u01fd\u01e9\3\2\2\2\u01fd\u01ed\3\2"+ + "\2\2\u01fd\u01f3\3\2\2\2\u01fd\u01f9\3\2\2\2\u01fe\67\3\2\2\2\u01ff\u0200"+ + "\b\35\1\2\u0200\u0201\7 \2\2\u0201\u0202\58\35\2\u0202\u0203\7!\2\2\u0203"+ + "\u020e\3\2\2\2\u0204\u0205\t\13\2\2\u0205\u020e\58\35\n\u0206\u020e\7"+ + "[\2\2\u0207\u020e\7\\\2\2\u0208\u0209\7\b\2\2\u0209\u020a\7[\2\2\u020a"+ + "\u020e\7\t\2\2\u020b\u020e\7R\2\2\u020c\u020e\7P\2\2\u020d\u01ff\3\2\2"+ + "\2\u020d\u0204\3\2\2\2\u020d\u0206\3\2\2\2\u020d\u0207\3\2\2\2\u020d\u0208"+ + "\3\2\2\2\u020d\u020b\3\2\2\2\u020d\u020c\3\2\2\2\u020e\u021d\3\2\2\2\u020f"+ + "\u0210\f\f\2\2\u0210\u0211\7K\2\2\u0211\u021c\58\35\r\u0212\u0213\f\13"+ + "\2\2\u0213\u0214\t\6\2\2\u0214\u021c\58\35\f\u0215\u0216\f\t\2\2\u0216"+ + "\u0217\t\f\2\2\u0217\u021c\58\35\n\u0218\u0219\f\b\2\2\u0219\u021a\t\b"+ + "\2\2\u021a\u021c\58\35\t\u021b\u020f\3\2\2\2\u021b\u0212\3\2\2\2\u021b"+ + "\u0215\3\2\2\2\u021b\u0218\3\2\2\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2"+ + "\2\2\u021d\u021e\3\2\2\2\u021e9\3\2\2\2\u021f\u021d\3\2\2\2:DMRW^dkrx"+ + "}\u0086\u008c\u0093\u0099\u00ab\u00ad\u00b2\u00b7\u00c4\u00c9\u00d5\u00e3"+ + "\u00e9\u00f1\u00fa\u0101\u0106\u010a\u010f\u0115\u011b\u0122\u012c\u0133"+ + "\u0139\u013b\u0156\u0160\u018c\u0196\u0198\u01a0\u01a5\u01af\u01c1\u01c3"+ + "\u01c8\u01ce\u01d4\u01d7\u01db\u01e3\u01fd\u020d\u021b\u021d"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 5ab69e0e0..1cf51db80 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -37,6 +37,11 @@ public class TestPrograms { // compileAndCompare("pointer-cast-3"); //} + @Test + public void testForEmptyIncrement() throws IOException, URISyntaxException { + compileAndCompare("for-empty-increment"); + } + @Test public void testDivide2s() throws IOException, URISyntaxException { compileAndCompare("divide-2s"); diff --git a/src/test/kc/for-empty-increment.kc b/src/test/kc/for-empty-increment.kc new file mode 100644 index 000000000..54b939499 --- /dev/null +++ b/src/test/kc/for-empty-increment.kc @@ -0,0 +1,8 @@ +// Tests that for()-loops can have empty increments + +void main() { + const byte* SCREEN = $400; + for(unsigned char i=0;i<10;) { + SCREEN[i] = i++; + } +} \ No newline at end of file diff --git a/src/test/ref/for-empty-increment.asm b/src/test/ref/for-empty-increment.asm new file mode 100644 index 000000000..f0570c8be --- /dev/null +++ b/src/test/ref/for-empty-increment.asm @@ -0,0 +1,15 @@ +// Tests that for()-loops can have empty increments +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +main: { + .label SCREEN = $400 + ldx #0 + b1: + txa + sta SCREEN,x + inx + cpx #$a + bcc b1 + rts +} diff --git a/src/test/ref/for-empty-increment.cfg b/src/test/ref/for-empty-increment.cfg new file mode 100644 index 000000000..0dffafc27 --- /dev/null +++ b/src/test/ref/for-empty-increment.cfg @@ -0,0 +1,21 @@ +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() +main: scope:[main] from @1 + [4] phi() + to:main::@1 +main::@1: scope:[main] from main main::@1 + [5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::i#1 ) + [6] *((const byte*) main::SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 + [7] (byte) main::i#1 ← ++ (byte) main::i#2 + [8] if((byte) main::i#1<(byte/signed byte/word/signed word/dword/signed dword) $a) goto main::@1 + to:main::@return +main::@return: scope:[main] from main::@1 + [9] return + to:@return diff --git a/src/test/ref/for-empty-increment.log b/src/test/ref/for-empty-increment.log new file mode 100644 index 000000000..9ce151501 --- /dev/null +++ b/src/test/ref/for-empty-increment.log @@ -0,0 +1,306 @@ + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + to:@1 +main: scope:[main] from @1 + (byte*) main::SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) $400 + (byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0 + to:main::@1 +main::@1: scope:[main] from main main::@1 + (byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 ) + *((byte*) main::SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 + (byte) main::i#1 ← ++ (byte) main::i#2 + (bool~) main::$0 ← (byte) main::i#1 < (byte/signed byte/word/signed word/dword/signed dword) $a + if((bool~) main::$0) goto main::@1 + to:main::@return +main::@return: scope:[main] from main::@1 + return + to:@return +@1: scope:[] from @begin + call main + to:@2 +@2: scope:[] from @1 + to:@end +@end: scope:[] from @2 + +SYMBOL TABLE SSA +(label) @1 +(label) @2 +(label) @begin +(label) @end +(void()) main() +(bool~) main::$0 +(label) main::@1 +(label) main::@return +(byte*) main::SCREEN +(byte*) main::SCREEN#0 +(byte) main::i +(byte) main::i#0 +(byte) main::i#1 +(byte) main::i#2 + +Culled Empty Block (label) @2 +Successful SSA optimization Pass2CullEmptyBlocks +Simple Condition (bool~) main::$0 [6] if((byte) main::i#1<(byte/signed byte/word/signed word/dword/signed dword) $a) goto main::@1 +Successful SSA optimization Pass2ConditionalJumpSimplification +Constant (const byte*) main::SCREEN#0 = ((byte*))$400 +Constant (const byte) main::i#0 = 0 +Successful SSA optimization Pass2ConstantIdentification +Inlining constant with var siblings (const byte) main::i#0 +Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0 +Successful SSA optimization Pass2ConstantInlining +Added new block during phi lifting main::@3(between main::@1 and main::@1) +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @end +Adding NOP phi() at start of main +CALL GRAPH +Calls in [] to main:2 + +Created 1 initial phi equivalence classes +Coalesced [10] main::i#3 ← main::i#1 +Coalesced down to 1 phi equivalence classes +Culled Empty Block (label) main::@3 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @end +Adding NOP phi() at start of main + +FINAL CONTROL FLOW GRAPH +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() +main: scope:[main] from @1 + [4] phi() + to:main::@1 +main::@1: scope:[main] from main main::@1 + [5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::i#1 ) + [6] *((const byte*) main::SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 + [7] (byte) main::i#1 ← ++ (byte) main::i#2 + [8] if((byte) main::i#1<(byte/signed byte/word/signed word/dword/signed dword) $a) goto main::@1 + to:main::@return +main::@return: scope:[main] from main::@1 + [9] return + to:@return + + +VARIABLE REGISTER WEIGHTS +(void()) main() +(byte*) main::SCREEN +(byte) main::i +(byte) main::i#1 16.5 +(byte) main::i#2 22.0 + +Initial phi equivalence classes +[ main::i#2 main::i#1 ] +Complete equivalence classes +[ main::i#2 main::i#1 ] +Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ] + +INITIAL ASM +//SEG0 File Comments +// Tests that for()-loops can have empty increments +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main +//SEG7 [4] phi from @1 to main [phi:@1->main] +main_from_b1: + jsr main +//SEG8 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG9 @end +bend: +//SEG10 main +main: { + .label SCREEN = $400 + .label i = 2 + //SEG11 [5] phi from main to main::@1 [phi:main->main::@1] + b1_from_main: + //SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 + lda #0 + sta i + jmp b1 + //SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] + b1_from_b1: + //SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy + jmp b1 + //SEG15 main::@1 + b1: + //SEG16 [6] *((const byte*) main::SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 -- pbuc1_derefidx_vbuz1=vbuz1 + ldy i + tya + sta SCREEN,y + //SEG17 [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1 + inc i + //SEG18 [8] if((byte) main::i#1<(byte/signed byte/word/signed word/dword/signed dword) $a) goto main::@1 -- vbuz1_lt_vbuc1_then_la1 + lda i + cmp #$a + bcc b1_from_b1 + jmp breturn + //SEG19 main::@return + breturn: + //SEG20 [9] return + rts +} + +REGISTER UPLIFT POTENTIAL REGISTERS +Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y , + +REGISTER UPLIFT SCOPES +Uplift Scope [main] 38.5: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] +Uplift Scope [] + +Uplifting [main] best 263 combination reg byte x [ main::i#2 main::i#1 ] +Uplifting [] best 263 combination + +ASSEMBLER BEFORE OPTIMIZATION +//SEG0 File Comments +// Tests that for()-loops can have empty increments +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main +//SEG7 [4] phi from @1 to main [phi:@1->main] +main_from_b1: + jsr main +//SEG8 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG9 @end +bend: +//SEG10 main +main: { + .label SCREEN = $400 + //SEG11 [5] phi from main to main::@1 [phi:main->main::@1] + b1_from_main: + //SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 + ldx #0 + jmp b1 + //SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] + b1_from_b1: + //SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy + jmp b1 + //SEG15 main::@1 + b1: + //SEG16 [6] *((const byte*) main::SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 -- pbuc1_derefidx_vbuxx=vbuxx + txa + sta SCREEN,x + //SEG17 [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG18 [8] if((byte) main::i#1<(byte/signed byte/word/signed word/dword/signed dword) $a) goto main::@1 -- vbuxx_lt_vbuc1_then_la1 + cpx #$a + bcc b1_from_b1 + jmp breturn + //SEG19 main::@return + breturn: + //SEG20 [9] return + rts +} + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp b1 +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp breturn +Succesful ASM optimization Pass5NextJumpElimination +Replacing label b1_from_b1 with b1 +Removing instruction b1_from_bbegin: +Removing instruction b1: +Removing instruction main_from_b1: +Removing instruction bend_from_b1: +Removing instruction b1_from_b1: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction bend: +Removing instruction b1_from_main: +Removing instruction breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Updating BasicUpstart to call main directly +Removing instruction jsr main +Succesful ASM optimization Pass5SkipBegin +Removing instruction jmp b1 +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction bbegin: +Succesful ASM optimization Pass5UnusedLabelElimination + +FINAL SYMBOL TABLE +(label) @1 +(label) @begin +(label) @end +(void()) main() +(label) main::@1 +(label) main::@return +(byte*) main::SCREEN +(const byte*) main::SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) $400 +(byte) main::i +(byte) main::i#1 reg byte x 16.5 +(byte) main::i#2 reg byte x 22.0 + +reg byte x [ main::i#2 main::i#1 ] + + +FINAL ASSEMBLER +Score: 161 + +//SEG0 File Comments +// Tests that for()-loops can have empty increments +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +//SEG2 Global Constants & labels +//SEG3 @begin +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +//SEG5 @1 +//SEG6 [2] call main +//SEG7 [4] phi from @1 to main [phi:@1->main] +//SEG8 [3] phi from @1 to @end [phi:@1->@end] +//SEG9 @end +//SEG10 main +main: { + .label SCREEN = $400 + //SEG11 [5] phi from main to main::@1 [phi:main->main::@1] + //SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 + ldx #0 + //SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] + //SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy + //SEG15 main::@1 + b1: + //SEG16 [6] *((const byte*) main::SCREEN#0 + (byte) main::i#2) ← (byte) main::i#2 -- pbuc1_derefidx_vbuxx=vbuxx + txa + sta SCREEN,x + //SEG17 [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG18 [8] if((byte) main::i#1<(byte/signed byte/word/signed word/dword/signed dword) $a) goto main::@1 -- vbuxx_lt_vbuc1_then_la1 + cpx #$a + bcc b1 + //SEG19 main::@return + //SEG20 [9] return + rts +} + diff --git a/src/test/ref/for-empty-increment.sym b/src/test/ref/for-empty-increment.sym new file mode 100644 index 000000000..33144f5d6 --- /dev/null +++ b/src/test/ref/for-empty-increment.sym @@ -0,0 +1,13 @@ +(label) @1 +(label) @begin +(label) @end +(void()) main() +(label) main::@1 +(label) main::@return +(byte*) main::SCREEN +(const byte*) main::SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) $400 +(byte) main::i +(byte) main::i#1 reg byte x 16.5 +(byte) main::i#2 reg byte x 22.0 + +reg byte x [ main::i#2 main::i#1 ]