diff --git a/compiler/res/prog8lib/c64flt.p8 b/compiler/res/prog8lib/c64flt.p8 index 481179337..1914ec08e 100644 --- a/compiler/res/prog8lib/c64flt.p8 +++ b/compiler/res/prog8lib/c64flt.p8 @@ -41,25 +41,25 @@ ; note: for subtraction and division, the left operand is in fac2, the right operand in fac1. ; checked functions below: -asmsub MOVFM (uword mflpt @ AY) -> clobbers(A,Y) -> () = $bba2 ; load mflpt value from memory in A/Y into fac1 -asmsub FREADMEM () -> clobbers(A,Y) -> () = $bba6 ; load mflpt value from memory in $22/$23 into fac1 -asmsub CONUPK (uword mflpt @ AY) -> clobbers(A,Y) -> () = $ba8c ; load mflpt value from memory in A/Y into fac2 -asmsub FAREADMEM () -> clobbers(A,Y) -> () = $ba90 ; load mflpt value from memory in $22/$23 into fac2 -asmsub MOVFA () -> clobbers(A,X) -> () = $bbfc ; copy fac2 to fac1 -asmsub MOVAF () -> clobbers(A,X) -> () = $bc0c ; copy fac1 to fac2 (rounded) -asmsub MOVEF () -> clobbers(A,X) -> () = $bc0f ; copy fac1 to fac2 -asmsub MOVMF (uword mflpt @ XY) -> clobbers(A,Y) -> () = $bbd4 ; store fac1 to memory X/Y as 5-byte mflpt +asmsub MOVFM (uword mflpt @ AY) clobbers(A,Y) = $bba2 ; load mflpt value from memory in A/Y into fac1 +asmsub FREADMEM () clobbers(A,Y) = $bba6 ; load mflpt value from memory in $22/$23 into fac1 +asmsub CONUPK (uword mflpt @ AY) clobbers(A,Y) = $ba8c ; load mflpt value from memory in A/Y into fac2 +asmsub FAREADMEM () clobbers(A,Y) = $ba90 ; load mflpt value from memory in $22/$23 into fac2 +asmsub MOVFA () clobbers(A,X) = $bbfc ; copy fac2 to fac1 +asmsub MOVAF () clobbers(A,X) = $bc0c ; copy fac1 to fac2 (rounded) +asmsub MOVEF () clobbers(A,X) = $bc0f ; copy fac1 to fac2 +asmsub MOVMF (uword mflpt @ XY) clobbers(A,Y) = $bbd4 ; store fac1 to memory X/Y as 5-byte mflpt ; fac1-> signed word in Y/A (might throw ILLEGAL QUANTITY) ; (tip: use c64flt.FTOSWRDAY to get A/Y output; lo/hi switched to normal little endian order) -asmsub FTOSWORDYA () -> clobbers(X) -> (ubyte @ Y, ubyte @ A) = $b1aa +asmsub FTOSWORDYA () clobbers(X) -> (ubyte @ Y, ubyte @ A) = $b1aa ; fac1 -> unsigned word in Y/A (might throw ILLEGAL QUANTITY) (result also in $14/15) ; (tip: use c64flt.GETADRAY to get A/Y output; lo/hi switched to normal little endian order) -asmsub GETADR () -> clobbers(X) -> (ubyte @ Y, ubyte @ A) = $b7f7 +asmsub GETADR () clobbers(X) -> (ubyte @ Y, ubyte @ A) = $b7f7 -asmsub QINT () -> clobbers(A,X,Y) -> () = $bc9b ; fac1 -> 4-byte signed integer in 98-101 ($62-$65), with the MSB FIRST. -asmsub AYINT () -> clobbers(A,X,Y) -> () = $b1bf ; fac1-> signed word in 100-101 ($64-$65) MSB FIRST. (might throw ILLEGAL QUANTITY) +asmsub QINT () clobbers(A,X,Y) = $bc9b ; fac1 -> 4-byte signed integer in 98-101 ($62-$65), with the MSB FIRST. +asmsub AYINT () clobbers(A,X,Y) = $b1bf ; fac1-> signed word in 100-101 ($64-$65) MSB FIRST. (might throw ILLEGAL QUANTITY) ; GIVAYF: signed word in Y/A (note different lsb/msb order) -> float in fac1 ; (tip: use c64flt.GIVAYFAY to use A/Y input; lo/hi switched to normal order) @@ -67,50 +67,50 @@ asmsub AYINT () -> clobbers(A,X,Y) -> () = $b1bf ; fac1-> signed word in 100 ; there is also c64flt.FREADS32 that reads from 98-101 ($62-$65) MSB FIRST ; there is also c64flt.FREADUS32 that reads from 98-101 ($62-$65) MSB FIRST ; there is also c64flt.FREADS24AXY that reads signed int24 into fac1 from A/X/Y (lo/mid/hi bytes) -asmsub GIVAYF (ubyte lo @ Y, ubyte hi @ A) -> clobbers(A,X,Y) -> () = $b391 +asmsub GIVAYF (ubyte lo @ Y, ubyte hi @ A) clobbers(A,X,Y) = $b391 -asmsub FREADUY (ubyte value @ Y) -> clobbers(A,X,Y) -> () = $b3a2 ; 8 bit unsigned Y -> float in fac1 -asmsub FREADSA (byte value @ A) -> clobbers(A,X,Y) -> () = $bc3c ; 8 bit signed A -> float in fac1 -asmsub FREADSTR (ubyte length @ A) -> clobbers(A,X,Y) -> () = $b7b5 ; str -> fac1, $22/23 must point to string, A=string length -asmsub FPRINTLN () -> clobbers(A,X,Y) -> () = $aabc ; print string of fac1, on one line (= with newline) destroys fac1. (consider FOUT + STROUT as well) -asmsub FOUT () -> clobbers(X) -> (uword @ AY) = $bddd ; fac1 -> string, address returned in AY ($0100) +asmsub FREADUY (ubyte value @ Y) clobbers(A,X,Y) = $b3a2 ; 8 bit unsigned Y -> float in fac1 +asmsub FREADSA (byte value @ A) clobbers(A,X,Y) = $bc3c ; 8 bit signed A -> float in fac1 +asmsub FREADSTR (ubyte length @ A) clobbers(A,X,Y) = $b7b5 ; str -> fac1, $22/23 must point to string, A=string length +asmsub FPRINTLN () clobbers(A,X,Y) = $aabc ; print string of fac1, on one line (= with newline) destroys fac1. (consider FOUT + STROUT as well) +asmsub FOUT () clobbers(X) -> (uword @ AY) = $bddd ; fac1 -> string, address returned in AY ($0100) -asmsub FADDH () -> clobbers(A,X,Y) -> () = $b849 ; fac1 += 0.5, for rounding- call this before INT -asmsub MUL10 () -> clobbers(A,X,Y) -> () = $bae2 ; fac1 *= 10 -asmsub DIV10 () -> clobbers(A,X,Y) -> () = $bafe ; fac1 /= 10 , CAUTION: result is always positive! -asmsub FCOMP (uword mflpt @ AY) -> clobbers(X,Y) -> (ubyte @ A) = $bc5b ; A = compare fac1 to mflpt in A/Y, 0=equal 1=fac1 is greater, 255=fac1 is less than +asmsub FADDH () clobbers(A,X,Y) = $b849 ; fac1 += 0.5, for rounding- call this before INT +asmsub MUL10 () clobbers(A,X,Y) = $bae2 ; fac1 *= 10 +asmsub DIV10 () clobbers(A,X,Y) = $bafe ; fac1 /= 10 , CAUTION: result is always positive! +asmsub FCOMP (uword mflpt @ AY) clobbers(X,Y) -> (ubyte @ A) = $bc5b ; A = compare fac1 to mflpt in A/Y, 0=equal 1=fac1 is greater, 255=fac1 is less than -asmsub FADDT () -> clobbers(A,X,Y) -> () = $b86a ; fac1 += fac2 -asmsub FADD (uword mflpt @ AY) -> clobbers(A,X,Y) -> () = $b867 ; fac1 += mflpt value from A/Y -asmsub FSUBT () -> clobbers(A,X,Y) -> () = $b853 ; fac1 = fac2-fac1 mind the order of the operands -asmsub FSUB (uword mflpt @ AY) -> clobbers(A,X,Y) -> () = $b850 ; fac1 = mflpt from A/Y - fac1 -asmsub FMULTT () -> clobbers(A,X,Y) -> () = $ba2b ; fac1 *= fac2 -asmsub FMULT (uword mflpt @ AY) -> clobbers(A,X,Y) -> () = $ba28 ; fac1 *= mflpt value from A/Y -asmsub FDIVT () -> clobbers(A,X,Y) -> () = $bb12 ; fac1 = fac2/fac1 (remainder in fac2) mind the order of the operands -asmsub FDIV (uword mflpt @ AY) -> clobbers(A,X,Y) -> () = $bb0f ; fac1 = mflpt in A/Y / fac1 (remainder in fac2) -asmsub FPWRT () -> clobbers(A,X,Y) -> () = $bf7b ; fac1 = fac2 ** fac1 -asmsub FPWR (uword mflpt @ AY) -> clobbers(A,X,Y) -> () = $bf78 ; fac1 = fac2 ** mflpt from A/Y +asmsub FADDT () clobbers(A,X,Y) = $b86a ; fac1 += fac2 +asmsub FADD (uword mflpt @ AY) clobbers(A,X,Y) = $b867 ; fac1 += mflpt value from A/Y +asmsub FSUBT () clobbers(A,X,Y) = $b853 ; fac1 = fac2-fac1 mind the order of the operands +asmsub FSUB (uword mflpt @ AY) clobbers(A,X,Y) = $b850 ; fac1 = mflpt from A/Y - fac1 +asmsub FMULTT () clobbers(A,X,Y) = $ba2b ; fac1 *= fac2 +asmsub FMULT (uword mflpt @ AY) clobbers(A,X,Y) = $ba28 ; fac1 *= mflpt value from A/Y +asmsub FDIVT () clobbers(A,X,Y) = $bb12 ; fac1 = fac2/fac1 (remainder in fac2) mind the order of the operands +asmsub FDIV (uword mflpt @ AY) clobbers(A,X,Y) = $bb0f ; fac1 = mflpt in A/Y / fac1 (remainder in fac2) +asmsub FPWRT () clobbers(A,X,Y) = $bf7b ; fac1 = fac2 ** fac1 +asmsub FPWR (uword mflpt @ AY) clobbers(A,X,Y) = $bf78 ; fac1 = fac2 ** mflpt from A/Y -asmsub NOTOP () -> clobbers(A,X,Y) -> () = $aed4 ; fac1 = NOT(fac1) -asmsub INT () -> clobbers(A,X,Y) -> () = $bccc ; INT() truncates, use FADDH first to round instead of trunc -asmsub LOG () -> clobbers(A,X,Y) -> () = $b9ea ; fac1 = LN(fac1) (natural log) -asmsub SGN () -> clobbers(A,X,Y) -> () = $bc39 ; fac1 = SGN(fac1), result of SIGN (-1, 0 or 1) -asmsub SIGN () -> clobbers() -> (ubyte @ A) = $bc2b ; SIGN(fac1) to A, $ff, $0, $1 for negative, zero, positive -asmsub ABS () -> clobbers() -> () = $bc58 ; fac1 = ABS(fac1) -asmsub SQR () -> clobbers(A,X,Y) -> () = $bf71 ; fac1 = SQRT(fac1) -asmsub SQRA () -> clobbers(A,X,Y) -> () = $bf74 ; fac1 = SQRT(fac2) -asmsub EXP () -> clobbers(A,X,Y) -> () = $bfed ; fac1 = EXP(fac1) (e ** fac1) -asmsub NEGOP () -> clobbers(A) -> () = $bfb4 ; switch the sign of fac1 -asmsub RND () -> clobbers(A,X,Y) -> () = $e097 ; fac1 = RND(fac1) float random number generator -asmsub COS () -> clobbers(A,X,Y) -> () = $e264 ; fac1 = COS(fac1) -asmsub SIN () -> clobbers(A,X,Y) -> () = $e26b ; fac1 = SIN(fac1) -asmsub TAN () -> clobbers(A,X,Y) -> () = $e2b4 ; fac1 = TAN(fac1) -asmsub ATN () -> clobbers(A,X,Y) -> () = $e30e ; fac1 = ATN(fac1) +asmsub NOTOP () clobbers(A,X,Y) = $aed4 ; fac1 = NOT(fac1) +asmsub INT () clobbers(A,X,Y) = $bccc ; INT() truncates, use FADDH first to round instead of trunc +asmsub LOG () clobbers(A,X,Y) = $b9ea ; fac1 = LN(fac1) (natural log) +asmsub SGN () clobbers(A,X,Y) = $bc39 ; fac1 = SGN(fac1), result of SIGN (-1, 0 or 1) +asmsub SIGN () -> (ubyte @ A) = $bc2b ; SIGN(fac1) to A, $ff, $0, $1 for negative, zero, positive +asmsub ABS () = $bc58 ; fac1 = ABS(fac1) +asmsub SQR () clobbers(A,X,Y) = $bf71 ; fac1 = SQRT(fac1) +asmsub SQRA () clobbers(A,X,Y) = $bf74 ; fac1 = SQRT(fac2) +asmsub EXP () clobbers(A,X,Y) = $bfed ; fac1 = EXP(fac1) (e ** fac1) +asmsub NEGOP () clobbers(A) = $bfb4 ; switch the sign of fac1 +asmsub RND () clobbers(A,X,Y) = $e097 ; fac1 = RND(fac1) float random number generator +asmsub COS () clobbers(A,X,Y) = $e264 ; fac1 = COS(fac1) +asmsub SIN () clobbers(A,X,Y) = $e26b ; fac1 = SIN(fac1) +asmsub TAN () clobbers(A,X,Y) = $e2b4 ; fac1 = TAN(fac1) +asmsub ATN () clobbers(A,X,Y) = $e30e ; fac1 = ATN(fac1) -asmsub FREADS32 () -> clobbers(A,X,Y) -> () { +asmsub FREADS32 () clobbers(A,X,Y) { ; ---- fac1 = signed int32 from $62-$65 big endian (MSB FIRST) %asm {{ lda $62 @@ -122,7 +122,7 @@ asmsub FREADS32 () -> clobbers(A,X,Y) -> () { }} } -asmsub FREADUS32 () -> clobbers(A,X,Y) -> () { +asmsub FREADUS32 () clobbers(A,X,Y) { ; ---- fac1 = uint32 from $62-$65 big endian (MSB FIRST) %asm {{ sec @@ -132,7 +132,7 @@ asmsub FREADUS32 () -> clobbers(A,X,Y) -> () { }} } -asmsub FREADS24AXY (ubyte lo @ A, ubyte mid @ X, ubyte hi @ Y) -> clobbers(A,X,Y) -> () { +asmsub FREADS24AXY (ubyte lo @ A, ubyte mid @ X, ubyte hi @ Y) clobbers(A,X,Y) { ; ---- fac1 = signed int24 (A/X/Y contain lo/mid/hi bytes) ; note: there is no FREADU24AXY (unsigned), use FREADUS32 instead. %asm {{ @@ -149,7 +149,7 @@ asmsub FREADS24AXY (ubyte lo @ A, ubyte mid @ X, ubyte hi @ Y) -> clobbers(A,X }} } -asmsub GIVUAYFAY (uword value @ AY) -> clobbers(A,X,Y) -> () { +asmsub GIVUAYFAY (uword value @ AY) clobbers(A,X,Y) { ; ---- unsigned 16 bit word in A/Y (lo/hi) to fac1 %asm {{ sty $62 @@ -160,7 +160,7 @@ asmsub GIVUAYFAY (uword value @ AY) -> clobbers(A,X,Y) -> () { }} } -asmsub GIVAYFAY (uword value @ AY) -> clobbers(A,X,Y) -> () { +asmsub GIVAYFAY (uword value @ AY) clobbers(A,X,Y) { ; ---- signed 16 bit word in A/Y (lo/hi) to float in fac1 %asm {{ sta c64.SCRATCH_ZPREG @@ -170,7 +170,7 @@ asmsub GIVAYFAY (uword value @ AY) -> clobbers(A,X,Y) -> () { }} } -asmsub FTOSWRDAY () -> clobbers(X) -> (uword @ AY) { +asmsub FTOSWRDAY () clobbers(X) -> (uword @ AY) { ; ---- fac1 to signed word in A/Y %asm {{ jsr FTOSWORDYA ; note the inverse Y/A order @@ -181,7 +181,7 @@ asmsub FTOSWRDAY () -> clobbers(X) -> (uword @ AY) { }} } -asmsub GETADRAY () -> clobbers(X) -> (uword @ AY) { +asmsub GETADRAY () clobbers(X) -> (uword @ AY) { ; ---- fac1 to unsigned word in A/Y %asm {{ jsr GETADR ; this uses the inverse order, Y/A diff --git a/compiler/res/prog8lib/c64lib.p8 b/compiler/res/prog8lib/c64lib.p8 index 8ac524e22..8eff0f556 100644 --- a/compiler/res/prog8lib/c64lib.p8 +++ b/compiler/res/prog8lib/c64lib.p8 @@ -63,8 +63,8 @@ &ubyte SP6Y = $d00d &ubyte SP7X = $d00e &ubyte SP7Y = $d00f - &ubyte[16] SPXY = $d000 ; the 8 sprite X and Y registers as an array. - &uword[8] SPXYW = $d000 ; the 8 sprite X and Y registers as a combined xy word array. + &ubyte[16] SPXY = $d000 ; the 8 sprite X and Y registers as an array. + &uword[8] SPXYW = $d000 ; the 8 sprite X and Y registers as a combined xy word array. &ubyte MSIGX = $d010 &ubyte SCROLY = $d011 @@ -76,7 +76,7 @@ &ubyte YXPAND = $d017 &ubyte VMCSB = $d018 &ubyte VICIRQ = $d019 - &ubyte IREQMASK = $d01a + &ubyte IREQMASK = $d01a &ubyte SPBGPR = $d01b &ubyte SPMC = $d01c &ubyte XXPAND = $d01d @@ -98,7 +98,7 @@ &ubyte SP5COL = $d02c &ubyte SP6COL = $d02d &ubyte SP7COL = $d02e - &ubyte[8] SPCOL = $d027 + &ubyte[8] SPCOL = $d027 ; ---- end of VIC-II registers ---- @@ -107,8 +107,8 @@ &ubyte CIA1PRA = $DC00 ; CIA 1 DRA, keyboard column drive (and joystick control port #2) &ubyte CIA1PRB = $DC01 ; CIA 1 DRB, keyboard row port (and joystick control port #1) - &ubyte CIA1DDRA = $DC02 ; CIA 1 DDRA, keyboard column - &ubyte CIA1DDRB = $DC03 ; CIA 1 DDRB, keyboard row + &ubyte CIA1DDRA = $DC02 ; CIA 1 DDRA, keyboard column + &ubyte CIA1DDRB = $DC03 ; CIA 1 DDRB, keyboard row &ubyte CIA1TAL = $DC04 ; CIA 1 timer A low byte &ubyte CIA1TAH = $DC05 ; CIA 1 timer A high byte &ubyte CIA1TBL = $DC06 ; CIA 1 timer B low byte @@ -124,8 +124,8 @@ &ubyte CIA2PRA = $DD00 ; CIA 2 DRA, serial port and video address &ubyte CIA2PRB = $DD01 ; CIA 2 DRB, RS232 port / USERPORT - &ubyte CIA2DDRA = $DD02 ; CIA 2 DDRA, serial port and video address - &ubyte CIA2DDRB = $DD03 ; CIA 2 DDRB, RS232 port / USERPORT + &ubyte CIA2DDRA = $DD02 ; CIA 2 DDRA, serial port and video address + &ubyte CIA2DDRB = $DD03 ; CIA 2 DDRB, RS232 port / USERPORT &ubyte CIA2TAL = $DD04 ; CIA 2 timer A low byte &ubyte CIA2TAH = $DD05 ; CIA 2 timer A high byte &ubyte CIA2TBL = $DD06 ; CIA 2 timer B low byte @@ -186,8 +186,8 @@ ; ---- C64 basic routines ---- -asmsub CLEARSCR () -> clobbers(A,X,Y) -> () = $E544 ; clear the screen -asmsub HOMECRSR () -> clobbers(A,X,Y) -> () = $E566 ; cursor to top left of screen +asmsub CLEARSCR () clobbers(A,X,Y) = $E544 ; clear the screen +asmsub HOMECRSR () clobbers(A,X,Y) = $E566 ; cursor to top left of screen ; ---- end of C64 basic routines ---- @@ -195,48 +195,48 @@ asmsub HOMECRSR () -> clobbers(A,X,Y) -> () = $E566 ; cursor to top left of sc ; ---- C64 kernal routines ---- -asmsub STROUT (uword strptr @ AY) -> clobbers(A, X, Y) -> () = $AB1E ; print null-terminated string (use c64scr.print instead) -asmsub IRQDFRT () -> clobbers(A,X,Y) -> () = $EA31 ; default IRQ routine -asmsub IRQDFEND () -> clobbers(A,X,Y) -> () = $EA81 ; default IRQ end/cleanup -asmsub CINT () -> clobbers(A,X,Y) -> () = $FF81 ; (alias: SCINIT) initialize screen editor and video chip -asmsub IOINIT () -> clobbers(A, X) -> () = $FF84 ; initialize I/O devices (CIA, SID, IRQ) -asmsub RAMTAS () -> clobbers(A,X,Y) -> () = $FF87 ; initialize RAM, tape buffer, screen -asmsub RESTOR () -> clobbers(A,X,Y) -> () = $FF8A ; restore default I/O vectors -asmsub VECTOR (ubyte dir @ Pc, uword userptr @ XY) -> clobbers(A,Y) -> () = $FF8D ; read/set I/O vector table -asmsub SETMSG (ubyte value @ A) -> clobbers() -> () = $FF90 ; set Kernal message control flag -asmsub SECOND (ubyte address @ A) -> clobbers(A) -> () = $FF93 ; (alias: LSTNSA) send secondary address after LISTEN -asmsub TKSA (ubyte address @ A) -> clobbers(A) -> () = $FF96 ; (alias: TALKSA) send secondary address after TALK -asmsub MEMTOP (ubyte dir @ Pc, uword address @ XY) -> clobbers() -> (uword @ XY) = $FF99 ; read/set top of memory pointer -asmsub MEMBOT (ubyte dir @ Pc, uword address @ XY) -> clobbers() -> (uword @ XY) = $FF9C ; read/set bottom of memory pointer -asmsub SCNKEY () -> clobbers(A,X,Y) -> () = $FF9F ; scan the keyboard -asmsub SETTMO (ubyte timeout @ A) -> clobbers() -> () = $FFA2 ; set time-out flag for IEEE bus -asmsub ACPTR () -> clobbers() -> (ubyte @ A) = $FFA5 ; (alias: IECIN) input byte from serial bus -asmsub CIOUT (ubyte databyte @ A) -> clobbers() -> () = $FFA8 ; (alias: IECOUT) output byte to serial bus -asmsub UNTLK () -> clobbers(A) -> () = $FFAB ; command serial bus device to UNTALK -asmsub UNLSN () -> clobbers(A) -> () = $FFAE ; command serial bus device to UNLISTEN -asmsub LISTEN (ubyte device @ A) -> clobbers(A) -> () = $FFB1 ; command serial bus device to LISTEN -asmsub TALK (ubyte device @ A) -> clobbers(A) -> () = $FFB4 ; command serial bus device to TALK -asmsub READST () -> clobbers() -> (ubyte @ A) = $FFB7 ; read I/O status word -asmsub SETLFS (ubyte logical @ A, ubyte device @ X, ubyte address @ Y) -> clobbers() -> () = $FFBA ; set logical file parameters -asmsub SETNAM (ubyte namelen @ A, str filename @ XY) -> clobbers() -> () = $FFBD ; set filename parameters -asmsub OPEN () -> clobbers(A,X,Y) -> () = $FFC0 ; (via 794 ($31A)) open a logical file -asmsub CLOSE (ubyte logical @ A) -> clobbers(A,X,Y) -> () = $FFC3 ; (via 796 ($31C)) close a logical file -asmsub CHKIN (ubyte logical @ X) -> clobbers(A,X) -> () = $FFC6 ; (via 798 ($31E)) define an input channel -asmsub CHKOUT (ubyte logical @ X) -> clobbers(A,X) -> () = $FFC9 ; (via 800 ($320)) define an output channel -asmsub CLRCHN () -> clobbers(A,X) -> () = $FFCC ; (via 802 ($322)) restore default devices -asmsub CHRIN () -> clobbers(Y) -> (ubyte @ A) = $FFCF ; (via 804 ($324)) input a character (for keyboard, read a whole line from the screen) A=byte read. -asmsub CHROUT (ubyte char @ A) -> clobbers() -> () = $FFD2 ; (via 806 ($326)) output a character -asmsub LOAD (ubyte verify @ A, uword address @ XY) -> clobbers() -> (ubyte @Pc, ubyte @ A, ubyte @ X, ubyte @ Y) = $FFD5 ; (via 816 ($330)) load from device -asmsub SAVE (ubyte zp_startaddr @ A, uword endaddr @ XY) -> clobbers() -> (ubyte @ Pc, ubyte @ A) = $FFD8 ; (via 818 ($332)) save to a device -asmsub SETTIM (ubyte low @ A, ubyte middle @ X, ubyte high @ Y) -> clobbers() -> () = $FFDB ; set the software clock -asmsub RDTIM () -> clobbers() -> (ubyte @ A, ubyte @ X, ubyte @ Y) = $FFDE ; read the software clock -asmsub STOP () -> clobbers(A,X) -> (ubyte @ Pz, ubyte @ Pc) = $FFE1 ; (via 808 ($328)) check the STOP key -asmsub GETIN () -> clobbers(X,Y) -> (ubyte @ A) = $FFE4 ; (via 810 ($32A)) get a character -asmsub CLALL () -> clobbers(A,X) -> () = $FFE7 ; (via 812 ($32C)) close all files -asmsub UDTIM () -> clobbers(A,X) -> () = $FFEA ; update the software clock -asmsub SCREEN () -> clobbers() -> (ubyte @ X, ubyte @ Y) = $FFED ; read number of screen rows and columns -asmsub PLOT (ubyte dir @ Pc, ubyte col @ Y, ubyte row @ X) -> clobbers() -> (ubyte @ X, ubyte @ Y) = $FFF0 ; read/set position of cursor on screen. Use c64scr.plot for a 'safe' wrapper that preserves X. -asmsub IOBASE () -> clobbers() -> (uword @ XY) = $FFF3 ; read base address of I/O devices +asmsub STROUT (uword strptr @ AY) clobbers(A, X, Y) = $AB1E ; print null-terminated string (use c64scr.print instead) +asmsub IRQDFRT () clobbers(A,X,Y) = $EA31 ; default IRQ routine +asmsub IRQDFEND () clobbers(A,X,Y) = $EA81 ; default IRQ end/cleanup +asmsub CINT () clobbers(A,X,Y) = $FF81 ; (alias: SCINIT) initialize screen editor and video chip +asmsub IOINIT () clobbers(A, X) = $FF84 ; initialize I/O devices (CIA, SID, IRQ) +asmsub RAMTAS () clobbers(A,X,Y) = $FF87 ; initialize RAM, tape buffer, screen +asmsub RESTOR () clobbers(A,X,Y) = $FF8A ; restore default I/O vectors +asmsub VECTOR (ubyte dir @ Pc, uword userptr @ XY) clobbers(A,Y) = $FF8D ; read/set I/O vector table +asmsub SETMSG (ubyte value @ A) = $FF90 ; set Kernal message control flag +asmsub SECOND (ubyte address @ A) clobbers(A) = $FF93 ; (alias: LSTNSA) send secondary address after LISTEN +asmsub TKSA (ubyte address @ A) clobbers(A) = $FF96 ; (alias: TALKSA) send secondary address after TALK +asmsub MEMTOP (ubyte dir @ Pc, uword address @ XY) -> uword @ XY = $FF99 ; read/set top of memory pointer +asmsub MEMBOT (ubyte dir @ Pc, uword address @ XY) -> uword @ XY = $FF9C ; read/set bottom of memory pointer +asmsub SCNKEY () clobbers(A,X,Y) = $FF9F ; scan the keyboard +asmsub SETTMO (ubyte timeout @ A) = $FFA2 ; set time-out flag for IEEE bus +asmsub ACPTR () -> ubyte @ A = $FFA5 ; (alias: IECIN) input byte from serial bus +asmsub CIOUT (ubyte databyte @ A) = $FFA8 ; (alias: IECOUT) output byte to serial bus +asmsub UNTLK () clobbers(A) = $FFAB ; command serial bus device to UNTALK +asmsub UNLSN () clobbers(A) = $FFAE ; command serial bus device to UNLISTEN +asmsub LISTEN (ubyte device @ A) clobbers(A) = $FFB1 ; command serial bus device to LISTEN +asmsub TALK (ubyte device @ A) clobbers(A) = $FFB4 ; command serial bus device to TALK +asmsub READST () -> ubyte @ A = $FFB7 ; read I/O status word +asmsub SETLFS (ubyte logical @ A, ubyte device @ X, ubyte address @ Y) = $FFBA ; set logical file parameters +asmsub SETNAM (ubyte namelen @ A, str filename @ XY) = $FFBD ; set filename parameters +asmsub OPEN () clobbers(A,X,Y) = $FFC0 ; (via 794 ($31A)) open a logical file +asmsub CLOSE (ubyte logical @ A) clobbers(A,X,Y) = $FFC3 ; (via 796 ($31C)) close a logical file +asmsub CHKIN (ubyte logical @ X) clobbers(A,X) = $FFC6 ; (via 798 ($31E)) define an input channel +asmsub CHKOUT (ubyte logical @ X) clobbers(A,X) = $FFC9 ; (via 800 ($320)) define an output channel +asmsub CLRCHN () clobbers(A,X) = $FFCC ; (via 802 ($322)) restore default devices +asmsub CHRIN () clobbers(Y) -> ubyte @ A = $FFCF ; (via 804 ($324)) input a character (for keyboard, read a whole line from the screen) A=byte read. +asmsub CHROUT (ubyte char @ A) = $FFD2 ; (via 806 ($326)) output a character +asmsub LOAD (ubyte verify @ A, uword address @ XY) -> ubyte @Pc, ubyte @ A, ubyte @ X, ubyte @ Y = $FFD5 ; (via 816 ($330)) load from device +asmsub SAVE (ubyte zp_startaddr @ A, uword endaddr @ XY) -> ubyte @ Pc, ubyte @ A = $FFD8 ; (via 818 ($332)) save to a device +asmsub SETTIM (ubyte low @ A, ubyte middle @ X, ubyte high @ Y) = $FFDB ; set the software clock +asmsub RDTIM () -> ubyte @ A, ubyte @ X, ubyte @ Y = $FFDE ; read the software clock +asmsub STOP () clobbers(A,X) -> ubyte @ Pz, ubyte @ Pc = $FFE1 ; (via 808 ($328)) check the STOP key +asmsub GETIN () clobbers(X,Y) -> ubyte @ A = $FFE4 ; (via 810 ($32A)) get a character +asmsub CLALL () clobbers(A,X) = $FFE7 ; (via 812 ($32C)) close all files +asmsub UDTIM () clobbers(A,X) = $FFEA ; update the software clock +asmsub SCREEN () -> ubyte @ X, ubyte @ Y = $FFED ; read number of screen rows and columns +asmsub PLOT (ubyte dir @ Pc, ubyte col @ Y, ubyte row @ X) -> ubyte @ X, ubyte @ Y = $FFF0 ; read/set position of cursor on screen. Use c64scr.plot for a 'safe' wrapper that preserves X. +asmsub IOBASE () -> uword @ XY = $FFF3 ; read base address of I/O devices ; ---- end of C64 kernal routines ---- diff --git a/compiler/res/prog8lib/c64utils.p8 b/compiler/res/prog8lib/c64utils.p8 index bbe711cda..e06a94cad 100644 --- a/compiler/res/prog8lib/c64utils.p8 +++ b/compiler/res/prog8lib/c64utils.p8 @@ -17,7 +17,7 @@ ; ----- utility functions ---- -asmsub ubyte2decimal (ubyte value @ A) -> clobbers() -> (ubyte @ Y, ubyte @ X, ubyte @ A) { +asmsub ubyte2decimal (ubyte value @ A) -> ubyte @ Y, ubyte @ X, ubyte @ A { ; ---- A to decimal string in Y/X/A (100s in Y, 10s in X, 1s in A) %asm {{ ldy #$2f @@ -34,7 +34,7 @@ asmsub ubyte2decimal (ubyte value @ A) -> clobbers() -> (ubyte @ Y, ubyte @ X, }} } -asmsub byte2decimal (ubyte value @ A) -> clobbers() -> (ubyte @ Y, ubyte @ X, ubyte @ A) { +asmsub byte2decimal (ubyte value @ A) -> ubyte @ Y, ubyte @ X, ubyte @ A { ; ---- A (signed byte) to decimal string in Y/X/A (100s in Y, 10s in X, 1s in A) ; note: the '-' is not part of the conversion here if it's a negative number %asm {{ @@ -47,7 +47,7 @@ asmsub byte2decimal (ubyte value @ A) -> clobbers() -> (ubyte @ Y, ubyte @ X, }} } -asmsub ubyte2hex (ubyte value @ A) -> clobbers() -> (ubyte @ A, ubyte @ Y) { +asmsub ubyte2hex (ubyte value @ A) -> ubyte @ A, ubyte @ Y { ; ---- A to hex string in AY (first hex char in A, second hex char in Y) %asm {{ stx c64.SCRATCH_ZPREGX @@ -70,7 +70,7 @@ _hex_digits .text "0123456789abcdef" ; can probably be reused for other stuff as } -asmsub uword2hex (uword value @ AY) -> clobbers(A,Y) -> () { +asmsub uword2hex (uword value @ AY) clobbers(A,Y) { ; ---- convert 16 bit uword in A/Y into 4-character hexadecimal string 'uword2hex.output' (0-terminated) %asm {{ sta c64.SCRATCH_ZPREG @@ -87,7 +87,7 @@ output .text "0000", $00 ; 0-terminated output buffer (to make printing ea }} } -asmsub uword2bcd (uword value @ AY) -> clobbers(A,Y) -> () { +asmsub uword2bcd (uword value @ AY) clobbers(A,Y) { ; Convert an 16 bit binary value to BCD ; ; This function converts a 16 bit binary value in A/Y into a 24 bit BCD. It @@ -134,7 +134,7 @@ bcdbuff .byte 0,0,0 } -asmsub uword2decimal (uword value @ AY) -> clobbers(A) -> (ubyte @ Y) { +asmsub uword2decimal (uword value @ AY) clobbers(A) -> ubyte @ Y { ; ---- convert 16 bit uword in A/Y into 0-terminated decimal string into memory 'uword2decimal.output' ; returns length of resulting string in Y %asm {{ @@ -173,7 +173,7 @@ output .text "00000", $00 ; 0 terminated } -asmsub str2uword(str string @ AY) -> clobbers() -> (uword @ AY) { +asmsub str2uword(str string @ AY) -> uword @ AY { ; -- returns the unsigned word value of the string number argument in AY ; the number may NOT be preceded by a + sign and may NOT contain spaces ; (any non-digit character will terminate the number string that is parsed) @@ -228,7 +228,7 @@ _result_times_10 ; (W*4 + W)*2 } -asmsub str2word(str string @ AY) -> clobbers() -> (word @ AY) { +asmsub str2word(str string @ AY) -> word @ AY { ; -- returns the signed word value of the string number argument in AY ; the number may be preceded by a + or - sign but may NOT contain spaces ; (any non-digit character will terminate the number string that is parsed) @@ -284,7 +284,7 @@ _negative .byte 0 } -asmsub set_irqvec_excl() -> clobbers(A) -> () { +asmsub set_irqvec_excl() clobbers(A) { %asm {{ sei lda #<_irq_handler @@ -303,7 +303,7 @@ _irq_handler jsr set_irqvec._irq_handler_init }} } -asmsub set_irqvec() -> clobbers(A) -> () { +asmsub set_irqvec() clobbers(A) { %asm {{ sei lda #<_irq_handler @@ -373,7 +373,7 @@ IRQ_SCRATCH_ZPWORD2 .word 0 } -asmsub restore_irqvec() -> clobbers() -> () { +asmsub restore_irqvec() { %asm {{ sei lda # clobbers() -> () { } -asmsub set_rasterirq(uword rasterpos @ AY) -> clobbers(A) -> () { +asmsub set_rasterirq(uword rasterpos @ AY) clobbers(A) { %asm {{ sei jsr _setup_raster_irq @@ -431,7 +431,7 @@ _setup_raster_irq }} } -asmsub set_rasterirq_excl(uword rasterpos @ AY) -> clobbers(A) -> () { +asmsub set_rasterirq_excl(uword rasterpos @ AY) clobbers(A) { %asm {{ sei jsr set_rasterirq._setup_raster_irq @@ -465,7 +465,7 @@ _raster_irq_handler ; ---- this block contains (character) Screen and text I/O related functions ---- -asmsub clear_screen (ubyte char @ A, ubyte color @ Y) -> clobbers(A) -> () { +asmsub clear_screen (ubyte char @ A, ubyte color @ Y) clobbers(A) { ; ---- clear the character screen with the given fill character and character color. ; (assumes screen and color matrix are at their default addresses) @@ -481,7 +481,7 @@ asmsub clear_screen (ubyte char @ A, ubyte color @ Y) -> clobbers(A) -> () { } -asmsub clear_screenchars (ubyte char @ A) -> clobbers(Y) -> () { +asmsub clear_screenchars (ubyte char @ A) clobbers(Y) { ; ---- clear the character screen with the given fill character (leaves colors) ; (assumes screen matrix is at the default address) %asm {{ @@ -501,7 +501,7 @@ _loop sta c64.Screen,y }} } -asmsub clear_screencolors (ubyte color @ A) -> clobbers(Y) -> () { +asmsub clear_screencolors (ubyte color @ A) clobbers(Y) { ; ---- clear the character screen colors with the given color (leaves characters). ; (assumes color matrix is at the default address) %asm {{ @@ -522,7 +522,7 @@ _loop sta c64.Colors,y } -asmsub scroll_left_full (ubyte alsocolors @ Pc) -> clobbers(A, Y) -> () { +asmsub scroll_left_full (ubyte alsocolors @ Pc) clobbers(A, Y) { ; ---- scroll the whole screen 1 character to the left ; contents of the rightmost column are unchanged, you should clear/refill this yourself ; Carry flag determines if screen color data must be scrolled too @@ -583,7 +583,7 @@ _scroll_screen ; scroll the screen memory } -asmsub scroll_right_full (ubyte alsocolors @ Pc) -> clobbers(A) -> () { +asmsub scroll_right_full (ubyte alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character to the right ; contents of the leftmost column are unchanged, you should clear/refill this yourself ; Carry flag determines if screen color data must be scrolled too @@ -636,7 +636,7 @@ _scroll_screen ; scroll the screen memory } -asmsub scroll_up_full (ubyte alsocolors @ Pc) -> clobbers(A) -> () { +asmsub scroll_up_full (ubyte alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character up ; contents of the bottom row are unchanged, you should refill/clear this yourself ; Carry flag determines if screen color data must be scrolled too @@ -689,7 +689,7 @@ _scroll_screen ; scroll the screen memory } -asmsub scroll_down_full (ubyte alsocolors @ Pc) -> clobbers(A) -> () { +asmsub scroll_down_full (ubyte alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character down ; contents of the top row are unchanged, you should refill/clear this yourself ; Carry flag determines if screen color data must be scrolled too @@ -743,7 +743,7 @@ _scroll_screen ; scroll the screen memory -asmsub print (str text @ AY) -> clobbers(A,Y) -> () { +asmsub print (str text @ AY) clobbers(A,Y) { ; ---- print null terminated string from A/Y ; note: the compiler contains an optimization that will replace ; a call to this subroutine with a string argument of just one char, @@ -762,7 +762,7 @@ asmsub print (str text @ AY) -> clobbers(A,Y) -> () { } -asmsub print_ub0 (ubyte value @ A) -> clobbers(A,Y) -> () { +asmsub print_ub0 (ubyte value @ A) clobbers(A,Y) { ; ---- print the ubyte in A in decimal form, with left padding 0s (3 positions total) %asm {{ stx c64.SCRATCH_ZPREGX @@ -780,7 +780,7 @@ asmsub print_ub0 (ubyte value @ A) -> clobbers(A,Y) -> () { } -asmsub print_ub (ubyte value @ A) -> clobbers(A,Y) -> () { +asmsub print_ub (ubyte value @ A) clobbers(A,Y) { ; ---- print the ubyte in A in decimal form, without left padding 0s %asm {{ stx c64.SCRATCH_ZPREGX @@ -803,7 +803,7 @@ _end pla }} } -asmsub print_b (byte value @ A) -> clobbers(A,Y) -> () { +asmsub print_b (byte value @ A) clobbers(A,Y) { ; ---- print the byte in A in decimal form, without left padding 0s %asm {{ stx c64.SCRATCH_ZPREGX @@ -821,7 +821,7 @@ asmsub print_b (byte value @ A) -> clobbers(A,Y) -> () { } -asmsub print_ubhex (ubyte prefix @ Pc, ubyte value @ A) -> clobbers(A,Y) -> () { +asmsub print_ubhex (ubyte prefix @ Pc, ubyte value @ A) clobbers(A,Y) { ; ---- print the ubyte in A in hex form (if Carry is set, a radix prefix '$' is printed as well) %asm {{ stx c64.SCRATCH_ZPREGX @@ -840,7 +840,7 @@ asmsub print_ubhex (ubyte prefix @ Pc, ubyte value @ A) -> clobbers(A,Y) -> () } -asmsub print_ubbin (ubyte prefix @ Pc, ubyte value @ A) -> clobbers(A,Y) ->() { +asmsub print_ubbin (ubyte prefix @ Pc, ubyte value @ A) clobbers(A,Y) { ; ---- print the ubyte in A in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ stx c64.SCRATCH_ZPREGX @@ -862,7 +862,7 @@ asmsub print_ubbin (ubyte prefix @ Pc, ubyte value @ A) -> clobbers(A,Y) ->() } -asmsub print_uwbin (ubyte prefix @ Pc, uword value @ AY) -> clobbers(A,Y) ->() { +asmsub print_uwbin (ubyte prefix @ Pc, uword value @ AY) clobbers(A,Y) { ; ---- print the uword in A/Y in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ pha @@ -875,7 +875,7 @@ asmsub print_uwbin (ubyte prefix @ Pc, uword value @ AY) -> clobbers(A,Y) ->() } -asmsub print_uwhex (ubyte prefix @ Pc, uword value @ AY) -> clobbers(A,Y) -> () { +asmsub print_uwhex (ubyte prefix @ Pc, uword value @ AY) clobbers(A,Y) { ; ---- print the uword in A/Y in hexadecimal form (4 digits) ; (if Carry is set, a radix prefix '$' is printed as well) %asm {{ @@ -889,7 +889,7 @@ asmsub print_uwhex (ubyte prefix @ Pc, uword value @ AY) -> clobbers(A,Y) -> () } -asmsub print_uw0 (uword value @ AY) -> clobbers(A,Y) -> () { +asmsub print_uw0 (uword value @ AY) clobbers(A,Y) { ; ---- print the uword in A/Y in decimal form, with left padding 0s (5 positions total) %asm {{ jsr c64utils.uword2decimal @@ -904,7 +904,7 @@ asmsub print_uw0 (uword value @ AY) -> clobbers(A,Y) -> () { } -asmsub print_uw (uword value @ AY) -> clobbers(A,Y) -> () { +asmsub print_uw (uword value @ AY) clobbers(A,Y) { ; ---- print the uword in A/Y in decimal form, without left padding 0s %asm {{ jsr c64utils.uword2decimal @@ -936,7 +936,7 @@ _pr_decimal }} } -asmsub print_w (word value @ AY) -> clobbers(A,Y) -> () { +asmsub print_w (word value @ AY) clobbers(A,Y) { ; ---- print the (signed) word in A/Y in decimal form, without left padding 0's %asm {{ cpy #0 @@ -957,7 +957,7 @@ asmsub print_w (word value @ AY) -> clobbers(A,Y) -> () { }} } -asmsub input_chars (uword buffer @ AY) -> clobbers(A) -> (ubyte @ Y) { +asmsub input_chars (uword buffer @ AY) clobbers(A) -> ubyte @ Y { ; ---- Input a string (max. 80 chars) from the keyboard. Returns length in Y. (string is terminated with a 0 byte as well) ; It assumes the keyboard is selected as I/O channel! @@ -978,7 +978,7 @@ asmsub input_chars (uword buffer @ AY) -> clobbers(A) -> (ubyte @ Y) { }} } -asmsub setchr (ubyte col @Y, ubyte row @A) -> clobbers(A) -> () { +asmsub setchr (ubyte col @Y, ubyte row @A) clobbers(A) { ; ---- set the character in SCRATCH_ZPB1 on the screen matrix at the given position %asm {{ sty c64.SCRATCH_ZPREG @@ -1000,7 +1000,7 @@ _screenrows .word $0400 + range(0, 1000, 40) }} } -asmsub getchr (ubyte col @Y, ubyte row @A) -> clobbers(Y) -> (ubyte @ A) { +asmsub getchr (ubyte col @Y, ubyte row @A) clobbers(Y) -> ubyte @ A { ; ---- get the character in the screen matrix at the given location %asm {{ sty c64.SCRATCH_ZPB1 @@ -1019,7 +1019,7 @@ _mod lda $ffff ; modified }} } -asmsub setclr (ubyte col @Y, ubyte row @A) -> clobbers(A) -> () { +asmsub setclr (ubyte col @Y, ubyte row @A) clobbers(A) { ; ---- set the color in SCRATCH_ZPB1 on the screen matrix at the given position %asm {{ sty c64.SCRATCH_ZPREG @@ -1041,7 +1041,7 @@ _colorrows .word $d800 + range(0, 1000, 40) }} } -asmsub getclr (ubyte col @Y, ubyte row @A) -> clobbers(Y) -> (ubyte @ A) { +asmsub getclr (ubyte col @Y, ubyte row @A) clobbers(Y) -> ubyte @ A { ; ---- get the color in the screen color matrix at the given location %asm {{ sty c64.SCRATCH_ZPB1 @@ -1086,7 +1086,7 @@ _colormod sta $ffff ; modified }} } -asmsub plot (ubyte col @ Y, ubyte row @ A) -> clobbers(A) -> () { +asmsub plot (ubyte col @ Y, ubyte row @ A) clobbers(A) { ; ---- safe wrapper around PLOT kernel routine, to save the X register. %asm {{ stx c64.SCRATCH_ZPREGX diff --git a/compiler/src/prog8/ast/antlr/Antr2Kotlin.kt b/compiler/src/prog8/ast/antlr/Antr2Kotlin.kt index 20affd00b..54176a848 100644 --- a/compiler/src/prog8/ast/antlr/Antr2Kotlin.kt +++ b/compiler/src/prog8/ast/antlr/Antr2Kotlin.kt @@ -187,7 +187,7 @@ private fun prog8Parser.AsmsubroutineContext.toAst(): IStatement { val normalReturnvalues = returns.map { it.type } val paramRegisters = params.map { RegisterOrStatusflag(it.registerOrPair, it.statusflag, it.stack) } val returnRegisters = returns.map { RegisterOrStatusflag(it.registerOrPair, it.statusflag, it.stack) } - val clobbers = clobber()?.toAst() ?: emptySet() + val clobbers = asmsub_clobbers()?.clobber()?.toAst() ?: emptySet() val statements = statement_block()?.toAst() ?: mutableListOf() return Subroutine(name, normalParameters, normalReturnvalues, paramRegisters, returnRegisters, clobbers, address, true, statements, toPosition()) diff --git a/compiler/src/prog8/compiler/Main.kt b/compiler/src/prog8/compiler/Main.kt index 0e4cca819..193a537a6 100644 --- a/compiler/src/prog8/compiler/Main.kt +++ b/compiler/src/prog8/compiler/Main.kt @@ -86,7 +86,7 @@ fun compileProgram(filepath: Path, programAst.checkValid(compilerOptions) // check if final tree is valid programAst.checkRecursion() // check if there are recursive subroutine calls - printAst(programAst) + // printAst(programAst) // namespace.debugPrint() // compile the syntax tree into stackvmProg form, and optimize that diff --git a/compiler/src/prog8/optimizer/StatementOptimizer.kt b/compiler/src/prog8/optimizer/StatementOptimizer.kt index 8430561b2..8396da964 100644 --- a/compiler/src/prog8/optimizer/StatementOptimizer.kt +++ b/compiler/src/prog8/optimizer/StatementOptimizer.kt @@ -71,18 +71,23 @@ internal class StatementOptimizer(private val program: Program, private val opti val inlined = AnonymousScope(sub.statements.toMutableList(), caller.position) parent.statements[parent.statements.indexOf(caller)] = inlined // replace return statements in the inlined sub by a jump to the end of it + var haveNewEndLabel = false + var endLabelUsed = false var endlabel = inlined.statements.last() as? Label if(endlabel==null) { endlabel = makeLabel("_prog8_auto_sub_end", inlined.statements.last().position) - inlined.statements.add(endlabel) endlabel.parent = inlined + haveNewEndLabel = true } val returns = inlined.statements.withIndex().filter { iv -> iv.value is Return }.map { iv -> Pair(iv.index, iv.value as Return)} for(returnIdx in returns) { assert(returnIdx.second.values.isEmpty()) val jump = Jump(null, IdentifierReference(listOf(endlabel.name), returnIdx.second.position), null, returnIdx.second.position) inlined.statements[returnIdx.first] = jump + endLabelUsed = true } + if(endLabelUsed && haveNewEndLabel) + inlined.statements.add(endlabel) inlined.linkParents(caller.parent) sub.calledBy.remove(caller) // if there are no callers left, the sub will be removed automatically later optimizationsDone++ diff --git a/examples/test.p8 b/examples/test.p8 index cd653158d..abec8f211 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -19,6 +19,8 @@ } - asmsub derp (ubyte arg @ X) -> clobbers(A, X) -> (ubyte @Y) = $a000 + asmsub derp2 (ubyte arg @ X) = $a000 + asmsub derp1 (ubyte arg @ X) clobbers(A, X) = $a000 + asmsub derp (ubyte arg @ X) clobbers(A, X) -> ubyte @Y = $a000 } diff --git a/parser/antlr/prog8.g4 b/parser/antlr/prog8.g4 index 8f357df51..01b8bce60 100644 --- a/parser/antlr/prog8.g4 +++ b/parser/antlr/prog8.g4 @@ -244,19 +244,21 @@ sub_params : vardecl (',' EOL? vardecl)* ; sub_returns : datatype (',' EOL? datatype)* ; asmsubroutine : - 'asmsub' identifier '(' asmsub_params? ')' - '->' 'clobbers' '(' clobber? ')' '->' '(' asmsub_returns? ')' (asmsub_address | statement_block ) + 'asmsub' identifier '(' asmsub_params? ')' EOL? + asmsub_clobbers? asmsub_returns? (asmsub_address | statement_block ) ; asmsub_address : '=' address=integerliteral ; asmsub_params : asmsub_param (',' EOL? asmsub_param)* ; -asmsub_param : vardecl '@' (registerorpair | statusregister | stack='stack'); +asmsub_param : vardecl '@' (registerorpair | statusregister | stack='stack') ; + +asmsub_clobbers : 'clobbers' '(' clobber? ')' ; clobber : register (',' register)* ; -asmsub_returns : asmsub_return (',' EOL? asmsub_return)* ; +asmsub_returns : '->' asmsub_return (',' EOL? asmsub_return)* ; asmsub_return : datatype '@' (registerorpair | statusregister | stack='stack') ; diff --git a/parser/src/prog8/parser/prog8Lexer.java b/parser/src/prog8/parser/prog8Lexer.java index 2d6aca943..f22347737 100644 --- a/parser/src/prog8/parser/prog8Lexer.java +++ b/parser/src/prog8/parser/prog8Lexer.java @@ -80,7 +80,7 @@ public class prog8Lexer extends Lexer { "'step'", "'and'", "'or'", "'xor'", "'not'", "'('", "')'", "'as'", "'@'", "'return'", "'break'", "'continue'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'", - "'%asm'", "'sub'", "'->'", "'{'", "'}'", "'asmsub'", "'clobbers'", "'stack'", + "'%asm'", "'sub'", "'->'", "'{'", "'}'", "'asmsub'", "'stack'", "'clobbers'", "'if'", "'else'", "'if_cs'", "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'", "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'", "'repeat'", "'until'", null, null, null, @@ -246,7 +246,7 @@ public class prog8Lexer extends Lexer { "F\3G\3G\3H\3H\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3"+ "O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3T\3"+ "T\3T\3T\3U\3U\3U\3V\3V\3W\3W\3X\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3"+ - "Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]"+ + "Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]"+ "\3]\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a"+ "\3a\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d\3d\3e\3e\3e"+ "\3e\3e\3e\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3i"+ @@ -315,7 +315,7 @@ public class prog8Lexer extends Lexer { "\u023c\3\2\2\2\u009d\u023f\3\2\2\2\u009f\u0242\3\2\2\2\u00a1\u0245\3\2"+ "\2\2\u00a3\u024a\3\2\2\2\u00a5\u0250\3\2\2\2\u00a7\u0255\3\2\2\2\u00a9"+ "\u0259\3\2\2\2\u00ab\u025c\3\2\2\2\u00ad\u025e\3\2\2\2\u00af\u0260\3\2"+ - "\2\2\u00b1\u0267\3\2\2\2\u00b3\u0270\3\2\2\2\u00b5\u0276\3\2\2\2\u00b7"+ + "\2\2\u00b1\u0267\3\2\2\2\u00b3\u026d\3\2\2\2\u00b5\u0276\3\2\2\2\u00b7"+ "\u0279\3\2\2\2\u00b9\u027e\3\2\2\2\u00bb\u0284\3\2\2\2\u00bd\u028a\3\2"+ "\2\2\u00bf\u0290\3\2\2\2\u00c1\u0295\3\2\2\2\u00c3\u029b\3\2\2\2\u00c5"+ "\u02a1\3\2\2\2\u00c7\u02a7\3\2\2\2\u00c9\u02ae\3\2\2\2\u00cb\u02b4\3\2"+ @@ -420,11 +420,11 @@ public class prog8Lexer extends Lexer { "\7/\2\2\u025a\u025b\7@\2\2\u025b\u00aa\3\2\2\2\u025c\u025d\7}\2\2\u025d"+ "\u00ac\3\2\2\2\u025e\u025f\7\177\2\2\u025f\u00ae\3\2\2\2\u0260\u0261\7"+ "c\2\2\u0261\u0262\7u\2\2\u0262\u0263\7o\2\2\u0263\u0264\7u\2\2\u0264\u0265"+ - "\7w\2\2\u0265\u0266\7d\2\2\u0266\u00b0\3\2\2\2\u0267\u0268\7e\2\2\u0268"+ - "\u0269\7n\2\2\u0269\u026a\7q\2\2\u026a\u026b\7d\2\2\u026b\u026c\7d\2\2"+ - "\u026c\u026d\7g\2\2\u026d\u026e\7t\2\2\u026e\u026f\7u\2\2\u026f\u00b2"+ - "\3\2\2\2\u0270\u0271\7u\2\2\u0271\u0272\7v\2\2\u0272\u0273\7c\2\2\u0273"+ - "\u0274\7e\2\2\u0274\u0275\7m\2\2\u0275\u00b4\3\2\2\2\u0276\u0277\7k\2"+ + "\7w\2\2\u0265\u0266\7d\2\2\u0266\u00b0\3\2\2\2\u0267\u0268\7u\2\2\u0268"+ + "\u0269\7v\2\2\u0269\u026a\7c\2\2\u026a\u026b\7e\2\2\u026b\u026c\7m\2\2"+ + "\u026c\u00b2\3\2\2\2\u026d\u026e\7e\2\2\u026e\u026f\7n\2\2\u026f\u0270"+ + "\7q\2\2\u0270\u0271\7d\2\2\u0271\u0272\7d\2\2\u0272\u0273\7g\2\2\u0273"+ + "\u0274\7t\2\2\u0274\u0275\7u\2\2\u0275\u00b4\3\2\2\2\u0276\u0277\7k\2"+ "\2\u0277\u0278\7h\2\2\u0278\u00b6\3\2\2\2\u0279\u027a\7g\2\2\u027a\u027b"+ "\7n\2\2\u027b\u027c\7u\2\2\u027c\u027d\7g\2\2\u027d\u00b8\3\2\2\2\u027e"+ "\u027f\7k\2\2\u027f\u0280\7h\2\2\u0280\u0281\7a\2\2\u0281\u0282\7e\2\2"+ diff --git a/parser/src/prog8/parser/prog8Parser.java b/parser/src/prog8/parser/prog8Parser.java index d29e36d4f..b86b33384 100644 --- a/parser/src/prog8/parser/prog8Parser.java +++ b/parser/src/prog8/parser/prog8Parser.java @@ -53,9 +53,10 @@ public class prog8Parser extends Parser { RULE_floatliteral = 41, RULE_literalvalue = 42, RULE_inlineasm = 43, RULE_subroutine = 44, RULE_sub_return_part = 45, RULE_statement_block = 46, RULE_sub_params = 47, RULE_sub_returns = 48, RULE_asmsubroutine = 49, RULE_asmsub_address = 50, - RULE_asmsub_params = 51, RULE_asmsub_param = 52, RULE_clobber = 53, RULE_asmsub_returns = 54, - RULE_asmsub_return = 55, RULE_if_stmt = 56, RULE_else_part = 57, RULE_branch_stmt = 58, - RULE_branchcondition = 59, RULE_forloop = 60, RULE_whileloop = 61, RULE_repeatloop = 62; + RULE_asmsub_params = 51, RULE_asmsub_param = 52, RULE_asmsub_clobbers = 53, + RULE_clobber = 54, RULE_asmsub_returns = 55, RULE_asmsub_return = 56, + RULE_if_stmt = 57, RULE_else_part = 58, RULE_branch_stmt = 59, RULE_branchcondition = 60, + RULE_forloop = 61, RULE_whileloop = 62, RULE_repeatloop = 63; private static String[] makeRuleNames() { return new String[] { "module", "modulestatement", "block", "statement", "labeldef", "unconditionaljump", @@ -68,9 +69,9 @@ public class prog8Parser extends Parser { "integerliteral", "wordsuffix", "booleanliteral", "arrayliteral", "stringliteral", "charliteral", "floatliteral", "literalvalue", "inlineasm", "subroutine", "sub_return_part", "statement_block", "sub_params", "sub_returns", "asmsubroutine", - "asmsub_address", "asmsub_params", "asmsub_param", "clobber", "asmsub_returns", - "asmsub_return", "if_stmt", "else_part", "branch_stmt", "branchcondition", - "forloop", "whileloop", "repeatloop" + "asmsub_address", "asmsub_params", "asmsub_param", "asmsub_clobbers", + "clobber", "asmsub_returns", "asmsub_return", "if_stmt", "else_part", + "branch_stmt", "branchcondition", "forloop", "whileloop", "repeatloop" }; } public static final String[] ruleNames = makeRuleNames(); @@ -87,7 +88,7 @@ public class prog8Parser extends Parser { "'step'", "'and'", "'or'", "'xor'", "'not'", "'('", "')'", "'as'", "'@'", "'return'", "'break'", "'continue'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'", - "'%asm'", "'sub'", "'->'", "'{'", "'}'", "'asmsub'", "'clobbers'", "'stack'", + "'%asm'", "'sub'", "'->'", "'{'", "'}'", "'asmsub'", "'stack'", "'clobbers'", "'if'", "'else'", "'if_cs'", "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'", "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'", "'repeat'", "'until'", null, null, null, @@ -188,12 +189,12 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(130); + setState(132); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12))) != 0) || _la==EOL) { { - setState(128); + setState(130); _errHandler.sync(this); switch (_input.LA(1)) { case T__0: @@ -208,13 +209,13 @@ public class prog8Parser extends Parser { case T__11: case T__12: { - setState(126); + setState(128); modulestatement(); } break; case EOL: { - setState(127); + setState(129); match(EOL); } break; @@ -222,11 +223,11 @@ public class prog8Parser extends Parser { throw new NoViableAltException(this); } } - setState(132); + setState(134); _errHandler.sync(this); _la = _input.LA(1); } - setState(133); + setState(135); match(EOF); } } @@ -258,7 +259,7 @@ public class prog8Parser extends Parser { ModulestatementContext _localctx = new ModulestatementContext(_ctx, getState()); enterRule(_localctx, 2, RULE_modulestatement); try { - setState(137); + setState(139); _errHandler.sync(this); switch (_input.LA(1)) { case T__3: @@ -273,14 +274,14 @@ public class prog8Parser extends Parser { case T__12: enterOuterAlt(_localctx, 1); { - setState(135); + setState(137); directive(); } break; case T__0: enterOuterAlt(_localctx, 2); { - setState(136); + setState(138); block(); } break; @@ -323,23 +324,23 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(139); + setState(141); match(T__0); - setState(140); - identifier(); setState(142); + identifier(); + setState(144); _errHandler.sync(this); _la = _input.LA(1); if (((((_la - 114)) & ~0x3f) == 0 && ((1L << (_la - 114)) & ((1L << (DEC_INTEGER - 114)) | (1L << (HEX_INTEGER - 114)) | (1L << (BIN_INTEGER - 114)))) != 0)) { { - setState(141); + setState(143); integerliteral(); } } - setState(144); + setState(146); statement_block(); - setState(145); + setState(147); match(EOL); } } @@ -431,160 +432,160 @@ public class prog8Parser extends Parser { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 6, RULE_statement); try { - setState(169); + setState(171); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(147); + setState(149); directive(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(148); + setState(150); varinitializer(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(149); + setState(151); vardecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(150); + setState(152); constdecl(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(151); + setState(153); memoryvardecl(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(152); + setState(154); assignment(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(153); + setState(155); augassignment(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(154); + setState(156); unconditionaljump(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(155); + setState(157); postincrdecr(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(156); + setState(158); functioncall_stmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(157); + setState(159); if_stmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(158); + setState(160); branch_stmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(159); + setState(161); subroutine(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(160); + setState(162); asmsubroutine(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(161); + setState(163); inlineasm(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(162); + setState(164); returnstmt(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(163); + setState(165); forloop(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(164); + setState(166); whileloop(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(165); + setState(167); repeatloop(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(166); + setState(168); breakstmt(); } break; case 21: enterOuterAlt(_localctx, 21); { - setState(167); + setState(169); continuestmt(); } break; case 22: enterOuterAlt(_localctx, 22); { - setState(168); + setState(170); labeldef(); } break; @@ -617,9 +618,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(171); + setState(173); identifier(); - setState(172); + setState(174); match(T__1); } } @@ -653,22 +654,22 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(174); + setState(176); match(T__2); - setState(177); + setState(179); _errHandler.sync(this); switch (_input.LA(1)) { case DEC_INTEGER: case HEX_INTEGER: case BIN_INTEGER: { - setState(175); + setState(177); integerliteral(); } break; case NAME: { - setState(176); + setState(178); scoped_identifier(); } break; @@ -709,7 +710,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(179); + setState(181); ((DirectiveContext)_localctx).directivename = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12))) != 0)) ) { @@ -720,17 +721,17 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(191); + setState(193); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { case 1: { - setState(181); + setState(183); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: { - setState(180); + setState(182); directivearg(); } break; @@ -739,21 +740,21 @@ public class prog8Parser extends Parser { break; case 2: { - setState(183); + setState(185); directivearg(); - setState(188); + setState(190); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(184); + setState(186); match(T__13); - setState(185); + setState(187); directivearg(); } } - setState(190); + setState(192); _errHandler.sync(this); _la = _input.LA(1); } @@ -793,20 +794,20 @@ public class prog8Parser extends Parser { DirectiveargContext _localctx = new DirectiveargContext(_ctx, getState()); enterRule(_localctx, 14, RULE_directivearg); try { - setState(196); + setState(198); _errHandler.sync(this); switch (_input.LA(1)) { case STRING: enterOuterAlt(_localctx, 1); { - setState(193); + setState(195); stringliteral(); } break; case NAME: enterOuterAlt(_localctx, 2); { - setState(194); + setState(196); identifier(); } break; @@ -815,7 +816,7 @@ public class prog8Parser extends Parser { case BIN_INTEGER: enterOuterAlt(_localctx, 3); { - setState(195); + setState(197); integerliteral(); } break; @@ -859,30 +860,30 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(198); - datatype(); setState(200); + datatype(); + setState(202); _errHandler.sync(this); _la = _input.LA(1); if (_la==ZEROPAGE) { { - setState(199); + setState(201); match(ZEROPAGE); } } - setState(204); + setState(206); _errHandler.sync(this); switch (_input.LA(1)) { case T__23: { - setState(202); + setState(204); arrayindex(); } break; case ARRAYSIG: { - setState(203); + setState(205); match(ARRAYSIG); } break; @@ -891,7 +892,7 @@ public class prog8Parser extends Parser { default: break; } - setState(206); + setState(208); identifier(); } } @@ -925,11 +926,11 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(208); - vardecl(); - setState(209); - match(T__14); setState(210); + vardecl(); + setState(211); + match(T__14); + setState(212); expression(0); } } @@ -960,9 +961,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(212); + setState(214); match(T__15); - setState(213); + setState(215); varinitializer(); } } @@ -994,9 +995,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(215); + setState(217); match(ADDRESS_OF); - setState(216); + setState(218); varinitializer(); } } @@ -1025,7 +1026,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(218); + setState(220); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0)) ) { _errHandler.recoverInline(this); @@ -1064,11 +1065,11 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(220); - match(T__23); - setState(221); - expression(0); setState(222); + match(T__23); + setState(223); + expression(0); + setState(224); match(T__24); } } @@ -1102,11 +1103,11 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(224); - assign_targets(); - setState(225); - match(T__14); setState(226); + assign_targets(); + setState(227); + match(T__14); + setState(228); expression(0); } } @@ -1141,21 +1142,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(228); + setState(230); assign_target(); - setState(233); + setState(235); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(229); + setState(231); match(T__13); - setState(230); + setState(232); assign_target(); } } - setState(235); + setState(237); _errHandler.sync(this); _la = _input.LA(1); } @@ -1193,9 +1194,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(236); + setState(238); assign_target(); - setState(237); + setState(239); ((AugassignmentContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35))) != 0)) ) { @@ -1206,7 +1207,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(238); + setState(240); expression(0); } } @@ -1244,34 +1245,34 @@ public class prog8Parser extends Parser { Assign_targetContext _localctx = new Assign_targetContext(_ctx, getState()); enterRule(_localctx, 34, RULE_assign_target); try { - setState(244); + setState(246); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(240); + setState(242); register(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(241); + setState(243); scoped_identifier(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(242); + setState(244); arrayindexed(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(243); + setState(245); directmemory(); } break; @@ -1306,9 +1307,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(246); + setState(248); assign_target(); - setState(247); + setState(249); ((PostincrdecrContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__36 || _la==T__37) ) { @@ -1397,18 +1398,18 @@ public class prog8Parser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(265); + setState(267); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: { - setState(250); + setState(252); functioncall(); } break; case 2: { - setState(251); + setState(253); ((ExpressionContext)_localctx).prefix = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__38) | (1L << T__39))) != 0)) ) { @@ -1419,67 +1420,67 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(252); + setState(254); expression(23); } break; case 3: { - setState(253); + setState(255); ((ExpressionContext)_localctx).prefix = match(T__59); - setState(254); + setState(256); expression(9); } break; case 4: { - setState(255); + setState(257); literalvalue(); } break; case 5: { - setState(256); + setState(258); register(); } break; case 6: { - setState(257); + setState(259); scoped_identifier(); } break; case 7: { - setState(258); + setState(260); arrayindexed(); } break; case 8: { - setState(259); + setState(261); directmemory(); } break; case 9: { - setState(260); + setState(262); addressof(); } break; case 10: { - setState(261); - match(T__60); - setState(262); - expression(0); setState(263); + match(T__60); + setState(264); + expression(0); + setState(265); match(T__61); } break; } _ctx.stop = _input.LT(-1); - setState(386); + setState(388); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,41,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1487,7 +1488,7 @@ public class prog8Parser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(384); + setState(386); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { case 1: @@ -1496,31 +1497,31 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(267); - if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)"); setState(269); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==EOL) { - { - setState(268); - match(EOL); - } - } - + if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)"); setState(271); - ((ExpressionContext)_localctx).bop = match(T__40); - setState(273); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(272); + setState(270); match(EOL); } } + setState(273); + ((ExpressionContext)_localctx).bop = match(T__40); setState(275); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOL) { + { + setState(274); + match(EOL); + } + } + + setState(277); ((ExpressionContext)_localctx).right = expression(23); } break; @@ -1530,19 +1531,19 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(276); - if (!(precpred(_ctx, 21))) throw new FailedPredicateException(this, "precpred(_ctx, 21)"); setState(278); + if (!(precpred(_ctx, 21))) throw new FailedPredicateException(this, "precpred(_ctx, 21)"); + setState(280); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(277); + setState(279); match(EOL); } } - setState(280); + setState(282); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__41) | (1L << T__42) | (1L << T__43))) != 0)) ) { @@ -1553,17 +1554,17 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(282); + setState(284); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(281); + setState(283); match(EOL); } } - setState(284); + setState(286); ((ExpressionContext)_localctx).right = expression(22); } break; @@ -1573,19 +1574,19 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(285); - if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)"); setState(287); + if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)"); + setState(289); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(286); + setState(288); match(EOL); } } - setState(289); + setState(291); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__38 || _la==T__39) ) { @@ -1596,17 +1597,17 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(291); + setState(293); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(290); + setState(292); match(EOL); } } - setState(293); + setState(295); ((ExpressionContext)_localctx).right = expression(21); } break; @@ -1616,19 +1617,19 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(294); - if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); setState(296); + if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); + setState(298); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(295); + setState(297); match(EOL); } } - setState(298); + setState(300); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__44 || _la==T__45) ) { @@ -1639,17 +1640,17 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(300); + setState(302); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(299); + setState(301); match(EOL); } } - setState(302); + setState(304); ((ExpressionContext)_localctx).right = expression(20); } break; @@ -1659,19 +1660,19 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(303); - if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); setState(305); + if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); + setState(307); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(304); + setState(306); match(EOL); } } - setState(307); + setState(309); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49))) != 0)) ) { @@ -1682,17 +1683,17 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(309); + setState(311); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(308); + setState(310); match(EOL); } } - setState(311); + setState(313); ((ExpressionContext)_localctx).right = expression(19); } break; @@ -1702,19 +1703,19 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(312); - if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); setState(314); + if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); + setState(316); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(313); + setState(315); match(EOL); } } - setState(316); + setState(318); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__50 || _la==T__51) ) { @@ -1725,17 +1726,17 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(318); + setState(320); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(317); + setState(319); match(EOL); } } - setState(320); + setState(322); ((ExpressionContext)_localctx).right = expression(18); } break; @@ -1745,31 +1746,31 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(321); - if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); setState(323); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==EOL) { - { - setState(322); - match(EOL); - } - } - + if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); setState(325); - ((ExpressionContext)_localctx).bop = match(ADDRESS_OF); - setState(327); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(326); + setState(324); match(EOL); } } + setState(327); + ((ExpressionContext)_localctx).bop = match(ADDRESS_OF); setState(329); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOL) { + { + setState(328); + match(EOL); + } + } + + setState(331); ((ExpressionContext)_localctx).right = expression(17); } break; @@ -1779,31 +1780,31 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(330); - if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); setState(332); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==EOL) { - { - setState(331); - match(EOL); - } - } - + if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); setState(334); - ((ExpressionContext)_localctx).bop = match(T__52); - setState(336); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(335); + setState(333); match(EOL); } } + setState(336); + ((ExpressionContext)_localctx).bop = match(T__52); setState(338); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOL) { + { + setState(337); + match(EOL); + } + } + + setState(340); ((ExpressionContext)_localctx).right = expression(16); } break; @@ -1813,31 +1814,31 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(339); - if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); setState(341); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==EOL) { - { - setState(340); - match(EOL); - } - } - + if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); setState(343); - ((ExpressionContext)_localctx).bop = match(T__53); - setState(345); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(344); + setState(342); match(EOL); } } + setState(345); + ((ExpressionContext)_localctx).bop = match(T__53); setState(347); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOL) { + { + setState(346); + match(EOL); + } + } + + setState(349); ((ExpressionContext)_localctx).right = expression(15); } break; @@ -1847,31 +1848,31 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(348); - if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); setState(350); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==EOL) { - { - setState(349); - match(EOL); - } - } - + if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); setState(352); - ((ExpressionContext)_localctx).bop = match(T__56); - setState(354); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(353); + setState(351); match(EOL); } } + setState(354); + ((ExpressionContext)_localctx).bop = match(T__56); setState(356); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOL) { + { + setState(355); + match(EOL); + } + } + + setState(358); ((ExpressionContext)_localctx).right = expression(13); } break; @@ -1881,31 +1882,31 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(357); - if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); setState(359); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==EOL) { - { - setState(358); - match(EOL); - } - } - + if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); setState(361); - ((ExpressionContext)_localctx).bop = match(T__57); - setState(363); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(362); + setState(360); match(EOL); } } + setState(363); + ((ExpressionContext)_localctx).bop = match(T__57); setState(365); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOL) { + { + setState(364); + match(EOL); + } + } + + setState(367); ((ExpressionContext)_localctx).right = expression(12); } break; @@ -1915,31 +1916,31 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(366); - if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); setState(368); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==EOL) { - { - setState(367); - match(EOL); - } - } - + if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); setState(370); - ((ExpressionContext)_localctx).bop = match(T__58); - setState(372); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(371); + setState(369); match(EOL); } } + setState(372); + ((ExpressionContext)_localctx).bop = match(T__58); setState(374); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOL) { + { + setState(373); + match(EOL); + } + } + + setState(376); ((ExpressionContext)_localctx).right = expression(11); } break; @@ -1949,20 +1950,20 @@ public class prog8Parser extends Parser { _localctx.rangefrom = _prevctx; _localctx.rangefrom = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(375); - if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(376); - match(T__54); setState(377); + if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); + setState(378); + match(T__54); + setState(379); ((ExpressionContext)_localctx).rangeto = expression(0); - setState(380); + setState(382); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(378); + setState(380); match(T__55); - setState(379); + setState(381); ((ExpressionContext)_localctx).rangestep = expression(0); } break; @@ -1973,16 +1974,16 @@ public class prog8Parser extends Parser { { _localctx = new ExpressionContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(382); + setState(384); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(383); + setState(385); typecast(); } break; } } } - setState(388); + setState(390); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,41,_ctx); } @@ -2015,9 +2016,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(389); + setState(391); match(T__62); - setState(390); + setState(392); datatype(); } } @@ -2051,9 +2052,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(392); + setState(394); scoped_identifier(); - setState(393); + setState(395); arrayindex(); } } @@ -2084,13 +2085,13 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(395); - match(T__63); - setState(396); - match(T__60); setState(397); - expression(0); + match(T__63); setState(398); + match(T__60); + setState(399); + expression(0); + setState(400); match(T__61); } } @@ -2122,9 +2123,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(400); + setState(402); match(ADDRESS_OF); - setState(401); + setState(403); scoped_identifier(); } } @@ -2159,21 +2160,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(403); + setState(405); scoped_identifier(); - setState(404); - match(T__60); setState(406); + match(T__60); + setState(408); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__38) | (1L << T__39) | (1L << T__59) | (1L << T__60))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__79 - 64)) | (1L << (T__80 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (ADDRESS_OF - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)) | (1L << (SINGLECHAR - 64)))) != 0)) { { - setState(405); + setState(407); expression_list(); } } - setState(408); + setState(410); match(T__61); } } @@ -2208,21 +2209,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(410); + setState(412); scoped_identifier(); - setState(411); - match(T__60); setState(413); + match(T__60); + setState(415); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__38) | (1L << T__39) | (1L << T__59) | (1L << T__60))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__79 - 64)) | (1L << (T__80 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (ADDRESS_OF - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)) | (1L << (SINGLECHAR - 64)))) != 0)) { { - setState(412); + setState(414); expression_list(); } } - setState(415); + setState(417); match(T__61); } } @@ -2261,31 +2262,31 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(417); + setState(419); expression(0); - setState(425); + setState(427); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(418); - match(T__13); setState(420); + match(T__13); + setState(422); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(419); + setState(421); match(EOL); } } - setState(422); + setState(424); expression(0); } } - setState(427); + setState(429); _errHandler.sync(this); _la = _input.LA(1); } @@ -2318,14 +2319,14 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(428); - match(T__64); setState(430); + match(T__64); + setState(432); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { case 1: { - setState(429); + setState(431); expression_list(); } break; @@ -2356,7 +2357,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(432); + setState(434); match(T__65); } } @@ -2384,7 +2385,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(434); + setState(436); match(T__66); } } @@ -2413,7 +2414,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(436); + setState(438); match(NAME); } } @@ -2446,23 +2447,23 @@ public class prog8Parser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(438); + setState(440); match(NAME); - setState(443); + setState(445); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,47,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(439); + setState(441); match(T__67); - setState(440); + setState(442); match(NAME); } } } - setState(445); + setState(447); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,47,_ctx); } @@ -2493,7 +2494,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(446); + setState(448); _la = _input.LA(1); if ( !(((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (T__68 - 69)) | (1L << (T__69 - 69)) | (1L << (T__70 - 69)))) != 0)) ) { _errHandler.recoverInline(this); @@ -2530,7 +2531,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(448); + setState(450); _la = _input.LA(1); if ( !(((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (T__68 - 69)) | (1L << (T__69 - 69)) | (1L << (T__70 - 69)) | (1L << (T__71 - 69)) | (1L << (T__72 - 69)) | (1L << (T__73 - 69)))) != 0)) ) { _errHandler.recoverInline(this); @@ -2567,7 +2568,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(450); + setState(452); _la = _input.LA(1); if ( !(((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (T__74 - 75)) | (1L << (T__75 - 75)) | (1L << (T__76 - 75)) | (1L << (T__77 - 75)))) != 0)) ) { _errHandler.recoverInline(this); @@ -2611,7 +2612,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(452); + setState(454); ((IntegerliteralContext)_localctx).intpart = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 114)) & ~0x3f) == 0 && ((1L << (_la - 114)) & ((1L << (DEC_INTEGER - 114)) | (1L << (HEX_INTEGER - 114)) | (1L << (BIN_INTEGER - 114)))) != 0)) ) { @@ -2622,12 +2623,12 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(454); + setState(456); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(453); + setState(455); wordsuffix(); } break; @@ -2658,7 +2659,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(456); + setState(458); match(T__78); } } @@ -2687,7 +2688,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(458); + setState(460); _la = _input.LA(1); if ( !(_la==T__79 || _la==T__80) ) { _errHandler.recoverInline(this); @@ -2734,57 +2735,57 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(460); - match(T__23); setState(462); + match(T__23); + setState(464); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(461); + setState(463); match(EOL); } } - setState(464); + setState(466); expression(0); - setState(472); + setState(474); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(465); - match(T__13); setState(467); + match(T__13); + setState(469); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(466); + setState(468); match(EOL); } } - setState(469); + setState(471); expression(0); } } - setState(474); + setState(476); _errHandler.sync(this); _la = _input.LA(1); } - setState(476); + setState(478); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(475); + setState(477); match(EOL); } } - setState(478); + setState(480); match(T__24); } } @@ -2813,7 +2814,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(480); + setState(482); match(STRING); } } @@ -2842,7 +2843,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(482); + setState(484); match(SINGLECHAR); } } @@ -2871,7 +2872,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(484); + setState(486); match(FLOAT_NUMBER); } } @@ -2915,7 +2916,7 @@ public class prog8Parser extends Parser { LiteralvalueContext _localctx = new LiteralvalueContext(_ctx, getState()); enterRule(_localctx, 84, RULE_literalvalue); try { - setState(492); + setState(494); _errHandler.sync(this); switch (_input.LA(1)) { case DEC_INTEGER: @@ -2923,7 +2924,7 @@ public class prog8Parser extends Parser { case BIN_INTEGER: enterOuterAlt(_localctx, 1); { - setState(486); + setState(488); integerliteral(); } break; @@ -2931,35 +2932,35 @@ public class prog8Parser extends Parser { case T__80: enterOuterAlt(_localctx, 2); { - setState(487); + setState(489); booleanliteral(); } break; case T__23: enterOuterAlt(_localctx, 3); { - setState(488); + setState(490); arrayliteral(); } break; case STRING: enterOuterAlt(_localctx, 4); { - setState(489); + setState(491); stringliteral(); } break; case SINGLECHAR: enterOuterAlt(_localctx, 5); { - setState(490); + setState(492); charliteral(); } break; case FLOAT_NUMBER: enterOuterAlt(_localctx, 6); { - setState(491); + setState(493); floatliteral(); } break; @@ -2992,9 +2993,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(494); + setState(496); match(T__81); - setState(495); + setState(497); match(INLINEASMBLOCK); } } @@ -3036,38 +3037,38 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(497); - match(T__82); - setState(498); - identifier(); setState(499); - match(T__60); + match(T__82); + setState(500); + identifier(); setState(501); + match(T__60); + setState(503); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0)) { { - setState(500); + setState(502); sub_params(); } } - setState(503); - match(T__61); setState(505); + match(T__61); + setState(507); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__83) { { - setState(504); + setState(506); sub_return_part(); } } { - setState(507); + setState(509); statement_block(); - setState(508); + setState(510); match(EOL); } } @@ -3099,9 +3100,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(510); + setState(512); match(T__83); - setState(511); + setState(513); sub_returns(); } } @@ -3140,16 +3141,16 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(513); + setState(515); match(T__84); - setState(514); + setState(516); match(EOL); - setState(519); + setState(521); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__65 - 64)) | (1L << (T__66 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__81 - 64)) | (1L << (T__82 - 64)) | (1L << (T__86 - 64)) | (1L << (T__89 - 64)) | (1L << (T__91 - 64)) | (1L << (T__92 - 64)) | (1L << (T__93 - 64)) | (1L << (T__94 - 64)) | (1L << (T__95 - 64)) | (1L << (T__96 - 64)) | (1L << (T__97 - 64)) | (1L << (T__98 - 64)) | (1L << (T__99 - 64)) | (1L << (T__100 - 64)) | (1L << (T__101 - 64)) | (1L << (T__102 - 64)) | (1L << (T__103 - 64)) | (1L << (T__105 - 64)) | (1L << (T__106 - 64)) | (1L << (EOL - 64)) | (1L << (NAME - 64)) | (1L << (ADDRESS_OF - 64)))) != 0)) { { - setState(517); + setState(519); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3200,13 +3201,13 @@ public class prog8Parser extends Parser { case NAME: case ADDRESS_OF: { - setState(515); + setState(517); statement(); } break; case EOL: { - setState(516); + setState(518); match(EOL); } break; @@ -3214,11 +3215,11 @@ public class prog8Parser extends Parser { throw new NoViableAltException(this); } } - setState(521); + setState(523); _errHandler.sync(this); _la = _input.LA(1); } - setState(522); + setState(524); match(T__85); } } @@ -3257,31 +3258,31 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(524); + setState(526); vardecl(); - setState(532); + setState(534); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(525); - match(T__13); setState(527); + match(T__13); + setState(529); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(526); + setState(528); match(EOL); } } - setState(529); + setState(531); vardecl(); } } - setState(534); + setState(536); _errHandler.sync(this); _la = _input.LA(1); } @@ -3322,31 +3323,31 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(535); + setState(537); datatype(); - setState(543); + setState(545); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(536); - match(T__13); setState(538); + match(T__13); + setState(540); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(537); + setState(539); match(EOL); } } - setState(540); + setState(542); datatype(); } } - setState(545); + setState(547); _errHandler.sync(this); _la = _input.LA(1); } @@ -3376,8 +3377,9 @@ public class prog8Parser extends Parser { public Asmsub_paramsContext asmsub_params() { return getRuleContext(Asmsub_paramsContext.class,0); } - public ClobberContext clobber() { - return getRuleContext(ClobberContext.class,0); + public TerminalNode EOL() { return getToken(prog8Parser.EOL, 0); } + public Asmsub_clobbersContext asmsub_clobbers() { + return getRuleContext(Asmsub_clobbersContext.class,0); } public Asmsub_returnsContext asmsub_returns() { return getRuleContext(Asmsub_returnsContext.class,0); @@ -3395,70 +3397,66 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(546); - match(T__86); - setState(547); - identifier(); setState(548); - match(T__60); + match(T__86); + setState(549); + identifier(); setState(550); + match(T__60); + setState(552); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0)) { { - setState(549); + setState(551); asmsub_params(); } } - setState(552); - match(T__61); - setState(553); - match(T__83); setState(554); - match(T__87); - setState(555); - match(T__60); - setState(557); + match(T__61); + setState(556); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (T__68 - 69)) | (1L << (T__69 - 69)) | (1L << (T__70 - 69)))) != 0)) { + if (_la==EOL) { { - setState(556); - clobber(); + setState(555); + match(EOL); } } setState(559); - match(T__61); - setState(560); - match(T__83); - setState(561); - match(T__60); - setState(563); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0)) { + if (_la==T__88) { { - setState(562); + setState(558); + asmsub_clobbers(); + } + } + + setState(562); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__83) { + { + setState(561); asmsub_returns(); } } - setState(565); - match(T__61); - setState(568); + setState(566); _errHandler.sync(this); switch (_input.LA(1)) { case T__14: { - setState(566); + setState(564); asmsub_address(); } break; case T__84: { - setState(567); + setState(565); statement_block(); } break; @@ -3495,9 +3493,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(570); + setState(568); match(T__14); - setState(571); + setState(569); ((Asmsub_addressContext)_localctx).address = integerliteral(); } } @@ -3536,31 +3534,31 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(573); + setState(571); asmsub_param(); - setState(581); + setState(579); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(574); + setState(572); match(T__13); - setState(576); + setState(574); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(575); + setState(573); match(EOL); } } - setState(578); + setState(576); asmsub_param(); } } - setState(583); + setState(581); _errHandler.sync(this); _la = _input.LA(1); } @@ -3600,11 +3598,11 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(584); + setState(582); vardecl(); - setState(585); + setState(583); match(T__63); - setState(589); + setState(587); _errHandler.sync(this); switch (_input.LA(1)) { case T__68: @@ -3614,7 +3612,7 @@ public class prog8Parser extends Parser { case T__72: case T__73: { - setState(586); + setState(584); registerorpair(); } break; @@ -3623,14 +3621,14 @@ public class prog8Parser extends Parser { case T__76: case T__77: { - setState(587); + setState(585); statusregister(); } break; - case T__88: + case T__87: { - setState(588); - ((Asmsub_paramContext)_localctx).stack = match(T__88); + setState(586); + ((Asmsub_paramContext)_localctx).stack = match(T__87); } break; default: @@ -3649,6 +3647,52 @@ public class prog8Parser extends Parser { return _localctx; } + public static class Asmsub_clobbersContext extends ParserRuleContext { + public ClobberContext clobber() { + return getRuleContext(ClobberContext.class,0); + } + public Asmsub_clobbersContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_asmsub_clobbers; } + } + + public final Asmsub_clobbersContext asmsub_clobbers() throws RecognitionException { + Asmsub_clobbersContext _localctx = new Asmsub_clobbersContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_asmsub_clobbers); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(589); + match(T__88); + setState(590); + match(T__60); + setState(592); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (T__68 - 69)) | (1L << (T__69 - 69)) | (1L << (T__70 - 69)))) != 0)) { + { + setState(591); + clobber(); + } + } + + setState(594); + match(T__61); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class ClobberContext extends ParserRuleContext { public List register() { return getRuleContexts(RegisterContext.class); @@ -3664,26 +3708,26 @@ public class prog8Parser extends Parser { public final ClobberContext clobber() throws RecognitionException { ClobberContext _localctx = new ClobberContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_clobber); + enterRule(_localctx, 108, RULE_clobber); int _la; try { enterOuterAlt(_localctx, 1); { - setState(591); - register(); setState(596); + register(); + setState(601); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(592); + setState(597); match(T__13); - setState(593); + setState(598); register(); } } - setState(598); + setState(603); _errHandler.sync(this); _la = _input.LA(1); } @@ -3719,36 +3763,38 @@ public class prog8Parser extends Parser { public final Asmsub_returnsContext asmsub_returns() throws RecognitionException { Asmsub_returnsContext _localctx = new Asmsub_returnsContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_asmsub_returns); + enterRule(_localctx, 110, RULE_asmsub_returns); int _la; try { enterOuterAlt(_localctx, 1); { - setState(599); + setState(604); + match(T__83); + setState(605); asmsub_return(); - setState(607); + setState(613); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__13) { { { - setState(600); + setState(606); match(T__13); - setState(602); + setState(608); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(601); + setState(607); match(EOL); } } - setState(604); + setState(610); asmsub_return(); } } - setState(609); + setState(615); _errHandler.sync(this); _la = _input.LA(1); } @@ -3784,15 +3830,15 @@ public class prog8Parser extends Parser { public final Asmsub_returnContext asmsub_return() throws RecognitionException { Asmsub_returnContext _localctx = new Asmsub_returnContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_asmsub_return); + enterRule(_localctx, 112, RULE_asmsub_return); try { enterOuterAlt(_localctx, 1); { - setState(610); + setState(616); datatype(); - setState(611); + setState(617); match(T__63); - setState(615); + setState(621); _errHandler.sync(this); switch (_input.LA(1)) { case T__68: @@ -3802,7 +3848,7 @@ public class prog8Parser extends Parser { case T__72: case T__73: { - setState(612); + setState(618); registerorpair(); } break; @@ -3811,14 +3857,14 @@ public class prog8Parser extends Parser { case T__76: case T__77: { - setState(613); + setState(619); statusregister(); } break; - case T__88: + case T__87: { - setState(614); - ((Asmsub_returnContext)_localctx).stack = match(T__88); + setState(620); + ((Asmsub_returnContext)_localctx).stack = match(T__87); } break; default: @@ -3862,26 +3908,26 @@ public class prog8Parser extends Parser { public final If_stmtContext if_stmt() throws RecognitionException { If_stmtContext _localctx = new If_stmtContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_if_stmt); + enterRule(_localctx, 114, RULE_if_stmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(617); + setState(623); match(T__89); - setState(618); + setState(624); expression(0); - setState(620); + setState(626); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(619); + setState(625); match(EOL); } } - setState(624); + setState(630); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3932,35 +3978,35 @@ public class prog8Parser extends Parser { case NAME: case ADDRESS_OF: { - setState(622); + setState(628); statement(); } break; case T__84: { - setState(623); + setState(629); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(627); + setState(633); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: { - setState(626); + setState(632); match(EOL); } break; } - setState(630); + setState(636); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,78,_ctx) ) { case 1: { - setState(629); + setState(635); else_part(); } break; @@ -3994,24 +4040,24 @@ public class prog8Parser extends Parser { public final Else_partContext else_part() throws RecognitionException { Else_partContext _localctx = new Else_partContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_else_part); + enterRule(_localctx, 116, RULE_else_part); int _la; try { enterOuterAlt(_localctx, 1); { - setState(632); + setState(638); match(T__90); - setState(634); + setState(640); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(633); + setState(639); match(EOL); } } - setState(638); + setState(644); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -4062,13 +4108,13 @@ public class prog8Parser extends Parser { case NAME: case ADDRESS_OF: { - setState(636); + setState(642); statement(); } break; case T__84: { - setState(637); + setState(643); statement_block(); } break; @@ -4113,24 +4159,24 @@ public class prog8Parser extends Parser { public final Branch_stmtContext branch_stmt() throws RecognitionException { Branch_stmtContext _localctx = new Branch_stmtContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_branch_stmt); + enterRule(_localctx, 118, RULE_branch_stmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(640); + setState(646); branchcondition(); - setState(642); + setState(648); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(641); + setState(647); match(EOL); } } - setState(646); + setState(652); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -4181,40 +4227,40 @@ public class prog8Parser extends Parser { case NAME: case ADDRESS_OF: { - setState(644); + setState(650); statement(); } break; case T__84: { - setState(645); + setState(651); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(649); + setState(655); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: { - setState(648); + setState(654); match(EOL); } break; } - setState(652); + setState(658); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__90) { { - setState(651); + setState(657); else_part(); } } - setState(654); + setState(660); match(EOL); } } @@ -4238,12 +4284,12 @@ public class prog8Parser extends Parser { public final BranchconditionContext branchcondition() throws RecognitionException { BranchconditionContext _localctx = new BranchconditionContext(_ctx, getState()); - enterRule(_localctx, 118, RULE_branchcondition); + enterRule(_localctx, 120, RULE_branchcondition); int _la; try { enterOuterAlt(_localctx, 1); { - setState(656); + setState(662); _la = _input.LA(1); if ( !(((((_la - 92)) & ~0x3f) == 0 && ((1L << (_la - 92)) & ((1L << (T__91 - 92)) | (1L << (T__92 - 92)) | (1L << (T__93 - 92)) | (1L << (T__94 - 92)) | (1L << (T__95 - 92)) | (1L << (T__96 - 92)) | (1L << (T__97 - 92)) | (1L << (T__98 - 92)) | (1L << (T__99 - 92)) | (1L << (T__100 - 92)) | (1L << (T__101 - 92)) | (1L << (T__102 - 92)))) != 0)) ) { _errHandler.recoverInline(this); @@ -4295,68 +4341,68 @@ public class prog8Parser extends Parser { public final ForloopContext forloop() throws RecognitionException { ForloopContext _localctx = new ForloopContext(_ctx, getState()); - enterRule(_localctx, 120, RULE_forloop); + enterRule(_localctx, 122, RULE_forloop); int _la; try { enterOuterAlt(_localctx, 1); { - setState(658); + setState(664); match(T__103); - setState(660); + setState(666); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0)) { { - setState(659); + setState(665); datatype(); } } - setState(663); + setState(669); _errHandler.sync(this); _la = _input.LA(1); if (_la==ZEROPAGE) { { - setState(662); + setState(668); match(ZEROPAGE); } } - setState(667); + setState(673); _errHandler.sync(this); switch (_input.LA(1)) { case T__68: case T__69: case T__70: { - setState(665); + setState(671); register(); } break; case NAME: { - setState(666); + setState(672); identifier(); } break; default: throw new NoViableAltException(this); } - setState(669); + setState(675); match(T__104); - setState(670); + setState(676); expression(0); - setState(672); + setState(678); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(671); + setState(677); match(EOL); } } - setState(676); + setState(682); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -4407,13 +4453,13 @@ public class prog8Parser extends Parser { case NAME: case ADDRESS_OF: { - setState(674); + setState(680); statement(); } break; case T__84: { - setState(675); + setState(681); statement_block(); } break; @@ -4452,26 +4498,26 @@ public class prog8Parser extends Parser { public final WhileloopContext whileloop() throws RecognitionException { WhileloopContext _localctx = new WhileloopContext(_ctx, getState()); - enterRule(_localctx, 122, RULE_whileloop); + enterRule(_localctx, 124, RULE_whileloop); int _la; try { enterOuterAlt(_localctx, 1); { - setState(678); + setState(684); match(T__105); - setState(679); + setState(685); expression(0); - setState(681); + setState(687); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(680); + setState(686); match(EOL); } } - setState(685); + setState(691); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -4522,13 +4568,13 @@ public class prog8Parser extends Parser { case NAME: case ADDRESS_OF: { - setState(683); + setState(689); statement(); } break; case T__84: { - setState(684); + setState(690); statement_block(); } break; @@ -4567,14 +4613,14 @@ public class prog8Parser extends Parser { public final RepeatloopContext repeatloop() throws RecognitionException { RepeatloopContext _localctx = new RepeatloopContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_repeatloop); + enterRule(_localctx, 126, RULE_repeatloop); int _la; try { enterOuterAlt(_localctx, 1); { - setState(687); + setState(693); match(T__106); - setState(690); + setState(696); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -4625,32 +4671,32 @@ public class prog8Parser extends Parser { case NAME: case ADDRESS_OF: { - setState(688); + setState(694); statement(); } break; case T__84: { - setState(689); + setState(695); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(693); + setState(699); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(692); + setState(698); match(EOL); } } - setState(695); + setState(701); match(T__107); - setState(696); + setState(702); expression(0); } } @@ -4707,7 +4753,7 @@ public class prog8Parser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3}\u02bd\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3}\u02c3\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"+ @@ -4715,273 +4761,275 @@ public class prog8Parser extends Parser { "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ - "\4>\t>\4?\t?\4@\t@\3\2\3\2\7\2\u0083\n\2\f\2\16\2\u0086\13\2\3\2\3\2\3"+ - "\3\3\3\5\3\u008c\n\3\3\4\3\4\3\4\5\4\u0091\n\4\3\4\3\4\3\4\3\5\3\5\3\5"+ - "\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+ - "\5\3\5\5\5\u00ac\n\5\3\6\3\6\3\6\3\7\3\7\3\7\5\7\u00b4\n\7\3\b\3\b\5\b"+ - "\u00b8\n\b\3\b\3\b\3\b\7\b\u00bd\n\b\f\b\16\b\u00c0\13\b\5\b\u00c2\n\b"+ - "\3\t\3\t\3\t\5\t\u00c7\n\t\3\n\3\n\5\n\u00cb\n\n\3\n\3\n\5\n\u00cf\n\n"+ - "\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\17\3"+ - "\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\7\21\u00ea\n\21\f\21"+ - "\16\21\u00ed\13\21\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\5\23\u00f7"+ + "\4>\t>\4?\t?\4@\t@\4A\tA\3\2\3\2\7\2\u0085\n\2\f\2\16\2\u0088\13\2\3\2"+ + "\3\2\3\3\3\3\5\3\u008e\n\3\3\4\3\4\3\4\5\4\u0093\n\4\3\4\3\4\3\4\3\5\3"+ + "\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5"+ + "\3\5\3\5\3\5\5\5\u00ae\n\5\3\6\3\6\3\6\3\7\3\7\3\7\5\7\u00b6\n\7\3\b\3"+ + "\b\5\b\u00ba\n\b\3\b\3\b\3\b\7\b\u00bf\n\b\f\b\16\b\u00c2\13\b\5\b\u00c4"+ + "\n\b\3\t\3\t\3\t\5\t\u00c9\n\t\3\n\3\n\5\n\u00cd\n\n\3\n\3\n\5\n\u00d1"+ + "\n\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\17"+ + "\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\7\21\u00ec\n\21\f\21"+ + "\16\21\u00ef\13\21\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\5\23\u00f9"+ "\n\23\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+ - "\3\25\3\25\3\25\3\25\3\25\3\25\5\25\u010c\n\25\3\25\3\25\5\25\u0110\n"+ - "\25\3\25\3\25\5\25\u0114\n\25\3\25\3\25\3\25\5\25\u0119\n\25\3\25\3\25"+ - "\5\25\u011d\n\25\3\25\3\25\3\25\5\25\u0122\n\25\3\25\3\25\5\25\u0126\n"+ - "\25\3\25\3\25\3\25\5\25\u012b\n\25\3\25\3\25\5\25\u012f\n\25\3\25\3\25"+ - "\3\25\5\25\u0134\n\25\3\25\3\25\5\25\u0138\n\25\3\25\3\25\3\25\5\25\u013d"+ - "\n\25\3\25\3\25\5\25\u0141\n\25\3\25\3\25\3\25\5\25\u0146\n\25\3\25\3"+ - "\25\5\25\u014a\n\25\3\25\3\25\3\25\5\25\u014f\n\25\3\25\3\25\5\25\u0153"+ - "\n\25\3\25\3\25\3\25\5\25\u0158\n\25\3\25\3\25\5\25\u015c\n\25\3\25\3"+ - "\25\3\25\5\25\u0161\n\25\3\25\3\25\5\25\u0165\n\25\3\25\3\25\3\25\5\25"+ - "\u016a\n\25\3\25\3\25\5\25\u016e\n\25\3\25\3\25\3\25\5\25\u0173\n\25\3"+ - "\25\3\25\5\25\u0177\n\25\3\25\3\25\3\25\3\25\3\25\3\25\5\25\u017f\n\25"+ - "\3\25\3\25\7\25\u0183\n\25\f\25\16\25\u0186\13\25\3\26\3\26\3\26\3\27"+ + "\3\25\3\25\3\25\3\25\3\25\3\25\5\25\u010e\n\25\3\25\3\25\5\25\u0112\n"+ + "\25\3\25\3\25\5\25\u0116\n\25\3\25\3\25\3\25\5\25\u011b\n\25\3\25\3\25"+ + "\5\25\u011f\n\25\3\25\3\25\3\25\5\25\u0124\n\25\3\25\3\25\5\25\u0128\n"+ + "\25\3\25\3\25\3\25\5\25\u012d\n\25\3\25\3\25\5\25\u0131\n\25\3\25\3\25"+ + "\3\25\5\25\u0136\n\25\3\25\3\25\5\25\u013a\n\25\3\25\3\25\3\25\5\25\u013f"+ + "\n\25\3\25\3\25\5\25\u0143\n\25\3\25\3\25\3\25\5\25\u0148\n\25\3\25\3"+ + "\25\5\25\u014c\n\25\3\25\3\25\3\25\5\25\u0151\n\25\3\25\3\25\5\25\u0155"+ + "\n\25\3\25\3\25\3\25\5\25\u015a\n\25\3\25\3\25\5\25\u015e\n\25\3\25\3"+ + "\25\3\25\5\25\u0163\n\25\3\25\3\25\5\25\u0167\n\25\3\25\3\25\3\25\5\25"+ + "\u016c\n\25\3\25\3\25\5\25\u0170\n\25\3\25\3\25\3\25\5\25\u0175\n\25\3"+ + "\25\3\25\5\25\u0179\n\25\3\25\3\25\3\25\3\25\3\25\3\25\5\25\u0181\n\25"+ + "\3\25\3\25\7\25\u0185\n\25\f\25\16\25\u0188\13\25\3\26\3\26\3\26\3\27"+ "\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\32\3\32\3\32\5\32"+ - "\u0199\n\32\3\32\3\32\3\33\3\33\3\33\5\33\u01a0\n\33\3\33\3\33\3\34\3"+ - "\34\3\34\5\34\u01a7\n\34\3\34\7\34\u01aa\n\34\f\34\16\34\u01ad\13\34\3"+ - "\35\3\35\5\35\u01b1\n\35\3\36\3\36\3\37\3\37\3 \3 \3!\3!\3!\7!\u01bc\n"+ - "!\f!\16!\u01bf\13!\3\"\3\"\3#\3#\3$\3$\3%\3%\5%\u01c9\n%\3&\3&\3\'\3\'"+ - "\3(\3(\5(\u01d1\n(\3(\3(\3(\5(\u01d6\n(\3(\7(\u01d9\n(\f(\16(\u01dc\13"+ - "(\3(\5(\u01df\n(\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3,\3,\3,\3,\5,\u01ef\n"+ - ",\3-\3-\3-\3.\3.\3.\3.\5.\u01f8\n.\3.\3.\5.\u01fc\n.\3.\3.\3.\3/\3/\3"+ - "/\3\60\3\60\3\60\3\60\7\60\u0208\n\60\f\60\16\60\u020b\13\60\3\60\3\60"+ - "\3\61\3\61\3\61\5\61\u0212\n\61\3\61\7\61\u0215\n\61\f\61\16\61\u0218"+ - "\13\61\3\62\3\62\3\62\5\62\u021d\n\62\3\62\7\62\u0220\n\62\f\62\16\62"+ - "\u0223\13\62\3\63\3\63\3\63\3\63\5\63\u0229\n\63\3\63\3\63\3\63\3\63\3"+ - "\63\5\63\u0230\n\63\3\63\3\63\3\63\3\63\5\63\u0236\n\63\3\63\3\63\3\63"+ - "\5\63\u023b\n\63\3\64\3\64\3\64\3\65\3\65\3\65\5\65\u0243\n\65\3\65\7"+ - "\65\u0246\n\65\f\65\16\65\u0249\13\65\3\66\3\66\3\66\3\66\3\66\5\66\u0250"+ - "\n\66\3\67\3\67\3\67\7\67\u0255\n\67\f\67\16\67\u0258\13\67\38\38\38\5"+ - "8\u025d\n8\38\78\u0260\n8\f8\168\u0263\138\39\39\39\39\39\59\u026a\n9"+ - "\3:\3:\3:\5:\u026f\n:\3:\3:\5:\u0273\n:\3:\5:\u0276\n:\3:\5:\u0279\n:"+ - "\3;\3;\5;\u027d\n;\3;\3;\5;\u0281\n;\3<\3<\5<\u0285\n<\3<\3<\5<\u0289"+ - "\n<\3<\5<\u028c\n<\3<\5<\u028f\n<\3<\3<\3=\3=\3>\3>\5>\u0297\n>\3>\5>"+ - "\u029a\n>\3>\3>\5>\u029e\n>\3>\3>\3>\5>\u02a3\n>\3>\3>\5>\u02a7\n>\3?"+ - "\3?\3?\5?\u02ac\n?\3?\3?\5?\u02b0\n?\3@\3@\3@\5@\u02b5\n@\3@\5@\u02b8"+ - "\n@\3@\3@\3@\3@\2\3(A\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,."+ - "\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\2\22\3\2\6\17\3\2\23"+ - "\31\3\2\34&\3\2\'(\4\2\3\3)*\3\2,.\3\2)*\3\2/\60\3\2\61\64\3\2\65\66\3"+ - "\2GI\3\2GL\3\2MP\3\2tv\3\2RS\3\2^i\2\u030b\2\u0084\3\2\2\2\4\u008b\3\2"+ - "\2\2\6\u008d\3\2\2\2\b\u00ab\3\2\2\2\n\u00ad\3\2\2\2\f\u00b0\3\2\2\2\16"+ - "\u00b5\3\2\2\2\20\u00c6\3\2\2\2\22\u00c8\3\2\2\2\24\u00d2\3\2\2\2\26\u00d6"+ - "\3\2\2\2\30\u00d9\3\2\2\2\32\u00dc\3\2\2\2\34\u00de\3\2\2\2\36\u00e2\3"+ - "\2\2\2 \u00e6\3\2\2\2\"\u00ee\3\2\2\2$\u00f6\3\2\2\2&\u00f8\3\2\2\2(\u010b"+ - "\3\2\2\2*\u0187\3\2\2\2,\u018a\3\2\2\2.\u018d\3\2\2\2\60\u0192\3\2\2\2"+ - "\62\u0195\3\2\2\2\64\u019c\3\2\2\2\66\u01a3\3\2\2\28\u01ae\3\2\2\2:\u01b2"+ - "\3\2\2\2<\u01b4\3\2\2\2>\u01b6\3\2\2\2@\u01b8\3\2\2\2B\u01c0\3\2\2\2D"+ - "\u01c2\3\2\2\2F\u01c4\3\2\2\2H\u01c6\3\2\2\2J\u01ca\3\2\2\2L\u01cc\3\2"+ - "\2\2N\u01ce\3\2\2\2P\u01e2\3\2\2\2R\u01e4\3\2\2\2T\u01e6\3\2\2\2V\u01ee"+ - "\3\2\2\2X\u01f0\3\2\2\2Z\u01f3\3\2\2\2\\\u0200\3\2\2\2^\u0203\3\2\2\2"+ - "`\u020e\3\2\2\2b\u0219\3\2\2\2d\u0224\3\2\2\2f\u023c\3\2\2\2h\u023f\3"+ - "\2\2\2j\u024a\3\2\2\2l\u0251\3\2\2\2n\u0259\3\2\2\2p\u0264\3\2\2\2r\u026b"+ - "\3\2\2\2t\u027a\3\2\2\2v\u0282\3\2\2\2x\u0292\3\2\2\2z\u0294\3\2\2\2|"+ - "\u02a8\3\2\2\2~\u02b1\3\2\2\2\u0080\u0083\5\4\3\2\u0081\u0083\7r\2\2\u0082"+ - "\u0080\3\2\2\2\u0082\u0081\3\2\2\2\u0083\u0086\3\2\2\2\u0084\u0082\3\2"+ - "\2\2\u0084\u0085\3\2\2\2\u0085\u0087\3\2\2\2\u0086\u0084\3\2\2\2\u0087"+ - "\u0088\7\2\2\3\u0088\3\3\2\2\2\u0089\u008c\5\16\b\2\u008a\u008c\5\6\4"+ - "\2\u008b\u0089\3\2\2\2\u008b\u008a\3\2\2\2\u008c\5\3\2\2\2\u008d\u008e"+ - "\7\3\2\2\u008e\u0090\5> \2\u008f\u0091\5H%\2\u0090\u008f\3\2\2\2\u0090"+ - "\u0091\3\2\2\2\u0091\u0092\3\2\2\2\u0092\u0093\5^\60\2\u0093\u0094\7r"+ - "\2\2\u0094\7\3\2\2\2\u0095\u00ac\5\16\b\2\u0096\u00ac\5\24\13\2\u0097"+ - "\u00ac\5\22\n\2\u0098\u00ac\5\26\f\2\u0099\u00ac\5\30\r\2\u009a\u00ac"+ - "\5\36\20\2\u009b\u00ac\5\"\22\2\u009c\u00ac\5\f\7\2\u009d\u00ac\5&\24"+ - "\2\u009e\u00ac\5\64\33\2\u009f\u00ac\5r:\2\u00a0\u00ac\5v<\2\u00a1\u00ac"+ - "\5Z.\2\u00a2\u00ac\5d\63\2\u00a3\u00ac\5X-\2\u00a4\u00ac\58\35\2\u00a5"+ - "\u00ac\5z>\2\u00a6\u00ac\5|?\2\u00a7\u00ac\5~@\2\u00a8\u00ac\5:\36\2\u00a9"+ - "\u00ac\5<\37\2\u00aa\u00ac\5\n\6\2\u00ab\u0095\3\2\2\2\u00ab\u0096\3\2"+ - "\2\2\u00ab\u0097\3\2\2\2\u00ab\u0098\3\2\2\2\u00ab\u0099\3\2\2\2\u00ab"+ - "\u009a\3\2\2\2\u00ab\u009b\3\2\2\2\u00ab\u009c\3\2\2\2\u00ab\u009d\3\2"+ - "\2\2\u00ab\u009e\3\2\2\2\u00ab\u009f\3\2\2\2\u00ab\u00a0\3\2\2\2\u00ab"+ - "\u00a1\3\2\2\2\u00ab\u00a2\3\2\2\2\u00ab\u00a3\3\2\2\2\u00ab\u00a4\3\2"+ - "\2\2\u00ab\u00a5\3\2\2\2\u00ab\u00a6\3\2\2\2\u00ab\u00a7\3\2\2\2\u00ab"+ - "\u00a8\3\2\2\2\u00ab\u00a9\3\2\2\2\u00ab\u00aa\3\2\2\2\u00ac\t\3\2\2\2"+ - "\u00ad\u00ae\5> \2\u00ae\u00af\7\4\2\2\u00af\13\3\2\2\2\u00b0\u00b3\7"+ - "\5\2\2\u00b1\u00b4\5H%\2\u00b2\u00b4\5@!\2\u00b3\u00b1\3\2\2\2\u00b3\u00b2"+ - "\3\2\2\2\u00b4\r\3\2\2\2\u00b5\u00c1\t\2\2\2\u00b6\u00b8\5\20\t\2\u00b7"+ - "\u00b6\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\u00c2\3\2\2\2\u00b9\u00be\5\20"+ - "\t\2\u00ba\u00bb\7\20\2\2\u00bb\u00bd\5\20\t\2\u00bc\u00ba\3\2\2\2\u00bd"+ - "\u00c0\3\2\2\2\u00be\u00bc\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf\u00c2\3\2"+ - "\2\2\u00c0\u00be\3\2\2\2\u00c1\u00b7\3\2\2\2\u00c1\u00b9\3\2\2\2\u00c2"+ - "\17\3\2\2\2\u00c3\u00c7\5P)\2\u00c4\u00c7\5> \2\u00c5\u00c7\5H%\2\u00c6"+ - "\u00c3\3\2\2\2\u00c6\u00c4\3\2\2\2\u00c6\u00c5\3\2\2\2\u00c7\21\3\2\2"+ - "\2\u00c8\u00ca\5\32\16\2\u00c9\u00cb\7|\2\2\u00ca\u00c9\3\2\2\2\u00ca"+ - "\u00cb\3\2\2\2\u00cb\u00ce\3\2\2\2\u00cc\u00cf\5\34\17\2\u00cd\u00cf\7"+ - "}\2\2\u00ce\u00cc\3\2\2\2\u00ce\u00cd\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf"+ - "\u00d0\3\2\2\2\u00d0\u00d1\5> \2\u00d1\23\3\2\2\2\u00d2\u00d3\5\22\n\2"+ - "\u00d3\u00d4\7\21\2\2\u00d4\u00d5\5(\25\2\u00d5\25\3\2\2\2\u00d6\u00d7"+ - "\7\22\2\2\u00d7\u00d8\5\24\13\2\u00d8\27\3\2\2\2\u00d9\u00da\7w\2\2\u00da"+ - "\u00db\5\24\13\2\u00db\31\3\2\2\2\u00dc\u00dd\t\3\2\2\u00dd\33\3\2\2\2"+ - "\u00de\u00df\7\32\2\2\u00df\u00e0\5(\25\2\u00e0\u00e1\7\33\2\2\u00e1\35"+ - "\3\2\2\2\u00e2\u00e3\5 \21\2\u00e3\u00e4\7\21\2\2\u00e4\u00e5\5(\25\2"+ - "\u00e5\37\3\2\2\2\u00e6\u00eb\5$\23\2\u00e7\u00e8\7\20\2\2\u00e8\u00ea"+ - "\5$\23\2\u00e9\u00e7\3\2\2\2\u00ea\u00ed\3\2\2\2\u00eb\u00e9\3\2\2\2\u00eb"+ - "\u00ec\3\2\2\2\u00ec!\3\2\2\2\u00ed\u00eb\3\2\2\2\u00ee\u00ef\5$\23\2"+ - "\u00ef\u00f0\t\4\2\2\u00f0\u00f1\5(\25\2\u00f1#\3\2\2\2\u00f2\u00f7\5"+ - "B\"\2\u00f3\u00f7\5@!\2\u00f4\u00f7\5,\27\2\u00f5\u00f7\5.\30\2\u00f6"+ - "\u00f2\3\2\2\2\u00f6\u00f3\3\2\2\2\u00f6\u00f4\3\2\2\2\u00f6\u00f5\3\2"+ - "\2\2\u00f7%\3\2\2\2\u00f8\u00f9\5$\23\2\u00f9\u00fa\t\5\2\2\u00fa\'\3"+ - "\2\2\2\u00fb\u00fc\b\25\1\2\u00fc\u010c\5\62\32\2\u00fd\u00fe\t\6\2\2"+ - "\u00fe\u010c\5(\25\31\u00ff\u0100\7>\2\2\u0100\u010c\5(\25\13\u0101\u010c"+ - "\5V,\2\u0102\u010c\5B\"\2\u0103\u010c\5@!\2\u0104\u010c\5,\27\2\u0105"+ - "\u010c\5.\30\2\u0106\u010c\5\60\31\2\u0107\u0108\7?\2\2\u0108\u0109\5"+ - "(\25\2\u0109\u010a\7@\2\2\u010a\u010c\3\2\2\2\u010b\u00fb\3\2\2\2\u010b"+ - "\u00fd\3\2\2\2\u010b\u00ff\3\2\2\2\u010b\u0101\3\2\2\2\u010b\u0102\3\2"+ - "\2\2\u010b\u0103\3\2\2\2\u010b\u0104\3\2\2\2\u010b\u0105\3\2\2\2\u010b"+ - "\u0106\3\2\2\2\u010b\u0107\3\2\2\2\u010c\u0184\3\2\2\2\u010d\u010f\f\30"+ - "\2\2\u010e\u0110\7r\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110"+ - "\u0111\3\2\2\2\u0111\u0113\7+\2\2\u0112\u0114\7r\2\2\u0113\u0112\3\2\2"+ - "\2\u0113\u0114\3\2\2\2\u0114\u0115\3\2\2\2\u0115\u0183\5(\25\31\u0116"+ - "\u0118\f\27\2\2\u0117\u0119\7r\2\2\u0118\u0117\3\2\2\2\u0118\u0119\3\2"+ - "\2\2\u0119\u011a\3\2\2\2\u011a\u011c\t\7\2\2\u011b\u011d\7r\2\2\u011c"+ - "\u011b\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u0183\5("+ - "\25\30\u011f\u0121\f\26\2\2\u0120\u0122\7r\2\2\u0121\u0120\3\2\2\2\u0121"+ - "\u0122\3\2\2\2\u0122\u0123\3\2\2\2\u0123\u0125\t\b\2\2\u0124\u0126\7r"+ - "\2\2\u0125\u0124\3\2\2\2\u0125\u0126\3\2\2\2\u0126\u0127\3\2\2\2\u0127"+ - "\u0183\5(\25\27\u0128\u012a\f\25\2\2\u0129\u012b\7r\2\2\u012a\u0129\3"+ - "\2\2\2\u012a\u012b\3\2\2\2\u012b\u012c\3\2\2\2\u012c\u012e\t\t\2\2\u012d"+ - "\u012f\7r\2\2\u012e\u012d\3\2\2\2\u012e\u012f\3\2\2\2\u012f\u0130\3\2"+ - "\2\2\u0130\u0183\5(\25\26\u0131\u0133\f\24\2\2\u0132\u0134\7r\2\2\u0133"+ - "\u0132\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0135\3\2\2\2\u0135\u0137\t\n"+ - "\2\2\u0136\u0138\7r\2\2\u0137\u0136\3\2\2\2\u0137\u0138\3\2\2\2\u0138"+ - "\u0139\3\2\2\2\u0139\u0183\5(\25\25\u013a\u013c\f\23\2\2\u013b\u013d\7"+ - "r\2\2\u013c\u013b\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u013e\3\2\2\2\u013e"+ - "\u0140\t\13\2\2\u013f\u0141\7r\2\2\u0140\u013f\3\2\2\2\u0140\u0141\3\2"+ - "\2\2\u0141\u0142\3\2\2\2\u0142\u0183\5(\25\24\u0143\u0145\f\22\2\2\u0144"+ - "\u0146\7r\2\2\u0145\u0144\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0147\3\2"+ - "\2\2\u0147\u0149\7w\2\2\u0148\u014a\7r\2\2\u0149\u0148\3\2\2\2\u0149\u014a"+ - "\3\2\2\2\u014a\u014b\3\2\2\2\u014b\u0183\5(\25\23\u014c\u014e\f\21\2\2"+ - "\u014d\u014f\7r\2\2\u014e\u014d\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u0150"+ - "\3\2\2\2\u0150\u0152\7\67\2\2\u0151\u0153\7r\2\2\u0152\u0151\3\2\2\2\u0152"+ - "\u0153\3\2\2\2\u0153\u0154\3\2\2\2\u0154\u0183\5(\25\22\u0155\u0157\f"+ - "\20\2\2\u0156\u0158\7r\2\2\u0157\u0156\3\2\2\2\u0157\u0158\3\2\2\2\u0158"+ - "\u0159\3\2\2\2\u0159\u015b\78\2\2\u015a\u015c\7r\2\2\u015b\u015a\3\2\2"+ - "\2\u015b\u015c\3\2\2\2\u015c\u015d\3\2\2\2\u015d\u0183\5(\25\21\u015e"+ - "\u0160\f\16\2\2\u015f\u0161\7r\2\2\u0160\u015f\3\2\2\2\u0160\u0161\3\2"+ - "\2\2\u0161\u0162\3\2\2\2\u0162\u0164\7;\2\2\u0163\u0165\7r\2\2\u0164\u0163"+ - "\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0166\3\2\2\2\u0166\u0183\5(\25\17"+ - "\u0167\u0169\f\r\2\2\u0168\u016a\7r\2\2\u0169\u0168\3\2\2\2\u0169\u016a"+ - "\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u016d\7<\2\2\u016c\u016e\7r\2\2\u016d"+ - "\u016c\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0183\5("+ - "\25\16\u0170\u0172\f\f\2\2\u0171\u0173\7r\2\2\u0172\u0171\3\2\2\2\u0172"+ - "\u0173\3\2\2\2\u0173\u0174\3\2\2\2\u0174\u0176\7=\2\2\u0175\u0177\7r\2"+ - "\2\u0176\u0175\3\2\2\2\u0176\u0177\3\2\2\2\u0177\u0178\3\2\2\2\u0178\u0183"+ - "\5(\25\r\u0179\u017a\f\17\2\2\u017a\u017b\79\2\2\u017b\u017e\5(\25\2\u017c"+ - "\u017d\7:\2\2\u017d\u017f\5(\25\2\u017e\u017c\3\2\2\2\u017e\u017f\3\2"+ - "\2\2\u017f\u0183\3\2\2\2\u0180\u0181\f\4\2\2\u0181\u0183\5*\26\2\u0182"+ - "\u010d\3\2\2\2\u0182\u0116\3\2\2\2\u0182\u011f\3\2\2\2\u0182\u0128\3\2"+ - "\2\2\u0182\u0131\3\2\2\2\u0182\u013a\3\2\2\2\u0182\u0143\3\2\2\2\u0182"+ - "\u014c\3\2\2\2\u0182\u0155\3\2\2\2\u0182\u015e\3\2\2\2\u0182\u0167\3\2"+ - "\2\2\u0182\u0170\3\2\2\2\u0182\u0179\3\2\2\2\u0182\u0180\3\2\2\2\u0183"+ - "\u0186\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0185\3\2\2\2\u0185)\3\2\2\2"+ - "\u0186\u0184\3\2\2\2\u0187\u0188\7A\2\2\u0188\u0189\5\32\16\2\u0189+\3"+ - "\2\2\2\u018a\u018b\5@!\2\u018b\u018c\5\34\17\2\u018c-\3\2\2\2\u018d\u018e"+ - "\7B\2\2\u018e\u018f\7?\2\2\u018f\u0190\5(\25\2\u0190\u0191\7@\2\2\u0191"+ - "/\3\2\2\2\u0192\u0193\7w\2\2\u0193\u0194\5@!\2\u0194\61\3\2\2\2\u0195"+ - "\u0196\5@!\2\u0196\u0198\7?\2\2\u0197\u0199\5\66\34\2\u0198\u0197\3\2"+ - "\2\2\u0198\u0199\3\2\2\2\u0199\u019a\3\2\2\2\u019a\u019b\7@\2\2\u019b"+ - "\63\3\2\2\2\u019c\u019d\5@!\2\u019d\u019f\7?\2\2\u019e\u01a0\5\66\34\2"+ - "\u019f\u019e\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a2"+ - "\7@\2\2\u01a2\65\3\2\2\2\u01a3\u01ab\5(\25\2\u01a4\u01a6\7\20\2\2\u01a5"+ - "\u01a7\7r\2\2\u01a6\u01a5\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a8\3\2"+ - "\2\2\u01a8\u01aa\5(\25\2\u01a9\u01a4\3\2\2\2\u01aa\u01ad\3\2\2\2\u01ab"+ - "\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\67\3\2\2\2\u01ad\u01ab\3\2\2"+ - "\2\u01ae\u01b0\7C\2\2\u01af\u01b1\5\66\34\2\u01b0\u01af\3\2\2\2\u01b0"+ - "\u01b1\3\2\2\2\u01b19\3\2\2\2\u01b2\u01b3\7D\2\2\u01b3;\3\2\2\2\u01b4"+ - "\u01b5\7E\2\2\u01b5=\3\2\2\2\u01b6\u01b7\7s\2\2\u01b7?\3\2\2\2\u01b8\u01bd"+ - "\7s\2\2\u01b9\u01ba\7F\2\2\u01ba\u01bc\7s\2\2\u01bb\u01b9\3\2\2\2\u01bc"+ - "\u01bf\3\2\2\2\u01bd\u01bb\3\2\2\2\u01bd\u01be\3\2\2\2\u01beA\3\2\2\2"+ - "\u01bf\u01bd\3\2\2\2\u01c0\u01c1\t\f\2\2\u01c1C\3\2\2\2\u01c2\u01c3\t"+ - "\r\2\2\u01c3E\3\2\2\2\u01c4\u01c5\t\16\2\2\u01c5G\3\2\2\2\u01c6\u01c8"+ - "\t\17\2\2\u01c7\u01c9\5J&\2\u01c8\u01c7\3\2\2\2\u01c8\u01c9\3\2\2\2\u01c9"+ - "I\3\2\2\2\u01ca\u01cb\7Q\2\2\u01cbK\3\2\2\2\u01cc\u01cd\t\20\2\2\u01cd"+ - "M\3\2\2\2\u01ce\u01d0\7\32\2\2\u01cf\u01d1\7r\2\2\u01d0\u01cf\3\2\2\2"+ - "\u01d0\u01d1\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01da\5(\25\2\u01d3\u01d5"+ - "\7\20\2\2\u01d4\u01d6\7r\2\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6"+ - "\u01d7\3\2\2\2\u01d7\u01d9\5(\25\2\u01d8\u01d3\3\2\2\2\u01d9\u01dc\3\2"+ - "\2\2\u01da\u01d8\3\2\2\2\u01da\u01db\3\2\2\2\u01db\u01de\3\2\2\2\u01dc"+ - "\u01da\3\2\2\2\u01dd\u01df\7r\2\2\u01de\u01dd\3\2\2\2\u01de\u01df\3\2"+ - "\2\2\u01df\u01e0\3\2\2\2\u01e0\u01e1\7\33\2\2\u01e1O\3\2\2\2\u01e2\u01e3"+ - "\7y\2\2\u01e3Q\3\2\2\2\u01e4\u01e5\7{\2\2\u01e5S\3\2\2\2\u01e6\u01e7\7"+ - "x\2\2\u01e7U\3\2\2\2\u01e8\u01ef\5H%\2\u01e9\u01ef\5L\'\2\u01ea\u01ef"+ - "\5N(\2\u01eb\u01ef\5P)\2\u01ec\u01ef\5R*\2\u01ed\u01ef\5T+\2\u01ee\u01e8"+ - "\3\2\2\2\u01ee\u01e9\3\2\2\2\u01ee\u01ea\3\2\2\2\u01ee\u01eb\3\2\2\2\u01ee"+ - "\u01ec\3\2\2\2\u01ee\u01ed\3\2\2\2\u01efW\3\2\2\2\u01f0\u01f1\7T\2\2\u01f1"+ - "\u01f2\7z\2\2\u01f2Y\3\2\2\2\u01f3\u01f4\7U\2\2\u01f4\u01f5\5> \2\u01f5"+ - "\u01f7\7?\2\2\u01f6\u01f8\5`\61\2\u01f7\u01f6\3\2\2\2\u01f7\u01f8\3\2"+ - "\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01fb\7@\2\2\u01fa\u01fc\5\\/\2\u01fb\u01fa"+ - "\3\2\2\2\u01fb\u01fc\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd\u01fe\5^\60\2\u01fe"+ - "\u01ff\7r\2\2\u01ff[\3\2\2\2\u0200\u0201\7V\2\2\u0201\u0202\5b\62\2\u0202"+ - "]\3\2\2\2\u0203\u0204\7W\2\2\u0204\u0209\7r\2\2\u0205\u0208\5\b\5\2\u0206"+ - "\u0208\7r\2\2\u0207\u0205\3\2\2\2\u0207\u0206\3\2\2\2\u0208\u020b\3\2"+ - "\2\2\u0209\u0207\3\2\2\2\u0209\u020a\3\2\2\2\u020a\u020c\3\2\2\2\u020b"+ - "\u0209\3\2\2\2\u020c\u020d\7X\2\2\u020d_\3\2\2\2\u020e\u0216\5\22\n\2"+ - "\u020f\u0211\7\20\2\2\u0210\u0212\7r\2\2\u0211\u0210\3\2\2\2\u0211\u0212"+ - "\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0215\5\22\n\2\u0214\u020f\3\2\2\2"+ - "\u0215\u0218\3\2\2\2\u0216\u0214\3\2\2\2\u0216\u0217\3\2\2\2\u0217a\3"+ - "\2\2\2\u0218\u0216\3\2\2\2\u0219\u0221\5\32\16\2\u021a\u021c\7\20\2\2"+ - "\u021b\u021d\7r\2\2\u021c\u021b\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u021e"+ - "\3\2\2\2\u021e\u0220\5\32\16\2\u021f\u021a\3\2\2\2\u0220\u0223\3\2\2\2"+ - "\u0221\u021f\3\2\2\2\u0221\u0222\3\2\2\2\u0222c\3\2\2\2\u0223\u0221\3"+ - "\2\2\2\u0224\u0225\7Y\2\2\u0225\u0226\5> \2\u0226\u0228\7?\2\2\u0227\u0229"+ - "\5h\65\2\u0228\u0227\3\2\2\2\u0228\u0229\3\2\2\2\u0229\u022a\3\2\2\2\u022a"+ - "\u022b\7@\2\2\u022b\u022c\7V\2\2\u022c\u022d\7Z\2\2\u022d\u022f\7?\2\2"+ - "\u022e\u0230\5l\67\2\u022f\u022e\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231"+ - "\3\2\2\2\u0231\u0232\7@\2\2\u0232\u0233\7V\2\2\u0233\u0235\7?\2\2\u0234"+ - "\u0236\5n8\2\u0235\u0234\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0237\3\2\2"+ - "\2\u0237\u023a\7@\2\2\u0238\u023b\5f\64\2\u0239\u023b\5^\60\2\u023a\u0238"+ - "\3\2\2\2\u023a\u0239\3\2\2\2\u023be\3\2\2\2\u023c\u023d\7\21\2\2\u023d"+ - "\u023e\5H%\2\u023eg\3\2\2\2\u023f\u0247\5j\66\2\u0240\u0242\7\20\2\2\u0241"+ - "\u0243\7r\2\2\u0242\u0241\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u0244\3\2"+ - "\2\2\u0244\u0246\5j\66\2\u0245\u0240\3\2\2\2\u0246\u0249\3\2\2\2\u0247"+ - "\u0245\3\2\2\2\u0247\u0248\3\2\2\2\u0248i\3\2\2\2\u0249\u0247\3\2\2\2"+ - "\u024a\u024b\5\22\n\2\u024b\u024f\7B\2\2\u024c\u0250\5D#\2\u024d\u0250"+ - "\5F$\2\u024e\u0250\7[\2\2\u024f\u024c\3\2\2\2\u024f\u024d\3\2\2\2\u024f"+ - "\u024e\3\2\2\2\u0250k\3\2\2\2\u0251\u0256\5B\"\2\u0252\u0253\7\20\2\2"+ - "\u0253\u0255\5B\"\2\u0254\u0252\3\2\2\2\u0255\u0258\3\2\2\2\u0256\u0254"+ - "\3\2\2\2\u0256\u0257\3\2\2\2\u0257m\3\2\2\2\u0258\u0256\3\2\2\2\u0259"+ - "\u0261\5p9\2\u025a\u025c\7\20\2\2\u025b\u025d\7r\2\2\u025c\u025b\3\2\2"+ - "\2\u025c\u025d\3\2\2\2\u025d\u025e\3\2\2\2\u025e\u0260\5p9\2\u025f\u025a"+ - "\3\2\2\2\u0260\u0263\3\2\2\2\u0261\u025f\3\2\2\2\u0261\u0262\3\2\2\2\u0262"+ - "o\3\2\2\2\u0263\u0261\3\2\2\2\u0264\u0265\5\32\16\2\u0265\u0269\7B\2\2"+ - "\u0266\u026a\5D#\2\u0267\u026a\5F$\2\u0268\u026a\7[\2\2\u0269\u0266\3"+ - "\2\2\2\u0269\u0267\3\2\2\2\u0269\u0268\3\2\2\2\u026aq\3\2\2\2\u026b\u026c"+ - "\7\\\2\2\u026c\u026e\5(\25\2\u026d\u026f\7r\2\2\u026e\u026d\3\2\2\2\u026e"+ - "\u026f\3\2\2\2\u026f\u0272\3\2\2\2\u0270\u0273\5\b\5\2\u0271\u0273\5^"+ - "\60\2\u0272\u0270\3\2\2\2\u0272\u0271\3\2\2\2\u0273\u0275\3\2\2\2\u0274"+ - "\u0276\7r\2\2\u0275\u0274\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2"+ - "\2\2\u0277\u0279\5t;\2\u0278\u0277\3\2\2\2\u0278\u0279\3\2\2\2\u0279s"+ - "\3\2\2\2\u027a\u027c\7]\2\2\u027b\u027d\7r\2\2\u027c\u027b\3\2\2\2\u027c"+ - "\u027d\3\2\2\2\u027d\u0280\3\2\2\2\u027e\u0281\5\b\5\2\u027f\u0281\5^"+ - "\60\2\u0280\u027e\3\2\2\2\u0280\u027f\3\2\2\2\u0281u\3\2\2\2\u0282\u0284"+ - "\5x=\2\u0283\u0285\7r\2\2\u0284\u0283\3\2\2\2\u0284\u0285\3\2\2\2\u0285"+ - "\u0288\3\2\2\2\u0286\u0289\5\b\5\2\u0287\u0289\5^\60\2\u0288\u0286\3\2"+ - "\2\2\u0288\u0287\3\2\2\2\u0289\u028b\3\2\2\2\u028a\u028c\7r\2\2\u028b"+ - "\u028a\3\2\2\2\u028b\u028c\3\2\2\2\u028c\u028e\3\2\2\2\u028d\u028f\5t"+ - ";\2\u028e\u028d\3\2\2\2\u028e\u028f\3\2\2\2\u028f\u0290\3\2\2\2\u0290"+ - "\u0291\7r\2\2\u0291w\3\2\2\2\u0292\u0293\t\21\2\2\u0293y\3\2\2\2\u0294"+ - "\u0296\7j\2\2\u0295\u0297\5\32\16\2\u0296\u0295\3\2\2\2\u0296\u0297\3"+ - "\2\2\2\u0297\u0299\3\2\2\2\u0298\u029a\7|\2\2\u0299\u0298\3\2\2\2\u0299"+ - "\u029a\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u029e\5B\"\2\u029c\u029e\5> "+ - "\2\u029d\u029b\3\2\2\2\u029d\u029c\3\2\2\2\u029e\u029f\3\2\2\2\u029f\u02a0"+ - "\7k\2\2\u02a0\u02a2\5(\25\2\u02a1\u02a3\7r\2\2\u02a2\u02a1\3\2\2\2\u02a2"+ - "\u02a3\3\2\2\2\u02a3\u02a6\3\2\2\2\u02a4\u02a7\5\b\5\2\u02a5\u02a7\5^"+ - "\60\2\u02a6\u02a4\3\2\2\2\u02a6\u02a5\3\2\2\2\u02a7{\3\2\2\2\u02a8\u02a9"+ - "\7l\2\2\u02a9\u02ab\5(\25\2\u02aa\u02ac\7r\2\2\u02ab\u02aa\3\2\2\2\u02ab"+ - "\u02ac\3\2\2\2\u02ac\u02af\3\2\2\2\u02ad\u02b0\5\b\5\2\u02ae\u02b0\5^"+ - "\60\2\u02af\u02ad\3\2\2\2\u02af\u02ae\3\2\2\2\u02b0}\3\2\2\2\u02b1\u02b4"+ - "\7m\2\2\u02b2\u02b5\5\b\5\2\u02b3\u02b5\5^\60\2\u02b4\u02b2\3\2\2\2\u02b4"+ - "\u02b3\3\2\2\2\u02b5\u02b7\3\2\2\2\u02b6\u02b8\7r\2\2\u02b7\u02b6\3\2"+ - "\2\2\u02b7\u02b8\3\2\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02ba\7n\2\2\u02ba"+ - "\u02bb\5(\25\2\u02bb\177\3\2\2\2^\u0082\u0084\u008b\u0090\u00ab\u00b3"+ - "\u00b7\u00be\u00c1\u00c6\u00ca\u00ce\u00eb\u00f6\u010b\u010f\u0113\u0118"+ - "\u011c\u0121\u0125\u012a\u012e\u0133\u0137\u013c\u0140\u0145\u0149\u014e"+ - "\u0152\u0157\u015b\u0160\u0164\u0169\u016d\u0172\u0176\u017e\u0182\u0184"+ - "\u0198\u019f\u01a6\u01ab\u01b0\u01bd\u01c8\u01d0\u01d5\u01da\u01de\u01ee"+ - "\u01f7\u01fb\u0207\u0209\u0211\u0216\u021c\u0221\u0228\u022f\u0235\u023a"+ - "\u0242\u0247\u024f\u0256\u025c\u0261\u0269\u026e\u0272\u0275\u0278\u027c"+ - "\u0280\u0284\u0288\u028b\u028e\u0296\u0299\u029d\u02a2\u02a6\u02ab\u02af"+ - "\u02b4\u02b7"; + "\u019b\n\32\3\32\3\32\3\33\3\33\3\33\5\33\u01a2\n\33\3\33\3\33\3\34\3"+ + "\34\3\34\5\34\u01a9\n\34\3\34\7\34\u01ac\n\34\f\34\16\34\u01af\13\34\3"+ + "\35\3\35\5\35\u01b3\n\35\3\36\3\36\3\37\3\37\3 \3 \3!\3!\3!\7!\u01be\n"+ + "!\f!\16!\u01c1\13!\3\"\3\"\3#\3#\3$\3$\3%\3%\5%\u01cb\n%\3&\3&\3\'\3\'"+ + "\3(\3(\5(\u01d3\n(\3(\3(\3(\5(\u01d8\n(\3(\7(\u01db\n(\f(\16(\u01de\13"+ + "(\3(\5(\u01e1\n(\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3,\3,\3,\3,\5,\u01f1\n"+ + ",\3-\3-\3-\3.\3.\3.\3.\5.\u01fa\n.\3.\3.\5.\u01fe\n.\3.\3.\3.\3/\3/\3"+ + "/\3\60\3\60\3\60\3\60\7\60\u020a\n\60\f\60\16\60\u020d\13\60\3\60\3\60"+ + "\3\61\3\61\3\61\5\61\u0214\n\61\3\61\7\61\u0217\n\61\f\61\16\61\u021a"+ + "\13\61\3\62\3\62\3\62\5\62\u021f\n\62\3\62\7\62\u0222\n\62\f\62\16\62"+ + "\u0225\13\62\3\63\3\63\3\63\3\63\5\63\u022b\n\63\3\63\3\63\5\63\u022f"+ + "\n\63\3\63\5\63\u0232\n\63\3\63\5\63\u0235\n\63\3\63\3\63\5\63\u0239\n"+ + "\63\3\64\3\64\3\64\3\65\3\65\3\65\5\65\u0241\n\65\3\65\7\65\u0244\n\65"+ + "\f\65\16\65\u0247\13\65\3\66\3\66\3\66\3\66\3\66\5\66\u024e\n\66\3\67"+ + "\3\67\3\67\5\67\u0253\n\67\3\67\3\67\38\38\38\78\u025a\n8\f8\168\u025d"+ + "\138\39\39\39\39\59\u0263\n9\39\79\u0266\n9\f9\169\u0269\139\3:\3:\3:"+ + "\3:\3:\5:\u0270\n:\3;\3;\3;\5;\u0275\n;\3;\3;\5;\u0279\n;\3;\5;\u027c"+ + "\n;\3;\5;\u027f\n;\3<\3<\5<\u0283\n<\3<\3<\5<\u0287\n<\3=\3=\5=\u028b"+ + "\n=\3=\3=\5=\u028f\n=\3=\5=\u0292\n=\3=\5=\u0295\n=\3=\3=\3>\3>\3?\3?"+ + "\5?\u029d\n?\3?\5?\u02a0\n?\3?\3?\5?\u02a4\n?\3?\3?\3?\5?\u02a9\n?\3?"+ + "\3?\5?\u02ad\n?\3@\3@\3@\5@\u02b2\n@\3@\3@\5@\u02b6\n@\3A\3A\3A\5A\u02bb"+ + "\nA\3A\5A\u02be\nA\3A\3A\3A\3A\2\3(B\2\4\6\b\n\f\16\20\22\24\26\30\32"+ + "\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ + "\2\22\3\2\6\17\3\2\23\31\3\2\34&\3\2\'(\4\2\3\3)*\3\2,.\3\2)*\3\2/\60"+ + "\3\2\61\64\3\2\65\66\3\2GI\3\2GL\3\2MP\3\2tv\3\2RS\3\2^i\2\u0312\2\u0086"+ + "\3\2\2\2\4\u008d\3\2\2\2\6\u008f\3\2\2\2\b\u00ad\3\2\2\2\n\u00af\3\2\2"+ + "\2\f\u00b2\3\2\2\2\16\u00b7\3\2\2\2\20\u00c8\3\2\2\2\22\u00ca\3\2\2\2"+ + "\24\u00d4\3\2\2\2\26\u00d8\3\2\2\2\30\u00db\3\2\2\2\32\u00de\3\2\2\2\34"+ + "\u00e0\3\2\2\2\36\u00e4\3\2\2\2 \u00e8\3\2\2\2\"\u00f0\3\2\2\2$\u00f8"+ + "\3\2\2\2&\u00fa\3\2\2\2(\u010d\3\2\2\2*\u0189\3\2\2\2,\u018c\3\2\2\2."+ + "\u018f\3\2\2\2\60\u0194\3\2\2\2\62\u0197\3\2\2\2\64\u019e\3\2\2\2\66\u01a5"+ + "\3\2\2\28\u01b0\3\2\2\2:\u01b4\3\2\2\2<\u01b6\3\2\2\2>\u01b8\3\2\2\2@"+ + "\u01ba\3\2\2\2B\u01c2\3\2\2\2D\u01c4\3\2\2\2F\u01c6\3\2\2\2H\u01c8\3\2"+ + "\2\2J\u01cc\3\2\2\2L\u01ce\3\2\2\2N\u01d0\3\2\2\2P\u01e4\3\2\2\2R\u01e6"+ + "\3\2\2\2T\u01e8\3\2\2\2V\u01f0\3\2\2\2X\u01f2\3\2\2\2Z\u01f5\3\2\2\2\\"+ + "\u0202\3\2\2\2^\u0205\3\2\2\2`\u0210\3\2\2\2b\u021b\3\2\2\2d\u0226\3\2"+ + "\2\2f\u023a\3\2\2\2h\u023d\3\2\2\2j\u0248\3\2\2\2l\u024f\3\2\2\2n\u0256"+ + "\3\2\2\2p\u025e\3\2\2\2r\u026a\3\2\2\2t\u0271\3\2\2\2v\u0280\3\2\2\2x"+ + "\u0288\3\2\2\2z\u0298\3\2\2\2|\u029a\3\2\2\2~\u02ae\3\2\2\2\u0080\u02b7"+ + "\3\2\2\2\u0082\u0085\5\4\3\2\u0083\u0085\7r\2\2\u0084\u0082\3\2\2\2\u0084"+ + "\u0083\3\2\2\2\u0085\u0088\3\2\2\2\u0086\u0084\3\2\2\2\u0086\u0087\3\2"+ + "\2\2\u0087\u0089\3\2\2\2\u0088\u0086\3\2\2\2\u0089\u008a\7\2\2\3\u008a"+ + "\3\3\2\2\2\u008b\u008e\5\16\b\2\u008c\u008e\5\6\4\2\u008d\u008b\3\2\2"+ + "\2\u008d\u008c\3\2\2\2\u008e\5\3\2\2\2\u008f\u0090\7\3\2\2\u0090\u0092"+ + "\5> \2\u0091\u0093\5H%\2\u0092\u0091\3\2\2\2\u0092\u0093\3\2\2\2\u0093"+ + "\u0094\3\2\2\2\u0094\u0095\5^\60\2\u0095\u0096\7r\2\2\u0096\7\3\2\2\2"+ + "\u0097\u00ae\5\16\b\2\u0098\u00ae\5\24\13\2\u0099\u00ae\5\22\n\2\u009a"+ + "\u00ae\5\26\f\2\u009b\u00ae\5\30\r\2\u009c\u00ae\5\36\20\2\u009d\u00ae"+ + "\5\"\22\2\u009e\u00ae\5\f\7\2\u009f\u00ae\5&\24\2\u00a0\u00ae\5\64\33"+ + "\2\u00a1\u00ae\5t;\2\u00a2\u00ae\5x=\2\u00a3\u00ae\5Z.\2\u00a4\u00ae\5"+ + "d\63\2\u00a5\u00ae\5X-\2\u00a6\u00ae\58\35\2\u00a7\u00ae\5|?\2\u00a8\u00ae"+ + "\5~@\2\u00a9\u00ae\5\u0080A\2\u00aa\u00ae\5:\36\2\u00ab\u00ae\5<\37\2"+ + "\u00ac\u00ae\5\n\6\2\u00ad\u0097\3\2\2\2\u00ad\u0098\3\2\2\2\u00ad\u0099"+ + "\3\2\2\2\u00ad\u009a\3\2\2\2\u00ad\u009b\3\2\2\2\u00ad\u009c\3\2\2\2\u00ad"+ + "\u009d\3\2\2\2\u00ad\u009e\3\2\2\2\u00ad\u009f\3\2\2\2\u00ad\u00a0\3\2"+ + "\2\2\u00ad\u00a1\3\2\2\2\u00ad\u00a2\3\2\2\2\u00ad\u00a3\3\2\2\2\u00ad"+ + "\u00a4\3\2\2\2\u00ad\u00a5\3\2\2\2\u00ad\u00a6\3\2\2\2\u00ad\u00a7\3\2"+ + "\2\2\u00ad\u00a8\3\2\2\2\u00ad\u00a9\3\2\2\2\u00ad\u00aa\3\2\2\2\u00ad"+ + "\u00ab\3\2\2\2\u00ad\u00ac\3\2\2\2\u00ae\t\3\2\2\2\u00af\u00b0\5> \2\u00b0"+ + "\u00b1\7\4\2\2\u00b1\13\3\2\2\2\u00b2\u00b5\7\5\2\2\u00b3\u00b6\5H%\2"+ + "\u00b4\u00b6\5@!\2\u00b5\u00b3\3\2\2\2\u00b5\u00b4\3\2\2\2\u00b6\r\3\2"+ + "\2\2\u00b7\u00c3\t\2\2\2\u00b8\u00ba\5\20\t\2\u00b9\u00b8\3\2\2\2\u00b9"+ + "\u00ba\3\2\2\2\u00ba\u00c4\3\2\2\2\u00bb\u00c0\5\20\t\2\u00bc\u00bd\7"+ + "\20\2\2\u00bd\u00bf\5\20\t\2\u00be\u00bc\3\2\2\2\u00bf\u00c2\3\2\2\2\u00c0"+ + "\u00be\3\2\2\2\u00c0\u00c1\3\2\2\2\u00c1\u00c4\3\2\2\2\u00c2\u00c0\3\2"+ + "\2\2\u00c3\u00b9\3\2\2\2\u00c3\u00bb\3\2\2\2\u00c4\17\3\2\2\2\u00c5\u00c9"+ + "\5P)\2\u00c6\u00c9\5> \2\u00c7\u00c9\5H%\2\u00c8\u00c5\3\2\2\2\u00c8\u00c6"+ + "\3\2\2\2\u00c8\u00c7\3\2\2\2\u00c9\21\3\2\2\2\u00ca\u00cc\5\32\16\2\u00cb"+ + "\u00cd\7|\2\2\u00cc\u00cb\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd\u00d0\3\2"+ + "\2\2\u00ce\u00d1\5\34\17\2\u00cf\u00d1\7}\2\2\u00d0\u00ce\3\2\2\2\u00d0"+ + "\u00cf\3\2\2\2\u00d0\u00d1\3\2\2\2\u00d1\u00d2\3\2\2\2\u00d2\u00d3\5>"+ + " \2\u00d3\23\3\2\2\2\u00d4\u00d5\5\22\n\2\u00d5\u00d6\7\21\2\2\u00d6\u00d7"+ + "\5(\25\2\u00d7\25\3\2\2\2\u00d8\u00d9\7\22\2\2\u00d9\u00da\5\24\13\2\u00da"+ + "\27\3\2\2\2\u00db\u00dc\7w\2\2\u00dc\u00dd\5\24\13\2\u00dd\31\3\2\2\2"+ + "\u00de\u00df\t\3\2\2\u00df\33\3\2\2\2\u00e0\u00e1\7\32\2\2\u00e1\u00e2"+ + "\5(\25\2\u00e2\u00e3\7\33\2\2\u00e3\35\3\2\2\2\u00e4\u00e5\5 \21\2\u00e5"+ + "\u00e6\7\21\2\2\u00e6\u00e7\5(\25\2\u00e7\37\3\2\2\2\u00e8\u00ed\5$\23"+ + "\2\u00e9\u00ea\7\20\2\2\u00ea\u00ec\5$\23\2\u00eb\u00e9\3\2\2\2\u00ec"+ + "\u00ef\3\2\2\2\u00ed\u00eb\3\2\2\2\u00ed\u00ee\3\2\2\2\u00ee!\3\2\2\2"+ + "\u00ef\u00ed\3\2\2\2\u00f0\u00f1\5$\23\2\u00f1\u00f2\t\4\2\2\u00f2\u00f3"+ + "\5(\25\2\u00f3#\3\2\2\2\u00f4\u00f9\5B\"\2\u00f5\u00f9\5@!\2\u00f6\u00f9"+ + "\5,\27\2\u00f7\u00f9\5.\30\2\u00f8\u00f4\3\2\2\2\u00f8\u00f5\3\2\2\2\u00f8"+ + "\u00f6\3\2\2\2\u00f8\u00f7\3\2\2\2\u00f9%\3\2\2\2\u00fa\u00fb\5$\23\2"+ + "\u00fb\u00fc\t\5\2\2\u00fc\'\3\2\2\2\u00fd\u00fe\b\25\1\2\u00fe\u010e"+ + "\5\62\32\2\u00ff\u0100\t\6\2\2\u0100\u010e\5(\25\31\u0101\u0102\7>\2\2"+ + "\u0102\u010e\5(\25\13\u0103\u010e\5V,\2\u0104\u010e\5B\"\2\u0105\u010e"+ + "\5@!\2\u0106\u010e\5,\27\2\u0107\u010e\5.\30\2\u0108\u010e\5\60\31\2\u0109"+ + "\u010a\7?\2\2\u010a\u010b\5(\25\2\u010b\u010c\7@\2\2\u010c\u010e\3\2\2"+ + "\2\u010d\u00fd\3\2\2\2\u010d\u00ff\3\2\2\2\u010d\u0101\3\2\2\2\u010d\u0103"+ + "\3\2\2\2\u010d\u0104\3\2\2\2\u010d\u0105\3\2\2\2\u010d\u0106\3\2\2\2\u010d"+ + "\u0107\3\2\2\2\u010d\u0108\3\2\2\2\u010d\u0109\3\2\2\2\u010e\u0186\3\2"+ + "\2\2\u010f\u0111\f\30\2\2\u0110\u0112\7r\2\2\u0111\u0110\3\2\2\2\u0111"+ + "\u0112\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0115\7+\2\2\u0114\u0116\7r\2"+ + "\2\u0115\u0114\3\2\2\2\u0115\u0116\3\2\2\2\u0116\u0117\3\2\2\2\u0117\u0185"+ + "\5(\25\31\u0118\u011a\f\27\2\2\u0119\u011b\7r\2\2\u011a\u0119\3\2\2\2"+ + "\u011a\u011b\3\2\2\2\u011b\u011c\3\2\2\2\u011c\u011e\t\7\2\2\u011d\u011f"+ + "\7r\2\2\u011e\u011d\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0120\3\2\2\2\u0120"+ + "\u0185\5(\25\30\u0121\u0123\f\26\2\2\u0122\u0124\7r\2\2\u0123\u0122\3"+ + "\2\2\2\u0123\u0124\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0127\t\b\2\2\u0126"+ + "\u0128\7r\2\2\u0127\u0126\3\2\2\2\u0127\u0128\3\2\2\2\u0128\u0129\3\2"+ + "\2\2\u0129\u0185\5(\25\27\u012a\u012c\f\25\2\2\u012b\u012d\7r\2\2\u012c"+ + "\u012b\3\2\2\2\u012c\u012d\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u0130\t\t"+ + "\2\2\u012f\u0131\7r\2\2\u0130\u012f\3\2\2\2\u0130\u0131\3\2\2\2\u0131"+ + "\u0132\3\2\2\2\u0132\u0185\5(\25\26\u0133\u0135\f\24\2\2\u0134\u0136\7"+ + "r\2\2\u0135\u0134\3\2\2\2\u0135\u0136\3\2\2\2\u0136\u0137\3\2\2\2\u0137"+ + "\u0139\t\n\2\2\u0138\u013a\7r\2\2\u0139\u0138\3\2\2\2\u0139\u013a\3\2"+ + "\2\2\u013a\u013b\3\2\2\2\u013b\u0185\5(\25\25\u013c\u013e\f\23\2\2\u013d"+ + "\u013f\7r\2\2\u013e\u013d\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0140\3\2"+ + "\2\2\u0140\u0142\t\13\2\2\u0141\u0143\7r\2\2\u0142\u0141\3\2\2\2\u0142"+ + "\u0143\3\2\2\2\u0143\u0144\3\2\2\2\u0144\u0185\5(\25\24\u0145\u0147\f"+ + "\22\2\2\u0146\u0148\7r\2\2\u0147\u0146\3\2\2\2\u0147\u0148\3\2\2\2\u0148"+ + "\u0149\3\2\2\2\u0149\u014b\7w\2\2\u014a\u014c\7r\2\2\u014b\u014a\3\2\2"+ + "\2\u014b\u014c\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u0185\5(\25\23\u014e"+ + "\u0150\f\21\2\2\u014f\u0151\7r\2\2\u0150\u014f\3\2\2\2\u0150\u0151\3\2"+ + "\2\2\u0151\u0152\3\2\2\2\u0152\u0154\7\67\2\2\u0153\u0155\7r\2\2\u0154"+ + "\u0153\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0156\3\2\2\2\u0156\u0185\5("+ + "\25\22\u0157\u0159\f\20\2\2\u0158\u015a\7r\2\2\u0159\u0158\3\2\2\2\u0159"+ + "\u015a\3\2\2\2\u015a\u015b\3\2\2\2\u015b\u015d\78\2\2\u015c\u015e\7r\2"+ + "\2\u015d\u015c\3\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0185"+ + "\5(\25\21\u0160\u0162\f\16\2\2\u0161\u0163\7r\2\2\u0162\u0161\3\2\2\2"+ + "\u0162\u0163\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0166\7;\2\2\u0165\u0167"+ + "\7r\2\2\u0166\u0165\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0168\3\2\2\2\u0168"+ + "\u0185\5(\25\17\u0169\u016b\f\r\2\2\u016a\u016c\7r\2\2\u016b\u016a\3\2"+ + "\2\2\u016b\u016c\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016f\7<\2\2\u016e"+ + "\u0170\7r\2\2\u016f\u016e\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\3\2"+ + "\2\2\u0171\u0185\5(\25\16\u0172\u0174\f\f\2\2\u0173\u0175\7r\2\2\u0174"+ + "\u0173\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176\3\2\2\2\u0176\u0178\7="+ + "\2\2\u0177\u0179\7r\2\2\u0178\u0177\3\2\2\2\u0178\u0179\3\2\2\2\u0179"+ + "\u017a\3\2\2\2\u017a\u0185\5(\25\r\u017b\u017c\f\17\2\2\u017c\u017d\7"+ + "9\2\2\u017d\u0180\5(\25\2\u017e\u017f\7:\2\2\u017f\u0181\5(\25\2\u0180"+ + "\u017e\3\2\2\2\u0180\u0181\3\2\2\2\u0181\u0185\3\2\2\2\u0182\u0183\f\4"+ + "\2\2\u0183\u0185\5*\26\2\u0184\u010f\3\2\2\2\u0184\u0118\3\2\2\2\u0184"+ + "\u0121\3\2\2\2\u0184\u012a\3\2\2\2\u0184\u0133\3\2\2\2\u0184\u013c\3\2"+ + "\2\2\u0184\u0145\3\2\2\2\u0184\u014e\3\2\2\2\u0184\u0157\3\2\2\2\u0184"+ + "\u0160\3\2\2\2\u0184\u0169\3\2\2\2\u0184\u0172\3\2\2\2\u0184\u017b\3\2"+ + "\2\2\u0184\u0182\3\2\2\2\u0185\u0188\3\2\2\2\u0186\u0184\3\2\2\2\u0186"+ + "\u0187\3\2\2\2\u0187)\3\2\2\2\u0188\u0186\3\2\2\2\u0189\u018a\7A\2\2\u018a"+ + "\u018b\5\32\16\2\u018b+\3\2\2\2\u018c\u018d\5@!\2\u018d\u018e\5\34\17"+ + "\2\u018e-\3\2\2\2\u018f\u0190\7B\2\2\u0190\u0191\7?\2\2\u0191\u0192\5"+ + "(\25\2\u0192\u0193\7@\2\2\u0193/\3\2\2\2\u0194\u0195\7w\2\2\u0195\u0196"+ + "\5@!\2\u0196\61\3\2\2\2\u0197\u0198\5@!\2\u0198\u019a\7?\2\2\u0199\u019b"+ + "\5\66\34\2\u019a\u0199\3\2\2\2\u019a\u019b\3\2\2\2\u019b\u019c\3\2\2\2"+ + "\u019c\u019d\7@\2\2\u019d\63\3\2\2\2\u019e\u019f\5@!\2\u019f\u01a1\7?"+ + "\2\2\u01a0\u01a2\5\66\34\2\u01a1\u01a0\3\2\2\2\u01a1\u01a2\3\2\2\2\u01a2"+ + "\u01a3\3\2\2\2\u01a3\u01a4\7@\2\2\u01a4\65\3\2\2\2\u01a5\u01ad\5(\25\2"+ + "\u01a6\u01a8\7\20\2\2\u01a7\u01a9\7r\2\2\u01a8\u01a7\3\2\2\2\u01a8\u01a9"+ + "\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01ac\5(\25\2\u01ab\u01a6\3\2\2\2\u01ac"+ + "\u01af\3\2\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2\2\2\u01ae\67\3\2\2"+ + "\2\u01af\u01ad\3\2\2\2\u01b0\u01b2\7C\2\2\u01b1\u01b3\5\66\34\2\u01b2"+ + "\u01b1\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b39\3\2\2\2\u01b4\u01b5\7D\2\2\u01b5"+ + ";\3\2\2\2\u01b6\u01b7\7E\2\2\u01b7=\3\2\2\2\u01b8\u01b9\7s\2\2\u01b9?"+ + "\3\2\2\2\u01ba\u01bf\7s\2\2\u01bb\u01bc\7F\2\2\u01bc\u01be\7s\2\2\u01bd"+ + "\u01bb\3\2\2\2\u01be\u01c1\3\2\2\2\u01bf\u01bd\3\2\2\2\u01bf\u01c0\3\2"+ + "\2\2\u01c0A\3\2\2\2\u01c1\u01bf\3\2\2\2\u01c2\u01c3\t\f\2\2\u01c3C\3\2"+ + "\2\2\u01c4\u01c5\t\r\2\2\u01c5E\3\2\2\2\u01c6\u01c7\t\16\2\2\u01c7G\3"+ + "\2\2\2\u01c8\u01ca\t\17\2\2\u01c9\u01cb\5J&\2\u01ca\u01c9\3\2\2\2\u01ca"+ + "\u01cb\3\2\2\2\u01cbI\3\2\2\2\u01cc\u01cd\7Q\2\2\u01cdK\3\2\2\2\u01ce"+ + "\u01cf\t\20\2\2\u01cfM\3\2\2\2\u01d0\u01d2\7\32\2\2\u01d1\u01d3\7r\2\2"+ + "\u01d2\u01d1\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01dc"+ + "\5(\25\2\u01d5\u01d7\7\20\2\2\u01d6\u01d8\7r\2\2\u01d7\u01d6\3\2\2\2\u01d7"+ + "\u01d8\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01db\5(\25\2\u01da\u01d5\3\2"+ + "\2\2\u01db\u01de\3\2\2\2\u01dc\u01da\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd"+ + "\u01e0\3\2\2\2\u01de\u01dc\3\2\2\2\u01df\u01e1\7r\2\2\u01e0\u01df\3\2"+ + "\2\2\u01e0\u01e1\3\2\2\2\u01e1\u01e2\3\2\2\2\u01e2\u01e3\7\33\2\2\u01e3"+ + "O\3\2\2\2\u01e4\u01e5\7y\2\2\u01e5Q\3\2\2\2\u01e6\u01e7\7{\2\2\u01e7S"+ + "\3\2\2\2\u01e8\u01e9\7x\2\2\u01e9U\3\2\2\2\u01ea\u01f1\5H%\2\u01eb\u01f1"+ + "\5L\'\2\u01ec\u01f1\5N(\2\u01ed\u01f1\5P)\2\u01ee\u01f1\5R*\2\u01ef\u01f1"+ + "\5T+\2\u01f0\u01ea\3\2\2\2\u01f0\u01eb\3\2\2\2\u01f0\u01ec\3\2\2\2\u01f0"+ + "\u01ed\3\2\2\2\u01f0\u01ee\3\2\2\2\u01f0\u01ef\3\2\2\2\u01f1W\3\2\2\2"+ + "\u01f2\u01f3\7T\2\2\u01f3\u01f4\7z\2\2\u01f4Y\3\2\2\2\u01f5\u01f6\7U\2"+ + "\2\u01f6\u01f7\5> \2\u01f7\u01f9\7?\2\2\u01f8\u01fa\5`\61\2\u01f9\u01f8"+ + "\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fd\7@\2\2\u01fc"+ + "\u01fe\5\\/\2\u01fd\u01fc\3\2\2\2\u01fd\u01fe\3\2\2\2\u01fe\u01ff\3\2"+ + "\2\2\u01ff\u0200\5^\60\2\u0200\u0201\7r\2\2\u0201[\3\2\2\2\u0202\u0203"+ + "\7V\2\2\u0203\u0204\5b\62\2\u0204]\3\2\2\2\u0205\u0206\7W\2\2\u0206\u020b"+ + "\7r\2\2\u0207\u020a\5\b\5\2\u0208\u020a\7r\2\2\u0209\u0207\3\2\2\2\u0209"+ + "\u0208\3\2\2\2\u020a\u020d\3\2\2\2\u020b\u0209\3\2\2\2\u020b\u020c\3\2"+ + "\2\2\u020c\u020e\3\2\2\2\u020d\u020b\3\2\2\2\u020e\u020f\7X\2\2\u020f"+ + "_\3\2\2\2\u0210\u0218\5\22\n\2\u0211\u0213\7\20\2\2\u0212\u0214\7r\2\2"+ + "\u0213\u0212\3\2\2\2\u0213\u0214\3\2\2\2\u0214\u0215\3\2\2\2\u0215\u0217"+ + "\5\22\n\2\u0216\u0211\3\2\2\2\u0217\u021a\3\2\2\2\u0218\u0216\3\2\2\2"+ + "\u0218\u0219\3\2\2\2\u0219a\3\2\2\2\u021a\u0218\3\2\2\2\u021b\u0223\5"+ + "\32\16\2\u021c\u021e\7\20\2\2\u021d\u021f\7r\2\2\u021e\u021d\3\2\2\2\u021e"+ + "\u021f\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u0222\5\32\16\2\u0221\u021c\3"+ + "\2\2\2\u0222\u0225\3\2\2\2\u0223\u0221\3\2\2\2\u0223\u0224\3\2\2\2\u0224"+ + "c\3\2\2\2\u0225\u0223\3\2\2\2\u0226\u0227\7Y\2\2\u0227\u0228\5> \2\u0228"+ + "\u022a\7?\2\2\u0229\u022b\5h\65\2\u022a\u0229\3\2\2\2\u022a\u022b\3\2"+ + "\2\2\u022b\u022c\3\2\2\2\u022c\u022e\7@\2\2\u022d\u022f\7r\2\2\u022e\u022d"+ + "\3\2\2\2\u022e\u022f\3\2\2\2\u022f\u0231\3\2\2\2\u0230\u0232\5l\67\2\u0231"+ + "\u0230\3\2\2\2\u0231\u0232\3\2\2\2\u0232\u0234\3\2\2\2\u0233\u0235\5p"+ + "9\2\u0234\u0233\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0238\3\2\2\2\u0236"+ + "\u0239\5f\64\2\u0237\u0239\5^\60\2\u0238\u0236\3\2\2\2\u0238\u0237\3\2"+ + "\2\2\u0239e\3\2\2\2\u023a\u023b\7\21\2\2\u023b\u023c\5H%\2\u023cg\3\2"+ + "\2\2\u023d\u0245\5j\66\2\u023e\u0240\7\20\2\2\u023f\u0241\7r\2\2\u0240"+ + "\u023f\3\2\2\2\u0240\u0241\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0244\5j"+ + "\66\2\u0243\u023e\3\2\2\2\u0244\u0247\3\2\2\2\u0245\u0243\3\2\2\2\u0245"+ + "\u0246\3\2\2\2\u0246i\3\2\2\2\u0247\u0245\3\2\2\2\u0248\u0249\5\22\n\2"+ + "\u0249\u024d\7B\2\2\u024a\u024e\5D#\2\u024b\u024e\5F$\2\u024c\u024e\7"+ + "Z\2\2\u024d\u024a\3\2\2\2\u024d\u024b\3\2\2\2\u024d\u024c\3\2\2\2\u024e"+ + "k\3\2\2\2\u024f\u0250\7[\2\2\u0250\u0252\7?\2\2\u0251\u0253\5n8\2\u0252"+ + "\u0251\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0254\3\2\2\2\u0254\u0255\7@"+ + "\2\2\u0255m\3\2\2\2\u0256\u025b\5B\"\2\u0257\u0258\7\20\2\2\u0258\u025a"+ + "\5B\"\2\u0259\u0257\3\2\2\2\u025a\u025d\3\2\2\2\u025b\u0259\3\2\2\2\u025b"+ + "\u025c\3\2\2\2\u025co\3\2\2\2\u025d\u025b\3\2\2\2\u025e\u025f\7V\2\2\u025f"+ + "\u0267\5r:\2\u0260\u0262\7\20\2\2\u0261\u0263\7r\2\2\u0262\u0261\3\2\2"+ + "\2\u0262\u0263\3\2\2\2\u0263\u0264\3\2\2\2\u0264\u0266\5r:\2\u0265\u0260"+ + "\3\2\2\2\u0266\u0269\3\2\2\2\u0267\u0265\3\2\2\2\u0267\u0268\3\2\2\2\u0268"+ + "q\3\2\2\2\u0269\u0267\3\2\2\2\u026a\u026b\5\32\16\2\u026b\u026f\7B\2\2"+ + "\u026c\u0270\5D#\2\u026d\u0270\5F$\2\u026e\u0270\7Z\2\2\u026f\u026c\3"+ + "\2\2\2\u026f\u026d\3\2\2\2\u026f\u026e\3\2\2\2\u0270s\3\2\2\2\u0271\u0272"+ + "\7\\\2\2\u0272\u0274\5(\25\2\u0273\u0275\7r\2\2\u0274\u0273\3\2\2\2\u0274"+ + "\u0275\3\2\2\2\u0275\u0278\3\2\2\2\u0276\u0279\5\b\5\2\u0277\u0279\5^"+ + "\60\2\u0278\u0276\3\2\2\2\u0278\u0277\3\2\2\2\u0279\u027b\3\2\2\2\u027a"+ + "\u027c\7r\2\2\u027b\u027a\3\2\2\2\u027b\u027c\3\2\2\2\u027c\u027e\3\2"+ + "\2\2\u027d\u027f\5v<\2\u027e\u027d\3\2\2\2\u027e\u027f\3\2\2\2\u027fu"+ + "\3\2\2\2\u0280\u0282\7]\2\2\u0281\u0283\7r\2\2\u0282\u0281\3\2\2\2\u0282"+ + "\u0283\3\2\2\2\u0283\u0286\3\2\2\2\u0284\u0287\5\b\5\2\u0285\u0287\5^"+ + "\60\2\u0286\u0284\3\2\2\2\u0286\u0285\3\2\2\2\u0287w\3\2\2\2\u0288\u028a"+ + "\5z>\2\u0289\u028b\7r\2\2\u028a\u0289\3\2\2\2\u028a\u028b\3\2\2\2\u028b"+ + "\u028e\3\2\2\2\u028c\u028f\5\b\5\2\u028d\u028f\5^\60\2\u028e\u028c\3\2"+ + "\2\2\u028e\u028d\3\2\2\2\u028f\u0291\3\2\2\2\u0290\u0292\7r\2\2\u0291"+ + "\u0290\3\2\2\2\u0291\u0292\3\2\2\2\u0292\u0294\3\2\2\2\u0293\u0295\5v"+ + "<\2\u0294\u0293\3\2\2\2\u0294\u0295\3\2\2\2\u0295\u0296\3\2\2\2\u0296"+ + "\u0297\7r\2\2\u0297y\3\2\2\2\u0298\u0299\t\21\2\2\u0299{\3\2\2\2\u029a"+ + "\u029c\7j\2\2\u029b\u029d\5\32\16\2\u029c\u029b\3\2\2\2\u029c\u029d\3"+ + "\2\2\2\u029d\u029f\3\2\2\2\u029e\u02a0\7|\2\2\u029f\u029e\3\2\2\2\u029f"+ + "\u02a0\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a4\5B\"\2\u02a2\u02a4\5> "+ + "\2\u02a3\u02a1\3\2\2\2\u02a3\u02a2\3\2\2\2\u02a4\u02a5\3\2\2\2\u02a5\u02a6"+ + "\7k\2\2\u02a6\u02a8\5(\25\2\u02a7\u02a9\7r\2\2\u02a8\u02a7\3\2\2\2\u02a8"+ + "\u02a9\3\2\2\2\u02a9\u02ac\3\2\2\2\u02aa\u02ad\5\b\5\2\u02ab\u02ad\5^"+ + "\60\2\u02ac\u02aa\3\2\2\2\u02ac\u02ab\3\2\2\2\u02ad}\3\2\2\2\u02ae\u02af"+ + "\7l\2\2\u02af\u02b1\5(\25\2\u02b0\u02b2\7r\2\2\u02b1\u02b0\3\2\2\2\u02b1"+ + "\u02b2\3\2\2\2\u02b2\u02b5\3\2\2\2\u02b3\u02b6\5\b\5\2\u02b4\u02b6\5^"+ + "\60\2\u02b5\u02b3\3\2\2\2\u02b5\u02b4\3\2\2\2\u02b6\177\3\2\2\2\u02b7"+ + "\u02ba\7m\2\2\u02b8\u02bb\5\b\5\2\u02b9\u02bb\5^\60\2\u02ba\u02b8\3\2"+ + "\2\2\u02ba\u02b9\3\2\2\2\u02bb\u02bd\3\2\2\2\u02bc\u02be\7r\2\2\u02bd"+ + "\u02bc\3\2\2\2\u02bd\u02be\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c0\7n"+ + "\2\2\u02c0\u02c1\5(\25\2\u02c1\u0081\3\2\2\2`\u0084\u0086\u008d\u0092"+ + "\u00ad\u00b5\u00b9\u00c0\u00c3\u00c8\u00cc\u00d0\u00ed\u00f8\u010d\u0111"+ + "\u0115\u011a\u011e\u0123\u0127\u012c\u0130\u0135\u0139\u013e\u0142\u0147"+ + "\u014b\u0150\u0154\u0159\u015d\u0162\u0166\u016b\u016f\u0174\u0178\u0180"+ + "\u0184\u0186\u019a\u01a1\u01a8\u01ad\u01b2\u01bf\u01ca\u01d2\u01d7\u01dc"+ + "\u01e0\u01f0\u01f9\u01fd\u0209\u020b\u0213\u0218\u021e\u0223\u022a\u022e"+ + "\u0231\u0234\u0238\u0240\u0245\u024d\u0252\u025b\u0262\u0267\u026f\u0274"+ + "\u0278\u027b\u027e\u0282\u0286\u028a\u028e\u0291\u0294\u029c\u029f\u02a3"+ + "\u02a8\u02ac\u02b1\u02b5\u02ba\u02bd"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static {