From a9bbe0bc40154d9641f3d457135b6db223c3a5b6 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Fri, 12 Apr 2019 22:00:32 +0200 Subject: [PATCH] removed the memory keyword instead use & now (reuse the address-of operator to reduce the number of different concepts in the grammar) --- compiler/res/prog8lib/c64flt.p8 | 30 +- compiler/res/prog8lib/c64lib.p8 | 288 +++++------ docs/source/programming.rst | 4 +- docs/source/syntaxreference.rst | 6 +- docs/source/todo.rst | 1 - parser/antlr/prog8.g4 | 5 +- parser/src/prog8/parser/prog8Lexer.java | 595 +++++++++++------------ parser/src/prog8/parser/prog8Parser.java | 582 +++++++++++----------- 8 files changed, 756 insertions(+), 755 deletions(-) diff --git a/compiler/res/prog8lib/c64flt.p8 b/compiler/res/prog8lib/c64flt.p8 index d54692238..481179337 100644 --- a/compiler/res/prog8lib/c64flt.p8 +++ b/compiler/res/prog8lib/c64flt.p8 @@ -20,21 +20,21 @@ ; floats in memory (and rom) are stored in 5-byte MFLPT packed format. ; constants in five-byte "mflpt" format in the BASIC ROM - memory float FL_PIVAL = $aea8 ; 3.1415926... - memory float FL_N32768 = $b1a5 ; -32768 - memory float FL_FONE = $b9bc ; 1 - memory float FL_SQRHLF = $b9d6 ; SQR(2) / 2 - memory float FL_SQRTWO = $b9db ; SQR(2) - memory float FL_NEGHLF = $b9e0 ; -.5 - memory float FL_LOG2 = $b9e5 ; LOG(2) - memory float FL_TENC = $baf9 ; 10 - memory float FL_NZMIL = $bdbd ; 1e9 (1 billion) - memory float FL_FHALF = $bf11 ; .5 - memory float FL_LOGEB2 = $bfbf ; 1 / LOG(2) - memory float FL_PIHALF = $e2e0 ; PI / 2 - memory float FL_TWOPI = $e2e5 ; 2 * PI - memory float FL_FR4 = $e2ea ; .25 - float FL_ZERO = 0.0 ; oddly enough 0.0 isn't available in the kernel + &float FL_PIVAL = $aea8 ; 3.1415926... + &float FL_N32768 = $b1a5 ; -32768 + &float FL_FONE = $b9bc ; 1 + &float FL_SQRHLF = $b9d6 ; SQR(2) / 2 + &float FL_SQRTWO = $b9db ; SQR(2) + &float FL_NEGHLF = $b9e0 ; -.5 + &float FL_LOG2 = $b9e5 ; LOG(2) + &float FL_TENC = $baf9 ; 10 + &float FL_NZMIL = $bdbd ; 1e9 (1 billion) + &float FL_FHALF = $bf11 ; .5 + &float FL_LOGEB2 = $bfbf ; 1 / LOG(2) + &float FL_PIHALF = $e2e0 ; PI / 2 + &float FL_TWOPI = $e2e5 ; 2 * PI + &float FL_FR4 = $e2ea ; .25 + float FL_ZERO = 0.0 ; oddly enough 0.0 isn't available in the kernel ; note: fac1/2 might get clobbered even if not mentioned in the function's name. diff --git a/compiler/res/prog8lib/c64lib.p8 b/compiler/res/prog8lib/c64lib.p8 index 86cbe27a1..8ac524e22 100644 --- a/compiler/res/prog8lib/c64lib.p8 +++ b/compiler/res/prog8lib/c64lib.p8 @@ -7,178 +7,178 @@ ~ c64 { - memory ubyte SCRATCH_ZPB1 = $02 ; scratch byte 1 in ZP - memory ubyte SCRATCH_ZPREG = $03 ; scratch register in ZP - memory ubyte SCRATCH_ZPREGX = $fa ; temp storage for X register (stack pointer) - memory uword SCRATCH_ZPWORD1 = $fb ; scratch word in ZP ($fb/$fc) - memory uword SCRATCH_ZPWORD2 = $fd ; scratch word in ZP ($fd/$fe) const uword ESTACK_LO = $ce00 ; evaluation stack (lsb) const uword ESTACK_HI = $cf00 ; evaluation stack (msb) + &ubyte SCRATCH_ZPB1 = $02 ; scratch byte 1 in ZP + &ubyte SCRATCH_ZPREG = $03 ; scratch register in ZP + &ubyte SCRATCH_ZPREGX = $fa ; temp storage for X register (stack pointer) + &uword SCRATCH_ZPWORD1 = $fb ; scratch word in ZP ($fb/$fc) + &uword SCRATCH_ZPWORD2 = $fd ; scratch word in ZP ($fd/$fe) - memory ubyte TIME_HI = $a0 ; software jiffy clock, hi byte - memory ubyte TIME_MID = $a1 ; .. mid byte - memory ubyte TIME_LO = $a2 ; .. lo byte. Updated by IRQ every 1/60 sec - memory ubyte STKEY = $91 ; various keyboard statuses (updated by IRQ) - memory ubyte SFDX = $cb ; current key pressed (matrix value) (updated by IRQ) - - memory ubyte COLOR = $0286 ; cursor color - memory ubyte HIBASE = $0288 ; screen base address / 256 (hi-byte of screen memory address) - memory uword CINV = $0314 ; IRQ vector - memory uword NMI_VEC = $FFFA ; 6502 nmi vector, determined by the kernal if banked in - memory uword RESET_VEC = $FFFC ; 6502 reset vector, determined by the kernal if banked in - memory uword IRQ_VEC = $FFFE ; 6502 interrupt vector, determined by the kernal if banked in + &ubyte TIME_HI = $a0 ; software jiffy clock, hi byte + &ubyte TIME_MID = $a1 ; .. mid byte + &ubyte TIME_LO = $a2 ; .. lo byte. Updated by IRQ every 1/60 sec + &ubyte STKEY = $91 ; various keyboard statuses (updated by IRQ) + &ubyte SFDX = $cb ; current key pressed (matrix value) (updated by IRQ) + + &ubyte COLOR = $0286 ; cursor color + &ubyte HIBASE = $0288 ; screen base address / 256 (hi-byte of screen memory address) + &uword CINV = $0314 ; IRQ vector + &uword NMI_VEC = $FFFA ; 6502 nmi vector, determined by the kernal if banked in + &uword RESET_VEC = $FFFC ; 6502 reset vector, determined by the kernal if banked in + &uword IRQ_VEC = $FFFE ; 6502 interrupt vector, determined by the kernal if banked in ; the default addresses for the character screen chars and colors const uword Screen = $0400 ; to have this as an array[40*25] the compiler would have to support array size > 255 const uword Colors = $d800 ; to have this as an array[40*25] the compiler would have to support array size > 255 ; the default locations of the 8 sprite pointers (store address of sprite / 64) - memory ubyte SPRPTR0 = 2040 - memory ubyte SPRPTR1 = 2041 - memory ubyte SPRPTR2 = 2042 - memory ubyte SPRPTR3 = 2043 - memory ubyte SPRPTR4 = 2044 - memory ubyte SPRPTR5 = 2045 - memory ubyte SPRPTR6 = 2046 - memory ubyte SPRPTR7 = 2047 - memory ubyte[8] SPRPTR = 2040 ; the 8 sprite pointers as an array. + &ubyte SPRPTR0 = 2040 + &ubyte SPRPTR1 = 2041 + &ubyte SPRPTR2 = 2042 + &ubyte SPRPTR3 = 2043 + &ubyte SPRPTR4 = 2044 + &ubyte SPRPTR5 = 2045 + &ubyte SPRPTR6 = 2046 + &ubyte SPRPTR7 = 2047 + &ubyte[8] SPRPTR = 2040 ; the 8 sprite pointers as an array. ; ---- VIC-II 6567/6569/856x registers ---- - memory ubyte SP0X = $d000 - memory ubyte SP0Y = $d001 - memory ubyte SP1X = $d002 - memory ubyte SP1Y = $d003 - memory ubyte SP2X = $d004 - memory ubyte SP2Y = $d005 - memory ubyte SP3X = $d006 - memory ubyte SP3Y = $d007 - memory ubyte SP4X = $d008 - memory ubyte SP4Y = $d009 - memory ubyte SP5X = $d00a - memory ubyte SP5Y = $d00b - memory ubyte SP6X = $d00c - memory ubyte SP6Y = $d00d - memory ubyte SP7X = $d00e - memory ubyte SP7Y = $d00f - memory ubyte[16] SPXY = $d000 ; the 8 sprite X and Y registers as an array. - memory uword[8] SPXYW = $d000 ; the 8 sprite X and Y registers as a combined xy word array. + &ubyte SP0X = $d000 + &ubyte SP0Y = $d001 + &ubyte SP1X = $d002 + &ubyte SP1Y = $d003 + &ubyte SP2X = $d004 + &ubyte SP2Y = $d005 + &ubyte SP3X = $d006 + &ubyte SP3Y = $d007 + &ubyte SP4X = $d008 + &ubyte SP4Y = $d009 + &ubyte SP5X = $d00a + &ubyte SP5Y = $d00b + &ubyte SP6X = $d00c + &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. - memory ubyte MSIGX = $d010 - memory ubyte SCROLY = $d011 - memory ubyte RASTER = $d012 - memory ubyte LPENX = $d013 - memory ubyte LPENY = $d014 - memory ubyte SPENA = $d015 - memory ubyte SCROLX = $d016 - memory ubyte YXPAND = $d017 - memory ubyte VMCSB = $d018 - memory ubyte VICIRQ = $d019 - memory ubyte IREQMASK = $d01a - memory ubyte SPBGPR = $d01b - memory ubyte SPMC = $d01c - memory ubyte XXPAND = $d01d - memory ubyte SPSPCL = $d01e - memory ubyte SPBGCL = $d01f + &ubyte MSIGX = $d010 + &ubyte SCROLY = $d011 + &ubyte RASTER = $d012 + &ubyte LPENX = $d013 + &ubyte LPENY = $d014 + &ubyte SPENA = $d015 + &ubyte SCROLX = $d016 + &ubyte YXPAND = $d017 + &ubyte VMCSB = $d018 + &ubyte VICIRQ = $d019 + &ubyte IREQMASK = $d01a + &ubyte SPBGPR = $d01b + &ubyte SPMC = $d01c + &ubyte XXPAND = $d01d + &ubyte SPSPCL = $d01e + &ubyte SPBGCL = $d01f - memory ubyte EXTCOL = $d020 ; border color - memory ubyte BGCOL0 = $d021 ; screen color - memory ubyte BGCOL1 = $d022 - memory ubyte BGCOL2 = $d023 - memory ubyte BGCOL4 = $d024 - memory ubyte SPMC0 = $d025 - memory ubyte SPMC1 = $d026 - memory ubyte SP0COL = $d027 - memory ubyte SP1COL = $d028 - memory ubyte SP2COL = $d029 - memory ubyte SP3COL = $d02a - memory ubyte SP4COL = $d02b - memory ubyte SP5COL = $d02c - memory ubyte SP6COL = $d02d - memory ubyte SP7COL = $d02e - memory ubyte[8] SPCOL = $d027 + &ubyte EXTCOL = $d020 ; border color + &ubyte BGCOL0 = $d021 ; screen color + &ubyte BGCOL1 = $d022 + &ubyte BGCOL2 = $d023 + &ubyte BGCOL4 = $d024 + &ubyte SPMC0 = $d025 + &ubyte SPMC1 = $d026 + &ubyte SP0COL = $d027 + &ubyte SP1COL = $d028 + &ubyte SP2COL = $d029 + &ubyte SP3COL = $d02a + &ubyte SP4COL = $d02b + &ubyte SP5COL = $d02c + &ubyte SP6COL = $d02d + &ubyte SP7COL = $d02e + &ubyte[8] SPCOL = $d027 ; ---- end of VIC-II registers ---- ; ---- CIA 6526 1 & 2 registers ---- - memory ubyte CIA1PRA = $DC00 ; CIA 1 DRA, keyboard column drive (and joystick control port #2) - memory ubyte CIA1PRB = $DC01 ; CIA 1 DRB, keyboard row port (and joystick control port #1) - memory ubyte CIA1DDRA = $DC02 ; CIA 1 DDRA, keyboard column - memory ubyte CIA1DDRB = $DC03 ; CIA 1 DDRB, keyboard row - memory ubyte CIA1TAL = $DC04 ; CIA 1 timer A low byte - memory ubyte CIA1TAH = $DC05 ; CIA 1 timer A high byte - memory ubyte CIA1TBL = $DC06 ; CIA 1 timer B low byte - memory ubyte CIA1TBH = $DC07 ; CIA 1 timer B high byte - memory ubyte CIA1TOD10 = $DC08 ; time of day, 1/10 sec. - memory ubyte CIA1TODSEC = $DC09 ; time of day, seconds - memory ubyte CIA1TODMMIN = $DC0A ; time of day, minutes - memory ubyte CIA1TODHR = $DC0B ; time of day, hours - memory ubyte CIA1SDR = $DC0C ; Serial Data Register - memory ubyte CIA1ICR = $DC0D - memory ubyte CIA1CRA = $DC0E - memory ubyte CIA1CRB = $DC0F + &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 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 + &ubyte CIA1TBH = $DC07 ; CIA 1 timer B high byte + &ubyte CIA1TOD10 = $DC08 ; time of day, 1/10 sec. + &ubyte CIA1TODSEC = $DC09 ; time of day, seconds + &ubyte CIA1TODMMIN = $DC0A ; time of day, minutes + &ubyte CIA1TODHR = $DC0B ; time of day, hours + &ubyte CIA1SDR = $DC0C ; Serial Data Register + &ubyte CIA1ICR = $DC0D + &ubyte CIA1CRA = $DC0E + &ubyte CIA1CRB = $DC0F - memory ubyte CIA2PRA = $DD00 ; CIA 2 DRA, serial port and video address - memory ubyte CIA2PRB = $DD01 ; CIA 2 DRB, RS232 port / USERPORT - memory ubyte CIA2DDRA = $DD02 ; CIA 2 DDRA, serial port and video address - memory ubyte CIA2DDRB = $DD03 ; CIA 2 DDRB, RS232 port / USERPORT - memory ubyte CIA2TAL = $DD04 ; CIA 2 timer A low byte - memory ubyte CIA2TAH = $DD05 ; CIA 2 timer A high byte - memory ubyte CIA2TBL = $DD06 ; CIA 2 timer B low byte - memory ubyte CIA2TBH = $DD07 ; CIA 2 timer B high byte - memory ubyte CIA2TOD10 = $DD08 ; time of day, 1/10 sec. - memory ubyte CIA2TODSEC = $DD09 ; time of day, seconds - memory ubyte CIA2TODMIN = $DD0A ; time of day, minutes - memory ubyte CIA2TODHR = $DD0B ; time of day, hours - memory ubyte CIA2SDR = $DD0C ; Serial Data Register - memory ubyte CIA2ICR = $DD0D - memory ubyte CIA2CRA = $DD0E - memory ubyte CIA2CRB = $DD0F + &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 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 + &ubyte CIA2TBH = $DD07 ; CIA 2 timer B high byte + &ubyte CIA2TOD10 = $DD08 ; time of day, 1/10 sec. + &ubyte CIA2TODSEC = $DD09 ; time of day, seconds + &ubyte CIA2TODMIN = $DD0A ; time of day, minutes + &ubyte CIA2TODHR = $DD0B ; time of day, hours + &ubyte CIA2SDR = $DD0C ; Serial Data Register + &ubyte CIA2ICR = $DD0D + &ubyte CIA2CRA = $DD0E + &ubyte CIA2CRB = $DD0F ; ---- end of CIA registers ---- ; ---- SID 6581/8580 registers ---- - memory ubyte FREQLO1 = $D400 ; channel 1 freq lo - memory ubyte FREQHI1 = $D401 ; channel 1 freq hi - memory uword FREQ1 = $D400 ; channel 1 freq (word) - memory ubyte PWLO1 = $D402 ; channel 1 pulse width lo (7-0) - memory ubyte PWHI1 = $D403 ; channel 1 pulse width hi (11-8) - memory uword PW1 = $D402 ; channel 1 pulse width (word) - memory ubyte CR1 = $D404 ; channel 1 voice control register - memory ubyte AD1 = $D405 ; channel 1 attack & decay - memory ubyte SR1 = $D406 ; channel 1 sustain & release - memory ubyte FREQLO2 = $D407 ; channel 2 freq lo - memory ubyte FREQHI2 = $D408 ; channel 2 freq hi - memory uword FREQ2 = $D407 ; channel 2 freq (word) - memory ubyte PWLO2 = $D409 ; channel 2 pulse width lo (7-0) - memory ubyte PWHI2 = $D40A ; channel 2 pulse width hi (11-8) - memory uword PW2 = $D409 ; channel 2 pulse width (word) - memory ubyte CR2 = $D40B ; channel 2 voice control register - memory ubyte AD2 = $D40C ; channel 2 attack & decay - memory ubyte SR2 = $D40D ; channel 2 sustain & release - memory ubyte FREQLO3 = $D40E ; channel 3 freq lo - memory ubyte FREQHI3 = $D40F ; channel 3 freq hi - memory uword FREQ3 = $D40E ; channel 3 freq (word) - memory ubyte PWLO3 = $D410 ; channel 3 pulse width lo (7-0) - memory ubyte PWHI3 = $D411 ; channel 3 pulse width hi (11-8) - memory uword PW3 = $D410 ; channel 3 pulse width (word) - memory ubyte CR3 = $D412 ; channel 3 voice control register - memory ubyte AD3 = $D413 ; channel 3 attack & decay - memory ubyte SR3 = $D414 ; channel 3 sustain & release - memory ubyte FCLO = $D415 ; filter cutoff lo (2-0) - memory ubyte FCHI = $D416 ; filter cutoff hi (10-3) - memory uword FC = $D415 ; filter cutoff (word) - memory ubyte RESFILT = $D417 ; filter resonance and routing - memory ubyte MVOL = $D418 ; filter mode and main volume control - memory ubyte POTX = $D419 ; potentiometer X - memory ubyte POTY = $D41A ; potentiometer Y - memory ubyte OSC3 = $D41B ; channel 3 oscillator value read - memory ubyte ENV3 = $D41C ; channel 3 envelope value read + &ubyte FREQLO1 = $D400 ; channel 1 freq lo + &ubyte FREQHI1 = $D401 ; channel 1 freq hi + &uword FREQ1 = $D400 ; channel 1 freq (word) + &ubyte PWLO1 = $D402 ; channel 1 pulse width lo (7-0) + &ubyte PWHI1 = $D403 ; channel 1 pulse width hi (11-8) + &uword PW1 = $D402 ; channel 1 pulse width (word) + &ubyte CR1 = $D404 ; channel 1 voice control register + &ubyte AD1 = $D405 ; channel 1 attack & decay + &ubyte SR1 = $D406 ; channel 1 sustain & release + &ubyte FREQLO2 = $D407 ; channel 2 freq lo + &ubyte FREQHI2 = $D408 ; channel 2 freq hi + &uword FREQ2 = $D407 ; channel 2 freq (word) + &ubyte PWLO2 = $D409 ; channel 2 pulse width lo (7-0) + &ubyte PWHI2 = $D40A ; channel 2 pulse width hi (11-8) + &uword PW2 = $D409 ; channel 2 pulse width (word) + &ubyte CR2 = $D40B ; channel 2 voice control register + &ubyte AD2 = $D40C ; channel 2 attack & decay + &ubyte SR2 = $D40D ; channel 2 sustain & release + &ubyte FREQLO3 = $D40E ; channel 3 freq lo + &ubyte FREQHI3 = $D40F ; channel 3 freq hi + &uword FREQ3 = $D40E ; channel 3 freq (word) + &ubyte PWLO3 = $D410 ; channel 3 pulse width lo (7-0) + &ubyte PWHI3 = $D411 ; channel 3 pulse width hi (11-8) + &uword PW3 = $D410 ; channel 3 pulse width (word) + &ubyte CR3 = $D412 ; channel 3 voice control register + &ubyte AD3 = $D413 ; channel 3 attack & decay + &ubyte SR3 = $D414 ; channel 3 sustain & release + &ubyte FCLO = $D415 ; filter cutoff lo (2-0) + &ubyte FCHI = $D416 ; filter cutoff hi (10-3) + &uword FC = $D415 ; filter cutoff (word) + &ubyte RESFILT = $D417 ; filter resonance and routing + &ubyte MVOL = $D418 ; filter mode and main volume control + &ubyte POTX = $D419 ; potentiometer X + &ubyte POTY = $D41A ; potentiometer Y + &ubyte OSC3 = $D41B ; channel 3 oscillator value read + &ubyte ENV3 = $D41C ; channel 3 envelope value read ; ---- end of SID registers ---- diff --git a/docs/source/programming.rst b/docs/source/programming.rst index 3d86b97d7..fa19e0278 100644 --- a/docs/source/programming.rst +++ b/docs/source/programming.rst @@ -281,13 +281,13 @@ You'll have to specify the initial value expression. This value is then used by the compiler everywhere you refer to the constant (and no storage is allocated for the constant itself). This is only valid for the simple numeric types (byte, word, float). -When using ``memory``, the variable will point to specific location in memory, +When using ``&`` (the address-of operator but now applied to a datatype), the variable will point to specific location in memory, rather than being newly allocated. The initial value (mandatory) must be a valid memory address. Reading the variable will read the given data type from the address you specified, and setting the varible will directly modify that memory location(s):: const byte max_age = 2000 - 1974 ; max_age will be the constant value 26 - memory word SCREENCOLORS = $d020 ; a 16-bit word at the addres $d020-$d021 + &word SCREENCOLORS = $d020 ; a 16-bit word at the addres $d020-$d021 .. note:: diff --git a/docs/source/syntaxreference.rst b/docs/source/syntaxreference.rst index b80d99ba0..24288fc3e 100644 --- a/docs/source/syntaxreference.rst +++ b/docs/source/syntaxreference.rst @@ -291,11 +291,11 @@ for example ``ubyte ub = floatvalue as ubyte`` will convert the floating point v Memory mapped variables ^^^^^^^^^^^^^^^^^^^^^^^ -The ``memory`` keyword is used in front of a data type keyword, to say that no storage +The ``&`` (address-of operator) used in front of a data type keyword, indicates that no storage should be allocated by the compiler. Instead, the (mandatory) value assigned to the variable should be the *memory address* where the value is located:: - memory byte BORDER = $d020 + &byte BORDERCOLOR = $d020 Direct access to memory locations @@ -405,6 +405,8 @@ address of: ``&`` It results in the memory address (UWORD) of that string or array in memory: ``uword a = &stringvar`` Sometimes the compiler silently inserts this operator to make it easier for instance to pass strings or arrays as subroutine call arguments. + This operator can also be used as a prefix to a variable's data type keyword to indicate that + it is a memory mapped variable (for instance: ``&ubyte screencolor = $d021``) precedence grouping in expressions, or subroutine parameter list: ``(`` *expression* ``)`` Parentheses are used to group parts of an expression to change the order of evaluation. diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 7f422b021..f8aaa2b9e 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -74,7 +74,6 @@ of values together (and use it multiple times). Something like:: Misc ^^^^ -- replace ``memory`` keyword in vardecls by just ``&`` - implement %asmbinary - make the array size optional in the var decl if an initialization array is given - are there any other missing instructions in the code generator? diff --git a/parser/antlr/prog8.g4 b/parser/antlr/prog8.g4 index 359fa39d2..bb4a6a141 100644 --- a/parser/antlr/prog8.g4 +++ b/parser/antlr/prog8.g4 @@ -23,6 +23,7 @@ NAME : [a-zA-Z_][a-zA-Z0-9_]* ; DEC_INTEGER : ('0'..'9') | (('1'..'9')('0'..'9')+); HEX_INTEGER : '$' (('a'..'f') | ('A'..'F') | ('0'..'9'))+ ; BIN_INTEGER : '%' ('0' | '1')+ ; +ADDRESS_OF: '&'; FLOAT_NUMBER : FNUMBER (('E'|'e') ('+' | '-')? FNUMBER)? ; // sign comes later from unary expression fragment FNUMBER : ('0' .. '9') + ('.' ('0' .. '9') +)? ; @@ -109,7 +110,7 @@ varinitializer : vardecl '=' expression ; constdecl: 'const' varinitializer ; -memoryvardecl: 'memory' varinitializer; // TODO replace 'memory' by '&' +memoryvardecl: ADDRESS_OF varinitializer; datatype: 'ubyte' | 'byte' | 'uword' | 'word' | 'float' | 'str' | 'str_s' ; @@ -167,7 +168,7 @@ arrayindexed : scoped_identifier arrayspec ; directmemory : '@' '(' expression ')'; -addressof : '&' scoped_identifier ; +addressof : ADDRESS_OF scoped_identifier ; functioncall : scoped_identifier '(' expression_list? ')' ; diff --git a/parser/src/prog8/parser/prog8Lexer.java b/parser/src/prog8/parser/prog8Lexer.java index 688918bfe..70dab5391 100644 --- a/parser/src/prog8/parser/prog8Lexer.java +++ b/parser/src/prog8/parser/prog8Lexer.java @@ -1,4 +1,4 @@ -// Generated from /home/irmen/Projects/prog8/parser/antlr/prog8.g4 by ANTLR 4.7.2 +// Generated from ./parser/antlr/prog8.g4 by ANTLR 4.7.2 package prog8.parser; @@ -34,9 +34,9 @@ public class prog8Lexer extends Lexer { T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94, T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101, T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107, - T__107=108, T__108=109, T__109=110, LINECOMMENT=111, COMMENT=112, WS=113, - EOL=114, NAME=115, DEC_INTEGER=116, HEX_INTEGER=117, BIN_INTEGER=118, - FLOAT_NUMBER=119, STRING=120, INLINEASMBLOCK=121, SINGLECHAR=122, ZEROPAGE=123; + T__107=108, LINECOMMENT=109, COMMENT=110, WS=111, EOL=112, NAME=113, DEC_INTEGER=114, + HEX_INTEGER=115, BIN_INTEGER=116, ADDRESS_OF=117, FLOAT_NUMBER=118, STRING=119, + INLINEASMBLOCK=120, SINGLECHAR=121, ZEROPAGE=122; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -60,8 +60,8 @@ public class prog8Lexer extends Lexer { "T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "T__88", "T__89", "T__90", "T__91", "T__92", "T__93", "T__94", "T__95", "T__96", "T__97", "T__98", "T__99", "T__100", "T__101", "T__102", "T__103", "T__104", - "T__105", "T__106", "T__107", "T__108", "T__109", "LINECOMMENT", "COMMENT", - "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", + "T__105", "T__106", "T__107", "LINECOMMENT", "COMMENT", "WS", "EOL", + "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "ADDRESS_OF", "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK", "SINGLECHAR", "ZEROPAGE" }; @@ -72,20 +72,19 @@ public class prog8Lexer extends Lexer { return new String[] { null, "'~'", "':'", "'goto'", "'%output'", "'%launcher'", "'%zeropage'", "'%zpreserved'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", - "'%asmbinary'", "'%option'", "','", "'='", "'const'", "'memory'", "'ubyte'", - "'byte'", "'uword'", "'word'", "'float'", "'str'", "'str_s'", "'['", - "']'", "'+='", "'-='", "'/='", "'*='", "'**='", "'&='", "'|='", "'^='", - "'%='", "'<<='", "'>>='", "'++'", "'--'", "'+'", "'-'", "'**'", "'*'", - "'/'", "'%'", "'<<'", "'>>'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", - "'&'", "'^'", "'|'", "'to'", "'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'", "'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, null, null, null, null, null, - null, null, null, null, "'@zp'" + "'%asmbinary'", "'%option'", "','", "'='", "'const'", "'ubyte'", "'byte'", + "'uword'", "'word'", "'float'", "'str'", "'str_s'", "'['", "']'", "'+='", + "'-='", "'/='", "'*='", "'**='", "'&='", "'|='", "'^='", "'%='", "'<<='", + "'>>='", "'++'", "'--'", "'+'", "'-'", "'**'", "'*'", "'/'", "'%'", "'<<'", + "'>>'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'^'", "'|'", "'to'", + "'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'", + "'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, + null, null, null, null, null, "'&'", null, null, null, null, "'@zp'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -100,8 +99,8 @@ public class prog8Lexer extends Lexer { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", - "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", + null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", + "BIN_INTEGER", "ADDRESS_OF", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", "SINGLECHAR", "ZEROPAGE" }; } @@ -166,13 +165,13 @@ public class prog8Lexer extends Lexer { @Override public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { switch (ruleIndex) { - case 121: + case 120: STRING_action((RuleContext)_localctx, actionIndex); break; - case 122: + case 121: INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex); break; - case 123: + case 122: SINGLECHAR_action((RuleContext)_localctx, actionIndex); break; } @@ -212,7 +211,7 @@ public class prog8Lexer extends Lexer { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2}\u0362\b\1\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2|\u0359\b\1\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"+ @@ -225,279 +224,277 @@ public class prog8Lexer extends Lexer { "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+ "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ - "w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\3\2\3\2\3\3\3\3\3\4\3\4"+ - "\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3"+ - "\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b"+ - "\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3"+ - "\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+ - "\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3"+ - "\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3"+ - "\16\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3"+ - "\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+ - "\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3"+ - "\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3"+ - "\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3"+ - "\36\3\37\3\37\3\37\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)\3)\3*\3*\3+\3+\3+\3,"+ - "\3,\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63"+ - "\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\66\3\67\3\67\38\38\39"+ - "\39\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\3B\3B\3B\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E"+ - "\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3H\3H\3I\3I\3J\3J\3K\3K\3K\3L\3L\3L"+ - "\3M\3M\3M\3N\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3R\3R\3R\3S\3S\3S\3S\3S"+ - "\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V\3V\3V\3W\3W\3W\3X\3X\3Y\3Y\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`\3`\3`\3`\3`\3a\3a\3a"+ - "\3a\3a\3a\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\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\3h"+ - "\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3l\3l\3l\3m\3m\3m\3m"+ - "\3m\3m\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\7p\u02ed\np\fp\16"+ - "p\u02f0\13p\3p\3p\3p\3p\3q\3q\7q\u02f8\nq\fq\16q\u02fb\13q\3q\3q\3r\3"+ - "r\3r\3r\3s\6s\u0304\ns\rs\16s\u0305\3t\3t\7t\u030a\nt\ft\16t\u030d\13"+ - "t\3u\3u\3u\6u\u0312\nu\ru\16u\u0313\5u\u0316\nu\3v\3v\6v\u031a\nv\rv\16"+ - "v\u031b\3w\3w\6w\u0320\nw\rw\16w\u0321\3x\3x\3x\5x\u0327\nx\3x\5x\u032a"+ - "\nx\3y\6y\u032d\ny\ry\16y\u032e\3y\3y\6y\u0333\ny\ry\16y\u0334\5y\u0337"+ - "\ny\3z\3z\3z\3z\5z\u033d\nz\3{\3{\3{\7{\u0342\n{\f{\16{\u0345\13{\3{\3"+ - "{\3{\3|\3|\3|\3|\6|\u034e\n|\r|\16|\u034f\3|\3|\3|\3|\3|\3}\3}\3}\5}\u035a"+ - "\n}\3}\3}\3}\3~\3~\3~\3~\3\u034f\2\177\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21"+ - "\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30"+ - "/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.["+ - "/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083"+ - "C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097"+ - "M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab"+ - "W\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bf"+ - "a\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3"+ - "k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7"+ - "u\u00e9v\u00ebw\u00edx\u00efy\u00f1\2\u00f3\2\u00f5z\u00f7{\u00f9|\u00fb"+ - "}\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;"+ - "CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u0371\2\3\3\2\2\2\2\5\3\2\2\2"+ - "\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3"+ - "\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2"+ - "\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2"+ - "\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2"+ - "\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2"+ - "\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2"+ - "\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y"+ - "\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2"+ - "\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2"+ - "\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177"+ - "\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2"+ - "\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091"+ - "\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2"+ - "\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3"+ - "\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2"+ - "\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5"+ - "\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2"+ - "\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7"+ - "\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2"+ - "\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9"+ - "\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2"+ - "\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb"+ - "\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2"+ - "\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\3\u00fd\3\2\2\2\5\u00ff\3\2\2\2\7\u0101"+ - "\3\2\2\2\t\u0106\3\2\2\2\13\u010e\3\2\2\2\r\u0118\3\2\2\2\17\u0122\3\2"+ - "\2\2\21\u012e\3\2\2\2\23\u0137\3\2\2\2\25\u013f\3\2\2\2\27\u014b\3\2\2"+ - "\2\31\u0157\3\2\2\2\33\u0162\3\2\2\2\35\u016a\3\2\2\2\37\u016c\3\2\2\2"+ - "!\u016e\3\2\2\2#\u0174\3\2\2\2%\u017b\3\2\2\2\'\u0181\3\2\2\2)\u0186\3"+ - "\2\2\2+\u018c\3\2\2\2-\u0191\3\2\2\2/\u0197\3\2\2\2\61\u019b\3\2\2\2\63"+ - "\u01a1\3\2\2\2\65\u01a3\3\2\2\2\67\u01a5\3\2\2\29\u01a8\3\2\2\2;\u01ab"+ - "\3\2\2\2=\u01ae\3\2\2\2?\u01b1\3\2\2\2A\u01b5\3\2\2\2C\u01b8\3\2\2\2E"+ - "\u01bb\3\2\2\2G\u01be\3\2\2\2I\u01c1\3\2\2\2K\u01c5\3\2\2\2M\u01c9\3\2"+ - "\2\2O\u01cc\3\2\2\2Q\u01cf\3\2\2\2S\u01d1\3\2\2\2U\u01d3\3\2\2\2W\u01d6"+ - "\3\2\2\2Y\u01d8\3\2\2\2[\u01da\3\2\2\2]\u01dc\3\2\2\2_\u01df\3\2\2\2a"+ - "\u01e2\3\2\2\2c\u01e4\3\2\2\2e\u01e6\3\2\2\2g\u01e9\3\2\2\2i\u01ec\3\2"+ - "\2\2k\u01ef\3\2\2\2m\u01f2\3\2\2\2o\u01f4\3\2\2\2q\u01f6\3\2\2\2s\u01f8"+ - "\3\2\2\2u\u01fb\3\2\2\2w\u0200\3\2\2\2y\u0204\3\2\2\2{\u0207\3\2\2\2}"+ - "\u020b\3\2\2\2\177\u020f\3\2\2\2\u0081\u0211\3\2\2\2\u0083\u0213\3\2\2"+ - "\2\u0085\u0216\3\2\2\2\u0087\u0218\3\2\2\2\u0089\u021f\3\2\2\2\u008b\u0225"+ - "\3\2\2\2\u008d\u022e\3\2\2\2\u008f\u0230\3\2\2\2\u0091\u0232\3\2\2\2\u0093"+ - "\u0234\3\2\2\2\u0095\u0236\3\2\2\2\u0097\u0239\3\2\2\2\u0099\u023c\3\2"+ - "\2\2\u009b\u023f\3\2\2\2\u009d\u0242\3\2\2\2\u009f\u0245\3\2\2\2\u00a1"+ - "\u0248\3\2\2\2\u00a3\u024b\3\2\2\2\u00a5\u024e\3\2\2\2\u00a7\u0253\3\2"+ - "\2\2\u00a9\u0259\3\2\2\2\u00ab\u025e\3\2\2\2\u00ad\u0262\3\2\2\2\u00af"+ - "\u0265\3\2\2\2\u00b1\u0267\3\2\2\2\u00b3\u0269\3\2\2\2\u00b5\u0270\3\2"+ - "\2\2\u00b7\u0279\3\2\2\2\u00b9\u027f\3\2\2\2\u00bb\u0282\3\2\2\2\u00bd"+ - "\u0287\3\2\2\2\u00bf\u028d\3\2\2\2\u00c1\u0293\3\2\2\2\u00c3\u0299\3\2"+ - "\2\2\u00c5\u029e\3\2\2\2\u00c7\u02a4\3\2\2\2\u00c9\u02aa\3\2\2\2\u00cb"+ - "\u02b0\3\2\2\2\u00cd\u02b7\3\2\2\2\u00cf\u02bd\3\2\2\2\u00d1\u02c4\3\2"+ - "\2\2\u00d3\u02ca\3\2\2\2\u00d5\u02d0\3\2\2\2\u00d7\u02d4\3\2\2\2\u00d9"+ - "\u02d7\3\2\2\2\u00db\u02dd\3\2\2\2\u00dd\u02e4\3\2\2\2\u00df\u02ea\3\2"+ - "\2\2\u00e1\u02f5\3\2\2\2\u00e3\u02fe\3\2\2\2\u00e5\u0303\3\2\2\2\u00e7"+ - "\u0307\3\2\2\2\u00e9\u0315\3\2\2\2\u00eb\u0317\3\2\2\2\u00ed\u031d\3\2"+ - "\2\2\u00ef\u0323\3\2\2\2\u00f1\u032c\3\2\2\2\u00f3\u033c\3\2\2\2\u00f5"+ - "\u033e\3\2\2\2\u00f7\u0349\3\2\2\2\u00f9\u0356\3\2\2\2\u00fb\u035e\3\2"+ - "\2\2\u00fd\u00fe\7\u0080\2\2\u00fe\4\3\2\2\2\u00ff\u0100\7<\2\2\u0100"+ - "\6\3\2\2\2\u0101\u0102\7i\2\2\u0102\u0103\7q\2\2\u0103\u0104\7v\2\2\u0104"+ - "\u0105\7q\2\2\u0105\b\3\2\2\2\u0106\u0107\7\'\2\2\u0107\u0108\7q\2\2\u0108"+ - "\u0109\7w\2\2\u0109\u010a\7v\2\2\u010a\u010b\7r\2\2\u010b\u010c\7w\2\2"+ - "\u010c\u010d\7v\2\2\u010d\n\3\2\2\2\u010e\u010f\7\'\2\2\u010f\u0110\7"+ - "n\2\2\u0110\u0111\7c\2\2\u0111\u0112\7w\2\2\u0112\u0113\7p\2\2\u0113\u0114"+ - "\7e\2\2\u0114\u0115\7j\2\2\u0115\u0116\7g\2\2\u0116\u0117\7t\2\2\u0117"+ - "\f\3\2\2\2\u0118\u0119\7\'\2\2\u0119\u011a\7|\2\2\u011a\u011b\7g\2\2\u011b"+ - "\u011c\7t\2\2\u011c\u011d\7q\2\2\u011d\u011e\7r\2\2\u011e\u011f\7c\2\2"+ - "\u011f\u0120\7i\2\2\u0120\u0121\7g\2\2\u0121\16\3\2\2\2\u0122\u0123\7"+ - "\'\2\2\u0123\u0124\7|\2\2\u0124\u0125\7r\2\2\u0125\u0126\7t\2\2\u0126"+ - "\u0127\7g\2\2\u0127\u0128\7u\2\2\u0128\u0129\7g\2\2\u0129\u012a\7t\2\2"+ - "\u012a\u012b\7x\2\2\u012b\u012c\7g\2\2\u012c\u012d\7f\2\2\u012d\20\3\2"+ - "\2\2\u012e\u012f\7\'\2\2\u012f\u0130\7c\2\2\u0130\u0131\7f\2\2\u0131\u0132"+ - "\7f\2\2\u0132\u0133\7t\2\2\u0133\u0134\7g\2\2\u0134\u0135\7u\2\2\u0135"+ - "\u0136\7u\2\2\u0136\22\3\2\2\2\u0137\u0138\7\'\2\2\u0138\u0139\7k\2\2"+ - "\u0139\u013a\7o\2\2\u013a\u013b\7r\2\2\u013b\u013c\7q\2\2\u013c\u013d"+ - "\7t\2\2\u013d\u013e\7v\2\2\u013e\24\3\2\2\2\u013f\u0140\7\'\2\2\u0140"+ - "\u0141\7d\2\2\u0141\u0142\7t\2\2\u0142\u0143\7g\2\2\u0143\u0144\7c\2\2"+ - "\u0144\u0145\7m\2\2\u0145\u0146\7r\2\2\u0146\u0147\7q\2\2\u0147\u0148"+ - "\7k\2\2\u0148\u0149\7p\2\2\u0149\u014a\7v\2\2\u014a\26\3\2\2\2\u014b\u014c"+ - "\7\'\2\2\u014c\u014d\7c\2\2\u014d\u014e\7u\2\2\u014e\u014f\7o\2\2\u014f"+ - "\u0150\7k\2\2\u0150\u0151\7p\2\2\u0151\u0152\7e\2\2\u0152\u0153\7n\2\2"+ - "\u0153\u0154\7w\2\2\u0154\u0155\7f\2\2\u0155\u0156\7g\2\2\u0156\30\3\2"+ - "\2\2\u0157\u0158\7\'\2\2\u0158\u0159\7c\2\2\u0159\u015a\7u\2\2\u015a\u015b"+ - "\7o\2\2\u015b\u015c\7d\2\2\u015c\u015d\7k\2\2\u015d\u015e\7p\2\2\u015e"+ - "\u015f\7c\2\2\u015f\u0160\7t\2\2\u0160\u0161\7{\2\2\u0161\32\3\2\2\2\u0162"+ - "\u0163\7\'\2\2\u0163\u0164\7q\2\2\u0164\u0165\7r\2\2\u0165\u0166\7v\2"+ - "\2\u0166\u0167\7k\2\2\u0167\u0168\7q\2\2\u0168\u0169\7p\2\2\u0169\34\3"+ - "\2\2\2\u016a\u016b\7.\2\2\u016b\36\3\2\2\2\u016c\u016d\7?\2\2\u016d \3"+ - "\2\2\2\u016e\u016f\7e\2\2\u016f\u0170\7q\2\2\u0170\u0171\7p\2\2\u0171"+ - "\u0172\7u\2\2\u0172\u0173\7v\2\2\u0173\"\3\2\2\2\u0174\u0175\7o\2\2\u0175"+ - "\u0176\7g\2\2\u0176\u0177\7o\2\2\u0177\u0178\7q\2\2\u0178\u0179\7t\2\2"+ - "\u0179\u017a\7{\2\2\u017a$\3\2\2\2\u017b\u017c\7w\2\2\u017c\u017d\7d\2"+ - "\2\u017d\u017e\7{\2\2\u017e\u017f\7v\2\2\u017f\u0180\7g\2\2\u0180&\3\2"+ - "\2\2\u0181\u0182\7d\2\2\u0182\u0183\7{\2\2\u0183\u0184\7v\2\2\u0184\u0185"+ - "\7g\2\2\u0185(\3\2\2\2\u0186\u0187\7w\2\2\u0187\u0188\7y\2\2\u0188\u0189"+ - "\7q\2\2\u0189\u018a\7t\2\2\u018a\u018b\7f\2\2\u018b*\3\2\2\2\u018c\u018d"+ - "\7y\2\2\u018d\u018e\7q\2\2\u018e\u018f\7t\2\2\u018f\u0190\7f\2\2\u0190"+ - ",\3\2\2\2\u0191\u0192\7h\2\2\u0192\u0193\7n\2\2\u0193\u0194\7q\2\2\u0194"+ - "\u0195\7c\2\2\u0195\u0196\7v\2\2\u0196.\3\2\2\2\u0197\u0198\7u\2\2\u0198"+ - "\u0199\7v\2\2\u0199\u019a\7t\2\2\u019a\60\3\2\2\2\u019b\u019c\7u\2\2\u019c"+ - "\u019d\7v\2\2\u019d\u019e\7t\2\2\u019e\u019f\7a\2\2\u019f\u01a0\7u\2\2"+ - "\u01a0\62\3\2\2\2\u01a1\u01a2\7]\2\2\u01a2\64\3\2\2\2\u01a3\u01a4\7_\2"+ - "\2\u01a4\66\3\2\2\2\u01a5\u01a6\7-\2\2\u01a6\u01a7\7?\2\2\u01a78\3\2\2"+ - "\2\u01a8\u01a9\7/\2\2\u01a9\u01aa\7?\2\2\u01aa:\3\2\2\2\u01ab\u01ac\7"+ - "\61\2\2\u01ac\u01ad\7?\2\2\u01ad<\3\2\2\2\u01ae\u01af\7,\2\2\u01af\u01b0"+ - "\7?\2\2\u01b0>\3\2\2\2\u01b1\u01b2\7,\2\2\u01b2\u01b3\7,\2\2\u01b3\u01b4"+ - "\7?\2\2\u01b4@\3\2\2\2\u01b5\u01b6\7(\2\2\u01b6\u01b7\7?\2\2\u01b7B\3"+ - "\2\2\2\u01b8\u01b9\7~\2\2\u01b9\u01ba\7?\2\2\u01baD\3\2\2\2\u01bb\u01bc"+ - "\7`\2\2\u01bc\u01bd\7?\2\2\u01bdF\3\2\2\2\u01be\u01bf\7\'\2\2\u01bf\u01c0"+ - "\7?\2\2\u01c0H\3\2\2\2\u01c1\u01c2\7>\2\2\u01c2\u01c3\7>\2\2\u01c3\u01c4"+ - "\7?\2\2\u01c4J\3\2\2\2\u01c5\u01c6\7@\2\2\u01c6\u01c7\7@\2\2\u01c7\u01c8"+ - "\7?\2\2\u01c8L\3\2\2\2\u01c9\u01ca\7-\2\2\u01ca\u01cb\7-\2\2\u01cbN\3"+ - "\2\2\2\u01cc\u01cd\7/\2\2\u01cd\u01ce\7/\2\2\u01ceP\3\2\2\2\u01cf\u01d0"+ - "\7-\2\2\u01d0R\3\2\2\2\u01d1\u01d2\7/\2\2\u01d2T\3\2\2\2\u01d3\u01d4\7"+ - ",\2\2\u01d4\u01d5\7,\2\2\u01d5V\3\2\2\2\u01d6\u01d7\7,\2\2\u01d7X\3\2"+ - "\2\2\u01d8\u01d9\7\61\2\2\u01d9Z\3\2\2\2\u01da\u01db\7\'\2\2\u01db\\\3"+ - "\2\2\2\u01dc\u01dd\7>\2\2\u01dd\u01de\7>\2\2\u01de^\3\2\2\2\u01df\u01e0"+ - "\7@\2\2\u01e0\u01e1\7@\2\2\u01e1`\3\2\2\2\u01e2\u01e3\7>\2\2\u01e3b\3"+ - "\2\2\2\u01e4\u01e5\7@\2\2\u01e5d\3\2\2\2\u01e6\u01e7\7>\2\2\u01e7\u01e8"+ - "\7?\2\2\u01e8f\3\2\2\2\u01e9\u01ea\7@\2\2\u01ea\u01eb\7?\2\2\u01ebh\3"+ - "\2\2\2\u01ec\u01ed\7?\2\2\u01ed\u01ee\7?\2\2\u01eej\3\2\2\2\u01ef\u01f0"+ - "\7#\2\2\u01f0\u01f1\7?\2\2\u01f1l\3\2\2\2\u01f2\u01f3\7(\2\2\u01f3n\3"+ - "\2\2\2\u01f4\u01f5\7`\2\2\u01f5p\3\2\2\2\u01f6\u01f7\7~\2\2\u01f7r\3\2"+ - "\2\2\u01f8\u01f9\7v\2\2\u01f9\u01fa\7q\2\2\u01fat\3\2\2\2\u01fb\u01fc"+ - "\7u\2\2\u01fc\u01fd\7v\2\2\u01fd\u01fe\7g\2\2\u01fe\u01ff\7r\2\2\u01ff"+ - "v\3\2\2\2\u0200\u0201\7c\2\2\u0201\u0202\7p\2\2\u0202\u0203\7f\2\2\u0203"+ - "x\3\2\2\2\u0204\u0205\7q\2\2\u0205\u0206\7t\2\2\u0206z\3\2\2\2\u0207\u0208"+ - "\7z\2\2\u0208\u0209\7q\2\2\u0209\u020a\7t\2\2\u020a|\3\2\2\2\u020b\u020c"+ - "\7p\2\2\u020c\u020d\7q\2\2\u020d\u020e\7v\2\2\u020e~\3\2\2\2\u020f\u0210"+ - "\7*\2\2\u0210\u0080\3\2\2\2\u0211\u0212\7+\2\2\u0212\u0082\3\2\2\2\u0213"+ - "\u0214\7c\2\2\u0214\u0215\7u\2\2\u0215\u0084\3\2\2\2\u0216\u0217\7B\2"+ - "\2\u0217\u0086\3\2\2\2\u0218\u0219\7t\2\2\u0219\u021a\7g\2\2\u021a\u021b"+ - "\7v\2\2\u021b\u021c\7w\2\2\u021c\u021d\7t\2\2\u021d\u021e\7p\2\2\u021e"+ - "\u0088\3\2\2\2\u021f\u0220\7d\2\2\u0220\u0221\7t\2\2\u0221\u0222\7g\2"+ - "\2\u0222\u0223\7c\2\2\u0223\u0224\7m\2\2\u0224\u008a\3\2\2\2\u0225\u0226"+ - "\7e\2\2\u0226\u0227\7q\2\2\u0227\u0228\7p\2\2\u0228\u0229\7v\2\2\u0229"+ - "\u022a\7k\2\2\u022a\u022b\7p\2\2\u022b\u022c\7w\2\2\u022c\u022d\7g\2\2"+ - "\u022d\u008c\3\2\2\2\u022e\u022f\7\60\2\2\u022f\u008e\3\2\2\2\u0230\u0231"+ - "\7C\2\2\u0231\u0090\3\2\2\2\u0232\u0233\7Z\2\2\u0233\u0092\3\2\2\2\u0234"+ - "\u0235\7[\2\2\u0235\u0094\3\2\2\2\u0236\u0237\7C\2\2\u0237\u0238\7Z\2"+ - "\2\u0238\u0096\3\2\2\2\u0239\u023a\7C\2\2\u023a\u023b\7[\2\2\u023b\u0098"+ - "\3\2\2\2\u023c\u023d\7Z\2\2\u023d\u023e\7[\2\2\u023e\u009a\3\2\2\2\u023f"+ - "\u0240\7R\2\2\u0240\u0241\7e\2\2\u0241\u009c\3\2\2\2\u0242\u0243\7R\2"+ - "\2\u0243\u0244\7|\2\2\u0244\u009e\3\2\2\2\u0245\u0246\7R\2\2\u0246\u0247"+ - "\7p\2\2\u0247\u00a0\3\2\2\2\u0248\u0249\7R\2\2\u0249\u024a\7x\2\2\u024a"+ - "\u00a2\3\2\2\2\u024b\u024c\7\60\2\2\u024c\u024d\7y\2\2\u024d\u00a4\3\2"+ - "\2\2\u024e\u024f\7v\2\2\u024f\u0250\7t\2\2\u0250\u0251\7w\2\2\u0251\u0252"+ - "\7g\2\2\u0252\u00a6\3\2\2\2\u0253\u0254\7h\2\2\u0254\u0255\7c\2\2\u0255"+ - "\u0256\7n\2\2\u0256\u0257\7u\2\2\u0257\u0258\7g\2\2\u0258\u00a8\3\2\2"+ - "\2\u0259\u025a\7\'\2\2\u025a\u025b\7c\2\2\u025b\u025c\7u\2\2\u025c\u025d"+ - "\7o\2\2\u025d\u00aa\3\2\2\2\u025e\u025f\7u\2\2\u025f\u0260\7w\2\2\u0260"+ - "\u0261\7d\2\2\u0261\u00ac\3\2\2\2\u0262\u0263\7/\2\2\u0263\u0264\7@\2"+ - "\2\u0264\u00ae\3\2\2\2\u0265\u0266\7}\2\2\u0266\u00b0\3\2\2\2\u0267\u0268"+ - "\7\177\2\2\u0268\u00b2\3\2\2\2\u0269\u026a\7c\2\2\u026a\u026b\7u\2\2\u026b"+ - "\u026c\7o\2\2\u026c\u026d\7u\2\2\u026d\u026e\7w\2\2\u026e\u026f\7d\2\2"+ - "\u026f\u00b4\3\2\2\2\u0270\u0271\7e\2\2\u0271\u0272\7n\2\2\u0272\u0273"+ - "\7q\2\2\u0273\u0274\7d\2\2\u0274\u0275\7d\2\2\u0275\u0276\7g\2\2\u0276"+ - "\u0277\7t\2\2\u0277\u0278\7u\2\2\u0278\u00b6\3\2\2\2\u0279\u027a\7u\2"+ - "\2\u027a\u027b\7v\2\2\u027b\u027c\7c\2\2\u027c\u027d\7e\2\2\u027d\u027e"+ - "\7m\2\2\u027e\u00b8\3\2\2\2\u027f\u0280\7k\2\2\u0280\u0281\7h\2\2\u0281"+ - "\u00ba\3\2\2\2\u0282\u0283\7g\2\2\u0283\u0284\7n\2\2\u0284\u0285\7u\2"+ - "\2\u0285\u0286\7g\2\2\u0286\u00bc\3\2\2\2\u0287\u0288\7k\2\2\u0288\u0289"+ - "\7h\2\2\u0289\u028a\7a\2\2\u028a\u028b\7e\2\2\u028b\u028c\7u\2\2\u028c"+ - "\u00be\3\2\2\2\u028d\u028e\7k\2\2\u028e\u028f\7h\2\2\u028f\u0290\7a\2"+ - "\2\u0290\u0291\7e\2\2\u0291\u0292\7e\2\2\u0292\u00c0\3\2\2\2\u0293\u0294"+ - "\7k\2\2\u0294\u0295\7h\2\2\u0295\u0296\7a\2\2\u0296\u0297\7g\2\2\u0297"+ - "\u0298\7s\2\2\u0298\u00c2\3\2\2\2\u0299\u029a\7k\2\2\u029a\u029b\7h\2"+ - "\2\u029b\u029c\7a\2\2\u029c\u029d\7|\2\2\u029d\u00c4\3\2\2\2\u029e\u029f"+ - "\7k\2\2\u029f\u02a0\7h\2\2\u02a0\u02a1\7a\2\2\u02a1\u02a2\7p\2\2\u02a2"+ - "\u02a3\7g\2\2\u02a3\u00c6\3\2\2\2\u02a4\u02a5\7k\2\2\u02a5\u02a6\7h\2"+ - "\2\u02a6\u02a7\7a\2\2\u02a7\u02a8\7p\2\2\u02a8\u02a9\7|\2\2\u02a9\u00c8"+ - "\3\2\2\2\u02aa\u02ab\7k\2\2\u02ab\u02ac\7h\2\2\u02ac\u02ad\7a\2\2\u02ad"+ - "\u02ae\7r\2\2\u02ae\u02af\7n\2\2\u02af\u00ca\3\2\2\2\u02b0\u02b1\7k\2"+ - "\2\u02b1\u02b2\7h\2\2\u02b2\u02b3\7a\2\2\u02b3\u02b4\7r\2\2\u02b4\u02b5"+ - "\7q\2\2\u02b5\u02b6\7u\2\2\u02b6\u00cc\3\2\2\2\u02b7\u02b8\7k\2\2\u02b8"+ - "\u02b9\7h\2\2\u02b9\u02ba\7a\2\2\u02ba\u02bb\7o\2\2\u02bb\u02bc\7k\2\2"+ - "\u02bc\u00ce\3\2\2\2\u02bd\u02be\7k\2\2\u02be\u02bf\7h\2\2\u02bf\u02c0"+ - "\7a\2\2\u02c0\u02c1\7p\2\2\u02c1\u02c2\7g\2\2\u02c2\u02c3\7i\2\2\u02c3"+ - "\u00d0\3\2\2\2\u02c4\u02c5\7k\2\2\u02c5\u02c6\7h\2\2\u02c6\u02c7\7a\2"+ - "\2\u02c7\u02c8\7x\2\2\u02c8\u02c9\7u\2\2\u02c9\u00d2\3\2\2\2\u02ca\u02cb"+ - "\7k\2\2\u02cb\u02cc\7h\2\2\u02cc\u02cd\7a\2\2\u02cd\u02ce\7x\2\2\u02ce"+ - "\u02cf\7e\2\2\u02cf\u00d4\3\2\2\2\u02d0\u02d1\7h\2\2\u02d1\u02d2\7q\2"+ - "\2\u02d2\u02d3\7t\2\2\u02d3\u00d6\3\2\2\2\u02d4\u02d5\7k\2\2\u02d5\u02d6"+ - "\7p\2\2\u02d6\u00d8\3\2\2\2\u02d7\u02d8\7y\2\2\u02d8\u02d9\7j\2\2\u02d9"+ - "\u02da\7k\2\2\u02da\u02db\7n\2\2\u02db\u02dc\7g\2\2\u02dc\u00da\3\2\2"+ - "\2\u02dd\u02de\7t\2\2\u02de\u02df\7g\2\2\u02df\u02e0\7r\2\2\u02e0\u02e1"+ - "\7g\2\2\u02e1\u02e2\7c\2\2\u02e2\u02e3\7v\2\2\u02e3\u00dc\3\2\2\2\u02e4"+ - "\u02e5\7w\2\2\u02e5\u02e6\7p\2\2\u02e6\u02e7\7v\2\2\u02e7\u02e8\7k\2\2"+ - "\u02e8\u02e9\7n\2\2\u02e9\u00de\3\2\2\2\u02ea\u02ee\t\2\2\2\u02eb\u02ed"+ - "\t\3\2\2\u02ec\u02eb\3\2\2\2\u02ed\u02f0\3\2\2\2\u02ee\u02ec\3\2\2\2\u02ee"+ - "\u02ef\3\2\2\2\u02ef\u02f1\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f1\u02f2\5\u00e1"+ - "q\2\u02f2\u02f3\3\2\2\2\u02f3\u02f4\bp\2\2\u02f4\u00e0\3\2\2\2\u02f5\u02f9"+ - "\7=\2\2\u02f6\u02f8\n\2\2\2\u02f7\u02f6\3\2\2\2\u02f8\u02fb\3\2\2\2\u02f9"+ - "\u02f7\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fc\3\2\2\2\u02fb\u02f9\3\2"+ - "\2\2\u02fc\u02fd\bq\2\2\u02fd\u00e2\3\2\2\2\u02fe\u02ff\t\3\2\2\u02ff"+ - "\u0300\3\2\2\2\u0300\u0301\br\3\2\u0301\u00e4\3\2\2\2\u0302\u0304\t\2"+ - "\2\2\u0303\u0302\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0303\3\2\2\2\u0305"+ - "\u0306\3\2\2\2\u0306\u00e6\3\2\2\2\u0307\u030b\t\4\2\2\u0308\u030a\t\5"+ - "\2\2\u0309\u0308\3\2\2\2\u030a\u030d\3\2\2\2\u030b\u0309\3\2\2\2\u030b"+ - "\u030c\3\2\2\2\u030c\u00e8\3\2\2\2\u030d\u030b\3\2\2\2\u030e\u0316\4\62"+ - ";\2\u030f\u0311\4\63;\2\u0310\u0312\4\62;\2\u0311\u0310\3\2\2\2\u0312"+ - "\u0313\3\2\2\2\u0313\u0311\3\2\2\2\u0313\u0314\3\2\2\2\u0314\u0316\3\2"+ - "\2\2\u0315\u030e\3\2\2\2\u0315\u030f\3\2\2\2\u0316\u00ea\3\2\2\2\u0317"+ - "\u0319\7&\2\2\u0318\u031a\t\6\2\2\u0319\u0318\3\2\2\2\u031a\u031b\3\2"+ - "\2\2\u031b\u0319\3\2\2\2\u031b\u031c\3\2\2\2\u031c\u00ec\3\2\2\2\u031d"+ - "\u031f\7\'\2\2\u031e\u0320\4\62\63\2\u031f\u031e\3\2\2\2\u0320\u0321\3"+ - "\2\2\2\u0321\u031f\3\2\2\2\u0321\u0322\3\2\2\2\u0322\u00ee\3\2\2\2\u0323"+ - "\u0329\5\u00f1y\2\u0324\u0326\t\7\2\2\u0325\u0327\t\b\2\2\u0326\u0325"+ - "\3\2\2\2\u0326\u0327\3\2\2\2\u0327\u0328\3\2\2\2\u0328\u032a\5\u00f1y"+ - "\2\u0329\u0324\3\2\2\2\u0329\u032a\3\2\2\2\u032a\u00f0\3\2\2\2\u032b\u032d"+ - "\4\62;\2\u032c\u032b\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u032c\3\2\2\2\u032e"+ - "\u032f\3\2\2\2\u032f\u0336\3\2\2\2\u0330\u0332\7\60\2\2\u0331\u0333\4"+ - "\62;\2\u0332\u0331\3\2\2\2\u0333\u0334\3\2\2\2\u0334\u0332\3\2\2\2\u0334"+ - "\u0335\3\2\2\2\u0335\u0337\3\2\2\2\u0336\u0330\3\2\2\2\u0336\u0337\3\2"+ - "\2\2\u0337\u00f2\3\2\2\2\u0338\u0339\7^\2\2\u0339\u033d\13\2\2\2\u033a"+ - "\u033b\7^\2\2\u033b\u033d\5\u00e5s\2\u033c\u0338\3\2\2\2\u033c\u033a\3"+ - "\2\2\2\u033d\u00f4\3\2\2\2\u033e\u0343\7$\2\2\u033f\u0342\5\u00f3z\2\u0340"+ - "\u0342\n\t\2\2\u0341\u033f\3\2\2\2\u0341\u0340\3\2\2\2\u0342\u0345\3\2"+ - "\2\2\u0343\u0341\3\2\2\2\u0343\u0344\3\2\2\2\u0344\u0346\3\2\2\2\u0345"+ - "\u0343\3\2\2\2\u0346\u0347\7$\2\2\u0347\u0348\b{\4\2\u0348\u00f6\3\2\2"+ - "\2\u0349\u034a\7}\2\2\u034a\u034b\7}\2\2\u034b\u034d\3\2\2\2\u034c\u034e"+ - "\13\2\2\2\u034d\u034c\3\2\2\2\u034e\u034f\3\2\2\2\u034f\u0350\3\2\2\2"+ - "\u034f\u034d\3\2\2\2\u0350\u0351\3\2\2\2\u0351\u0352\7\177\2\2\u0352\u0353"+ - "\7\177\2\2\u0353\u0354\3\2\2\2\u0354\u0355\b|\5\2\u0355\u00f8\3\2\2\2"+ - "\u0356\u0359\7)\2\2\u0357\u035a\5\u00f3z\2\u0358\u035a\n\t\2\2\u0359\u0357"+ - "\3\2\2\2\u0359\u0358\3\2\2\2\u035a\u035b\3\2\2\2\u035b\u035c\7)\2\2\u035c"+ - "\u035d\b}\6\2\u035d\u00fa\3\2\2\2\u035e\u035f\7B\2\2\u035f\u0360\7|\2"+ - "\2\u0360\u0361\7r\2\2\u0361\u00fc\3\2\2\2\26\2\u02ee\u02f9\u0305\u030b"+ - "\u0313\u0315\u0319\u031b\u0321\u0326\u0329\u032e\u0334\u0336\u033c\u0341"+ - "\u0343\u034f\u0359\7\2\3\2\b\2\2\3{\2\3|\3\3}\4"; + "w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3"+ + "\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+ + "\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3"+ + "\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n"+ + "\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+ + "\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3"+ + "\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3"+ + "\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3"+ + "\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3"+ + "\24\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3"+ + "\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\32\3\32\3\33\3\33\3"+ + "\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3\37\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*\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3.\3/\3/\3"+ + "/\3\60\3\60\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65"+ + "\3\65\3\65\3\66\3\66\3\67\3\67\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3;"+ + "\3;\3;\3<\3<\3<\3<\3=\3=\3=\3=\3>\3>\3?\3?\3@\3@\3@\3A\3A\3B\3B\3B\3B"+ + "\3B\3B\3B\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3F\3F\3G"+ + "\3G\3H\3H\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3O\3O"+ + "\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T"+ + "\3T\3U\3U\3U\3V\3V\3W\3W\3X\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y"+ + "\3Y\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\3"+ + "b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d\3d\3e\3e\3e\3e\3"+ + "e\3e\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3i\3i\3"+ + "i\3i\3j\3j\3j\3k\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3"+ + "m\3n\3n\7n\u02e2\nn\fn\16n\u02e5\13n\3n\3n\3n\3n\3o\3o\7o\u02ed\no\fo"+ + "\16o\u02f0\13o\3o\3o\3p\3p\3p\3p\3q\6q\u02f9\nq\rq\16q\u02fa\3r\3r\7r"+ + "\u02ff\nr\fr\16r\u0302\13r\3s\3s\3s\6s\u0307\ns\rs\16s\u0308\5s\u030b"+ + "\ns\3t\3t\6t\u030f\nt\rt\16t\u0310\3u\3u\6u\u0315\nu\ru\16u\u0316\3v\3"+ + "v\3w\3w\3w\5w\u031e\nw\3w\5w\u0321\nw\3x\6x\u0324\nx\rx\16x\u0325\3x\3"+ + "x\6x\u032a\nx\rx\16x\u032b\5x\u032e\nx\3y\3y\3y\3y\5y\u0334\ny\3z\3z\3"+ + "z\7z\u0339\nz\fz\16z\u033c\13z\3z\3z\3z\3{\3{\3{\3{\6{\u0345\n{\r{\16"+ + "{\u0346\3{\3{\3{\3{\3{\3|\3|\3|\5|\u0351\n|\3|\3|\3|\3}\3}\3}\3}\3\u0346"+ + "\2~\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35"+ + "\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36"+ + ";\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67"+ + "m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d"+ + "H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+ + "R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5"+ + "\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9"+ + "f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00dd"+ + "p\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00ef\2\u00f1"+ + "\2\u00f3y\u00f5z\u00f7{\u00f9|\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C"+ + "\\aac|\6\2\62;C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2"+ + "\u0368\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2"+ + "\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3"+ + "\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2"+ + "\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2"+ + "/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2"+ + "\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2"+ + "G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3"+ + "\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2"+ + "\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2"+ + "m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3"+ + "\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2"+ + "\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2"+ + "\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095"+ + "\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2"+ + "\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7"+ + "\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2"+ + "\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9"+ + "\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2"+ + "\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb"+ + "\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2"+ + "\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd"+ + "\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2"+ + "\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00f3"+ + "\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\3\u00fb\3\2\2"+ + "\2\5\u00fd\3\2\2\2\7\u00ff\3\2\2\2\t\u0104\3\2\2\2\13\u010c\3\2\2\2\r"+ + "\u0116\3\2\2\2\17\u0120\3\2\2\2\21\u012c\3\2\2\2\23\u0135\3\2\2\2\25\u013d"+ + "\3\2\2\2\27\u0149\3\2\2\2\31\u0155\3\2\2\2\33\u0160\3\2\2\2\35\u0168\3"+ + "\2\2\2\37\u016a\3\2\2\2!\u016c\3\2\2\2#\u0172\3\2\2\2%\u0178\3\2\2\2\'"+ + "\u017d\3\2\2\2)\u0183\3\2\2\2+\u0188\3\2\2\2-\u018e\3\2\2\2/\u0192\3\2"+ + "\2\2\61\u0198\3\2\2\2\63\u019a\3\2\2\2\65\u019c\3\2\2\2\67\u019f\3\2\2"+ + "\29\u01a2\3\2\2\2;\u01a5\3\2\2\2=\u01a8\3\2\2\2?\u01ac\3\2\2\2A\u01af"+ + "\3\2\2\2C\u01b2\3\2\2\2E\u01b5\3\2\2\2G\u01b8\3\2\2\2I\u01bc\3\2\2\2K"+ + "\u01c0\3\2\2\2M\u01c3\3\2\2\2O\u01c6\3\2\2\2Q\u01c8\3\2\2\2S\u01ca\3\2"+ + "\2\2U\u01cd\3\2\2\2W\u01cf\3\2\2\2Y\u01d1\3\2\2\2[\u01d3\3\2\2\2]\u01d6"+ + "\3\2\2\2_\u01d9\3\2\2\2a\u01db\3\2\2\2c\u01dd\3\2\2\2e\u01e0\3\2\2\2g"+ + "\u01e3\3\2\2\2i\u01e6\3\2\2\2k\u01e9\3\2\2\2m\u01eb\3\2\2\2o\u01ed\3\2"+ + "\2\2q\u01f0\3\2\2\2s\u01f5\3\2\2\2u\u01f9\3\2\2\2w\u01fc\3\2\2\2y\u0200"+ + "\3\2\2\2{\u0204\3\2\2\2}\u0206\3\2\2\2\177\u0208\3\2\2\2\u0081\u020b\3"+ + "\2\2\2\u0083\u020d\3\2\2\2\u0085\u0214\3\2\2\2\u0087\u021a\3\2\2\2\u0089"+ + "\u0223\3\2\2\2\u008b\u0225\3\2\2\2\u008d\u0227\3\2\2\2\u008f\u0229\3\2"+ + "\2\2\u0091\u022b\3\2\2\2\u0093\u022e\3\2\2\2\u0095\u0231\3\2\2\2\u0097"+ + "\u0234\3\2\2\2\u0099\u0237\3\2\2\2\u009b\u023a\3\2\2\2\u009d\u023d\3\2"+ + "\2\2\u009f\u0240\3\2\2\2\u00a1\u0243\3\2\2\2\u00a3\u0248\3\2\2\2\u00a5"+ + "\u024e\3\2\2\2\u00a7\u0253\3\2\2\2\u00a9\u0257\3\2\2\2\u00ab\u025a\3\2"+ + "\2\2\u00ad\u025c\3\2\2\2\u00af\u025e\3\2\2\2\u00b1\u0265\3\2\2\2\u00b3"+ + "\u026e\3\2\2\2\u00b5\u0274\3\2\2\2\u00b7\u0277\3\2\2\2\u00b9\u027c\3\2"+ + "\2\2\u00bb\u0282\3\2\2\2\u00bd\u0288\3\2\2\2\u00bf\u028e\3\2\2\2\u00c1"+ + "\u0293\3\2\2\2\u00c3\u0299\3\2\2\2\u00c5\u029f\3\2\2\2\u00c7\u02a5\3\2"+ + "\2\2\u00c9\u02ac\3\2\2\2\u00cb\u02b2\3\2\2\2\u00cd\u02b9\3\2\2\2\u00cf"+ + "\u02bf\3\2\2\2\u00d1\u02c5\3\2\2\2\u00d3\u02c9\3\2\2\2\u00d5\u02cc\3\2"+ + "\2\2\u00d7\u02d2\3\2\2\2\u00d9\u02d9\3\2\2\2\u00db\u02df\3\2\2\2\u00dd"+ + "\u02ea\3\2\2\2\u00df\u02f3\3\2\2\2\u00e1\u02f8\3\2\2\2\u00e3\u02fc\3\2"+ + "\2\2\u00e5\u030a\3\2\2\2\u00e7\u030c\3\2\2\2\u00e9\u0312\3\2\2\2\u00eb"+ + "\u0318\3\2\2\2\u00ed\u031a\3\2\2\2\u00ef\u0323\3\2\2\2\u00f1\u0333\3\2"+ + "\2\2\u00f3\u0335\3\2\2\2\u00f5\u0340\3\2\2\2\u00f7\u034d\3\2\2\2\u00f9"+ + "\u0355\3\2\2\2\u00fb\u00fc\7\u0080\2\2\u00fc\4\3\2\2\2\u00fd\u00fe\7<"+ + "\2\2\u00fe\6\3\2\2\2\u00ff\u0100\7i\2\2\u0100\u0101\7q\2\2\u0101\u0102"+ + "\7v\2\2\u0102\u0103\7q\2\2\u0103\b\3\2\2\2\u0104\u0105\7\'\2\2\u0105\u0106"+ + "\7q\2\2\u0106\u0107\7w\2\2\u0107\u0108\7v\2\2\u0108\u0109\7r\2\2\u0109"+ + "\u010a\7w\2\2\u010a\u010b\7v\2\2\u010b\n\3\2\2\2\u010c\u010d\7\'\2\2\u010d"+ + "\u010e\7n\2\2\u010e\u010f\7c\2\2\u010f\u0110\7w\2\2\u0110\u0111\7p\2\2"+ + "\u0111\u0112\7e\2\2\u0112\u0113\7j\2\2\u0113\u0114\7g\2\2\u0114\u0115"+ + "\7t\2\2\u0115\f\3\2\2\2\u0116\u0117\7\'\2\2\u0117\u0118\7|\2\2\u0118\u0119"+ + "\7g\2\2\u0119\u011a\7t\2\2\u011a\u011b\7q\2\2\u011b\u011c\7r\2\2\u011c"+ + "\u011d\7c\2\2\u011d\u011e\7i\2\2\u011e\u011f\7g\2\2\u011f\16\3\2\2\2\u0120"+ + "\u0121\7\'\2\2\u0121\u0122\7|\2\2\u0122\u0123\7r\2\2\u0123\u0124\7t\2"+ + "\2\u0124\u0125\7g\2\2\u0125\u0126\7u\2\2\u0126\u0127\7g\2\2\u0127\u0128"+ + "\7t\2\2\u0128\u0129\7x\2\2\u0129\u012a\7g\2\2\u012a\u012b\7f\2\2\u012b"+ + "\20\3\2\2\2\u012c\u012d\7\'\2\2\u012d\u012e\7c\2\2\u012e\u012f\7f\2\2"+ + "\u012f\u0130\7f\2\2\u0130\u0131\7t\2\2\u0131\u0132\7g\2\2\u0132\u0133"+ + "\7u\2\2\u0133\u0134\7u\2\2\u0134\22\3\2\2\2\u0135\u0136\7\'\2\2\u0136"+ + "\u0137\7k\2\2\u0137\u0138\7o\2\2\u0138\u0139\7r\2\2\u0139\u013a\7q\2\2"+ + "\u013a\u013b\7t\2\2\u013b\u013c\7v\2\2\u013c\24\3\2\2\2\u013d\u013e\7"+ + "\'\2\2\u013e\u013f\7d\2\2\u013f\u0140\7t\2\2\u0140\u0141\7g\2\2\u0141"+ + "\u0142\7c\2\2\u0142\u0143\7m\2\2\u0143\u0144\7r\2\2\u0144\u0145\7q\2\2"+ + "\u0145\u0146\7k\2\2\u0146\u0147\7p\2\2\u0147\u0148\7v\2\2\u0148\26\3\2"+ + "\2\2\u0149\u014a\7\'\2\2\u014a\u014b\7c\2\2\u014b\u014c\7u\2\2\u014c\u014d"+ + "\7o\2\2\u014d\u014e\7k\2\2\u014e\u014f\7p\2\2\u014f\u0150\7e\2\2\u0150"+ + "\u0151\7n\2\2\u0151\u0152\7w\2\2\u0152\u0153\7f\2\2\u0153\u0154\7g\2\2"+ + "\u0154\30\3\2\2\2\u0155\u0156\7\'\2\2\u0156\u0157\7c\2\2\u0157\u0158\7"+ + "u\2\2\u0158\u0159\7o\2\2\u0159\u015a\7d\2\2\u015a\u015b\7k\2\2\u015b\u015c"+ + "\7p\2\2\u015c\u015d\7c\2\2\u015d\u015e\7t\2\2\u015e\u015f\7{\2\2\u015f"+ + "\32\3\2\2\2\u0160\u0161\7\'\2\2\u0161\u0162\7q\2\2\u0162\u0163\7r\2\2"+ + "\u0163\u0164\7v\2\2\u0164\u0165\7k\2\2\u0165\u0166\7q\2\2\u0166\u0167"+ + "\7p\2\2\u0167\34\3\2\2\2\u0168\u0169\7.\2\2\u0169\36\3\2\2\2\u016a\u016b"+ + "\7?\2\2\u016b \3\2\2\2\u016c\u016d\7e\2\2\u016d\u016e\7q\2\2\u016e\u016f"+ + "\7p\2\2\u016f\u0170\7u\2\2\u0170\u0171\7v\2\2\u0171\"\3\2\2\2\u0172\u0173"+ + "\7w\2\2\u0173\u0174\7d\2\2\u0174\u0175\7{\2\2\u0175\u0176\7v\2\2\u0176"+ + "\u0177\7g\2\2\u0177$\3\2\2\2\u0178\u0179\7d\2\2\u0179\u017a\7{\2\2\u017a"+ + "\u017b\7v\2\2\u017b\u017c\7g\2\2\u017c&\3\2\2\2\u017d\u017e\7w\2\2\u017e"+ + "\u017f\7y\2\2\u017f\u0180\7q\2\2\u0180\u0181\7t\2\2\u0181\u0182\7f\2\2"+ + "\u0182(\3\2\2\2\u0183\u0184\7y\2\2\u0184\u0185\7q\2\2\u0185\u0186\7t\2"+ + "\2\u0186\u0187\7f\2\2\u0187*\3\2\2\2\u0188\u0189\7h\2\2\u0189\u018a\7"+ + "n\2\2\u018a\u018b\7q\2\2\u018b\u018c\7c\2\2\u018c\u018d\7v\2\2\u018d,"+ + "\3\2\2\2\u018e\u018f\7u\2\2\u018f\u0190\7v\2\2\u0190\u0191\7t\2\2\u0191"+ + ".\3\2\2\2\u0192\u0193\7u\2\2\u0193\u0194\7v\2\2\u0194\u0195\7t\2\2\u0195"+ + "\u0196\7a\2\2\u0196\u0197\7u\2\2\u0197\60\3\2\2\2\u0198\u0199\7]\2\2\u0199"+ + "\62\3\2\2\2\u019a\u019b\7_\2\2\u019b\64\3\2\2\2\u019c\u019d\7-\2\2\u019d"+ + "\u019e\7?\2\2\u019e\66\3\2\2\2\u019f\u01a0\7/\2\2\u01a0\u01a1\7?\2\2\u01a1"+ + "8\3\2\2\2\u01a2\u01a3\7\61\2\2\u01a3\u01a4\7?\2\2\u01a4:\3\2\2\2\u01a5"+ + "\u01a6\7,\2\2\u01a6\u01a7\7?\2\2\u01a7<\3\2\2\2\u01a8\u01a9\7,\2\2\u01a9"+ + "\u01aa\7,\2\2\u01aa\u01ab\7?\2\2\u01ab>\3\2\2\2\u01ac\u01ad\7(\2\2\u01ad"+ + "\u01ae\7?\2\2\u01ae@\3\2\2\2\u01af\u01b0\7~\2\2\u01b0\u01b1\7?\2\2\u01b1"+ + "B\3\2\2\2\u01b2\u01b3\7`\2\2\u01b3\u01b4\7?\2\2\u01b4D\3\2\2\2\u01b5\u01b6"+ + "\7\'\2\2\u01b6\u01b7\7?\2\2\u01b7F\3\2\2\2\u01b8\u01b9\7>\2\2\u01b9\u01ba"+ + "\7>\2\2\u01ba\u01bb\7?\2\2\u01bbH\3\2\2\2\u01bc\u01bd\7@\2\2\u01bd\u01be"+ + "\7@\2\2\u01be\u01bf\7?\2\2\u01bfJ\3\2\2\2\u01c0\u01c1\7-\2\2\u01c1\u01c2"+ + "\7-\2\2\u01c2L\3\2\2\2\u01c3\u01c4\7/\2\2\u01c4\u01c5\7/\2\2\u01c5N\3"+ + "\2\2\2\u01c6\u01c7\7-\2\2\u01c7P\3\2\2\2\u01c8\u01c9\7/\2\2\u01c9R\3\2"+ + "\2\2\u01ca\u01cb\7,\2\2\u01cb\u01cc\7,\2\2\u01ccT\3\2\2\2\u01cd\u01ce"+ + "\7,\2\2\u01ceV\3\2\2\2\u01cf\u01d0\7\61\2\2\u01d0X\3\2\2\2\u01d1\u01d2"+ + "\7\'\2\2\u01d2Z\3\2\2\2\u01d3\u01d4\7>\2\2\u01d4\u01d5\7>\2\2\u01d5\\"+ + "\3\2\2\2\u01d6\u01d7\7@\2\2\u01d7\u01d8\7@\2\2\u01d8^\3\2\2\2\u01d9\u01da"+ + "\7>\2\2\u01da`\3\2\2\2\u01db\u01dc\7@\2\2\u01dcb\3\2\2\2\u01dd\u01de\7"+ + ">\2\2\u01de\u01df\7?\2\2\u01dfd\3\2\2\2\u01e0\u01e1\7@\2\2\u01e1\u01e2"+ + "\7?\2\2\u01e2f\3\2\2\2\u01e3\u01e4\7?\2\2\u01e4\u01e5\7?\2\2\u01e5h\3"+ + "\2\2\2\u01e6\u01e7\7#\2\2\u01e7\u01e8\7?\2\2\u01e8j\3\2\2\2\u01e9\u01ea"+ + "\7`\2\2\u01eal\3\2\2\2\u01eb\u01ec\7~\2\2\u01ecn\3\2\2\2\u01ed\u01ee\7"+ + "v\2\2\u01ee\u01ef\7q\2\2\u01efp\3\2\2\2\u01f0\u01f1\7u\2\2\u01f1\u01f2"+ + "\7v\2\2\u01f2\u01f3\7g\2\2\u01f3\u01f4\7r\2\2\u01f4r\3\2\2\2\u01f5\u01f6"+ + "\7c\2\2\u01f6\u01f7\7p\2\2\u01f7\u01f8\7f\2\2\u01f8t\3\2\2\2\u01f9\u01fa"+ + "\7q\2\2\u01fa\u01fb\7t\2\2\u01fbv\3\2\2\2\u01fc\u01fd\7z\2\2\u01fd\u01fe"+ + "\7q\2\2\u01fe\u01ff\7t\2\2\u01ffx\3\2\2\2\u0200\u0201\7p\2\2\u0201\u0202"+ + "\7q\2\2\u0202\u0203\7v\2\2\u0203z\3\2\2\2\u0204\u0205\7*\2\2\u0205|\3"+ + "\2\2\2\u0206\u0207\7+\2\2\u0207~\3\2\2\2\u0208\u0209\7c\2\2\u0209\u020a"+ + "\7u\2\2\u020a\u0080\3\2\2\2\u020b\u020c\7B\2\2\u020c\u0082\3\2\2\2\u020d"+ + "\u020e\7t\2\2\u020e\u020f\7g\2\2\u020f\u0210\7v\2\2\u0210\u0211\7w\2\2"+ + "\u0211\u0212\7t\2\2\u0212\u0213\7p\2\2\u0213\u0084\3\2\2\2\u0214\u0215"+ + "\7d\2\2\u0215\u0216\7t\2\2\u0216\u0217\7g\2\2\u0217\u0218\7c\2\2\u0218"+ + "\u0219\7m\2\2\u0219\u0086\3\2\2\2\u021a\u021b\7e\2\2\u021b\u021c\7q\2"+ + "\2\u021c\u021d\7p\2\2\u021d\u021e\7v\2\2\u021e\u021f\7k\2\2\u021f\u0220"+ + "\7p\2\2\u0220\u0221\7w\2\2\u0221\u0222\7g\2\2\u0222\u0088\3\2\2\2\u0223"+ + "\u0224\7\60\2\2\u0224\u008a\3\2\2\2\u0225\u0226\7C\2\2\u0226\u008c\3\2"+ + "\2\2\u0227\u0228\7Z\2\2\u0228\u008e\3\2\2\2\u0229\u022a\7[\2\2\u022a\u0090"+ + "\3\2\2\2\u022b\u022c\7C\2\2\u022c\u022d\7Z\2\2\u022d\u0092\3\2\2\2\u022e"+ + "\u022f\7C\2\2\u022f\u0230\7[\2\2\u0230\u0094\3\2\2\2\u0231\u0232\7Z\2"+ + "\2\u0232\u0233\7[\2\2\u0233\u0096\3\2\2\2\u0234\u0235\7R\2\2\u0235\u0236"+ + "\7e\2\2\u0236\u0098\3\2\2\2\u0237\u0238\7R\2\2\u0238\u0239\7|\2\2\u0239"+ + "\u009a\3\2\2\2\u023a\u023b\7R\2\2\u023b\u023c\7p\2\2\u023c\u009c\3\2\2"+ + "\2\u023d\u023e\7R\2\2\u023e\u023f\7x\2\2\u023f\u009e\3\2\2\2\u0240\u0241"+ + "\7\60\2\2\u0241\u0242\7y\2\2\u0242\u00a0\3\2\2\2\u0243\u0244\7v\2\2\u0244"+ + "\u0245\7t\2\2\u0245\u0246\7w\2\2\u0246\u0247\7g\2\2\u0247\u00a2\3\2\2"+ + "\2\u0248\u0249\7h\2\2\u0249\u024a\7c\2\2\u024a\u024b\7n\2\2\u024b\u024c"+ + "\7u\2\2\u024c\u024d\7g\2\2\u024d\u00a4\3\2\2\2\u024e\u024f\7\'\2\2\u024f"+ + "\u0250\7c\2\2\u0250\u0251\7u\2\2\u0251\u0252\7o\2\2\u0252\u00a6\3\2\2"+ + "\2\u0253\u0254\7u\2\2\u0254\u0255\7w\2\2\u0255\u0256\7d\2\2\u0256\u00a8"+ + "\3\2\2\2\u0257\u0258\7/\2\2\u0258\u0259\7@\2\2\u0259\u00aa\3\2\2\2\u025a"+ + "\u025b\7}\2\2\u025b\u00ac\3\2\2\2\u025c\u025d\7\177\2\2\u025d\u00ae\3"+ + "\2\2\2\u025e\u025f\7c\2\2\u025f\u0260\7u\2\2\u0260\u0261\7o\2\2\u0261"+ + "\u0262\7u\2\2\u0262\u0263\7w\2\2\u0263\u0264\7d\2\2\u0264\u00b0\3\2\2"+ + "\2\u0265\u0266\7e\2\2\u0266\u0267\7n\2\2\u0267\u0268\7q\2\2\u0268\u0269"+ + "\7d\2\2\u0269\u026a\7d\2\2\u026a\u026b\7g\2\2\u026b\u026c\7t\2\2\u026c"+ + "\u026d\7u\2\2\u026d\u00b2\3\2\2\2\u026e\u026f\7u\2\2\u026f\u0270\7v\2"+ + "\2\u0270\u0271\7c\2\2\u0271\u0272\7e\2\2\u0272\u0273\7m\2\2\u0273\u00b4"+ + "\3\2\2\2\u0274\u0275\7k\2\2\u0275\u0276\7h\2\2\u0276\u00b6\3\2\2\2\u0277"+ + "\u0278\7g\2\2\u0278\u0279\7n\2\2\u0279\u027a\7u\2\2\u027a\u027b\7g\2\2"+ + "\u027b\u00b8\3\2\2\2\u027c\u027d\7k\2\2\u027d\u027e\7h\2\2\u027e\u027f"+ + "\7a\2\2\u027f\u0280\7e\2\2\u0280\u0281\7u\2\2\u0281\u00ba\3\2\2\2\u0282"+ + "\u0283\7k\2\2\u0283\u0284\7h\2\2\u0284\u0285\7a\2\2\u0285\u0286\7e\2\2"+ + "\u0286\u0287\7e\2\2\u0287\u00bc\3\2\2\2\u0288\u0289\7k\2\2\u0289\u028a"+ + "\7h\2\2\u028a\u028b\7a\2\2\u028b\u028c\7g\2\2\u028c\u028d\7s\2\2\u028d"+ + "\u00be\3\2\2\2\u028e\u028f\7k\2\2\u028f\u0290\7h\2\2\u0290\u0291\7a\2"+ + "\2\u0291\u0292\7|\2\2\u0292\u00c0\3\2\2\2\u0293\u0294\7k\2\2\u0294\u0295"+ + "\7h\2\2\u0295\u0296\7a\2\2\u0296\u0297\7p\2\2\u0297\u0298\7g\2\2\u0298"+ + "\u00c2\3\2\2\2\u0299\u029a\7k\2\2\u029a\u029b\7h\2\2\u029b\u029c\7a\2"+ + "\2\u029c\u029d\7p\2\2\u029d\u029e\7|\2\2\u029e\u00c4\3\2\2\2\u029f\u02a0"+ + "\7k\2\2\u02a0\u02a1\7h\2\2\u02a1\u02a2\7a\2\2\u02a2\u02a3\7r\2\2\u02a3"+ + "\u02a4\7n\2\2\u02a4\u00c6\3\2\2\2\u02a5\u02a6\7k\2\2\u02a6\u02a7\7h\2"+ + "\2\u02a7\u02a8\7a\2\2\u02a8\u02a9\7r\2\2\u02a9\u02aa\7q\2\2\u02aa\u02ab"+ + "\7u\2\2\u02ab\u00c8\3\2\2\2\u02ac\u02ad\7k\2\2\u02ad\u02ae\7h\2\2\u02ae"+ + "\u02af\7a\2\2\u02af\u02b0\7o\2\2\u02b0\u02b1\7k\2\2\u02b1\u00ca\3\2\2"+ + "\2\u02b2\u02b3\7k\2\2\u02b3\u02b4\7h\2\2\u02b4\u02b5\7a\2\2\u02b5\u02b6"+ + "\7p\2\2\u02b6\u02b7\7g\2\2\u02b7\u02b8\7i\2\2\u02b8\u00cc\3\2\2\2\u02b9"+ + "\u02ba\7k\2\2\u02ba\u02bb\7h\2\2\u02bb\u02bc\7a\2\2\u02bc\u02bd\7x\2\2"+ + "\u02bd\u02be\7u\2\2\u02be\u00ce\3\2\2\2\u02bf\u02c0\7k\2\2\u02c0\u02c1"+ + "\7h\2\2\u02c1\u02c2\7a\2\2\u02c2\u02c3\7x\2\2\u02c3\u02c4\7e\2\2\u02c4"+ + "\u00d0\3\2\2\2\u02c5\u02c6\7h\2\2\u02c6\u02c7\7q\2\2\u02c7\u02c8\7t\2"+ + "\2\u02c8\u00d2\3\2\2\2\u02c9\u02ca\7k\2\2\u02ca\u02cb\7p\2\2\u02cb\u00d4"+ + "\3\2\2\2\u02cc\u02cd\7y\2\2\u02cd\u02ce\7j\2\2\u02ce\u02cf\7k\2\2\u02cf"+ + "\u02d0\7n\2\2\u02d0\u02d1\7g\2\2\u02d1\u00d6\3\2\2\2\u02d2\u02d3\7t\2"+ + "\2\u02d3\u02d4\7g\2\2\u02d4\u02d5\7r\2\2\u02d5\u02d6\7g\2\2\u02d6\u02d7"+ + "\7c\2\2\u02d7\u02d8\7v\2\2\u02d8\u00d8\3\2\2\2\u02d9\u02da\7w\2\2\u02da"+ + "\u02db\7p\2\2\u02db\u02dc\7v\2\2\u02dc\u02dd\7k\2\2\u02dd\u02de\7n\2\2"+ + "\u02de\u00da\3\2\2\2\u02df\u02e3\t\2\2\2\u02e0\u02e2\t\3\2\2\u02e1\u02e0"+ + "\3\2\2\2\u02e2\u02e5\3\2\2\2\u02e3\u02e1\3\2\2\2\u02e3\u02e4\3\2\2\2\u02e4"+ + "\u02e6\3\2\2\2\u02e5\u02e3\3\2\2\2\u02e6\u02e7\5\u00ddo\2\u02e7\u02e8"+ + "\3\2\2\2\u02e8\u02e9\bn\2\2\u02e9\u00dc\3\2\2\2\u02ea\u02ee\7=\2\2\u02eb"+ + "\u02ed\n\2\2\2\u02ec\u02eb\3\2\2\2\u02ed\u02f0\3\2\2\2\u02ee\u02ec\3\2"+ + "\2\2\u02ee\u02ef\3\2\2\2\u02ef\u02f1\3\2\2\2\u02f0\u02ee\3\2\2\2\u02f1"+ + "\u02f2\bo\2\2\u02f2\u00de\3\2\2\2\u02f3\u02f4\t\3\2\2\u02f4\u02f5\3\2"+ + "\2\2\u02f5\u02f6\bp\3\2\u02f6\u00e0\3\2\2\2\u02f7\u02f9\t\2\2\2\u02f8"+ + "\u02f7\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02f8\3\2\2\2\u02fa\u02fb\3\2"+ + "\2\2\u02fb\u00e2\3\2\2\2\u02fc\u0300\t\4\2\2\u02fd\u02ff\t\5\2\2\u02fe"+ + "\u02fd\3\2\2\2\u02ff\u0302\3\2\2\2\u0300\u02fe\3\2\2\2\u0300\u0301\3\2"+ + "\2\2\u0301\u00e4\3\2\2\2\u0302\u0300\3\2\2\2\u0303\u030b\4\62;\2\u0304"+ + "\u0306\4\63;\2\u0305\u0307\4\62;\2\u0306\u0305\3\2\2\2\u0307\u0308\3\2"+ + "\2\2\u0308\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u030b\3\2\2\2\u030a"+ + "\u0303\3\2\2\2\u030a\u0304\3\2\2\2\u030b\u00e6\3\2\2\2\u030c\u030e\7&"+ + "\2\2\u030d\u030f\t\6\2\2\u030e\u030d\3\2\2\2\u030f\u0310\3\2\2\2\u0310"+ + "\u030e\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u00e8\3\2\2\2\u0312\u0314\7\'"+ + "\2\2\u0313\u0315\4\62\63\2\u0314\u0313\3\2\2\2\u0315\u0316\3\2\2\2\u0316"+ + "\u0314\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u00ea\3\2\2\2\u0318\u0319\7("+ + "\2\2\u0319\u00ec\3\2\2\2\u031a\u0320\5\u00efx\2\u031b\u031d\t\7\2\2\u031c"+ + "\u031e\t\b\2\2\u031d\u031c\3\2\2\2\u031d\u031e\3\2\2\2\u031e\u031f\3\2"+ + "\2\2\u031f\u0321\5\u00efx\2\u0320\u031b\3\2\2\2\u0320\u0321\3\2\2\2\u0321"+ + "\u00ee\3\2\2\2\u0322\u0324\4\62;\2\u0323\u0322\3\2\2\2\u0324\u0325\3\2"+ + "\2\2\u0325\u0323\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u032d\3\2\2\2\u0327"+ + "\u0329\7\60\2\2\u0328\u032a\4\62;\2\u0329\u0328\3\2\2\2\u032a\u032b\3"+ + "\2\2\2\u032b\u0329\3\2\2\2\u032b\u032c\3\2\2\2\u032c\u032e\3\2\2\2\u032d"+ + "\u0327\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u00f0\3\2\2\2\u032f\u0330\7^"+ + "\2\2\u0330\u0334\13\2\2\2\u0331\u0332\7^\2\2\u0332\u0334\5\u00e1q\2\u0333"+ + "\u032f\3\2\2\2\u0333\u0331\3\2\2\2\u0334\u00f2\3\2\2\2\u0335\u033a\7$"+ + "\2\2\u0336\u0339\5\u00f1y\2\u0337\u0339\n\t\2\2\u0338\u0336\3\2\2\2\u0338"+ + "\u0337\3\2\2\2\u0339\u033c\3\2\2\2\u033a\u0338\3\2\2\2\u033a\u033b\3\2"+ + "\2\2\u033b\u033d\3\2\2\2\u033c\u033a\3\2\2\2\u033d\u033e\7$\2\2\u033e"+ + "\u033f\bz\4\2\u033f\u00f4\3\2\2\2\u0340\u0341\7}\2\2\u0341\u0342\7}\2"+ + "\2\u0342\u0344\3\2\2\2\u0343\u0345\13\2\2\2\u0344\u0343\3\2\2\2\u0345"+ + "\u0346\3\2\2\2\u0346\u0347\3\2\2\2\u0346\u0344\3\2\2\2\u0347\u0348\3\2"+ + "\2\2\u0348\u0349\7\177\2\2\u0349\u034a\7\177\2\2\u034a\u034b\3\2\2\2\u034b"+ + "\u034c\b{\5\2\u034c\u00f6\3\2\2\2\u034d\u0350\7)\2\2\u034e\u0351\5\u00f1"+ + "y\2\u034f\u0351\n\t\2\2\u0350\u034e\3\2\2\2\u0350\u034f\3\2\2\2\u0351"+ + "\u0352\3\2\2\2\u0352\u0353\7)\2\2\u0353\u0354\b|\6\2\u0354\u00f8\3\2\2"+ + "\2\u0355\u0356\7B\2\2\u0356\u0357\7|\2\2\u0357\u0358\7r\2\2\u0358\u00fa"+ + "\3\2\2\2\26\2\u02e3\u02ee\u02fa\u0300\u0308\u030a\u030e\u0310\u0316\u031d"+ + "\u0320\u0325\u032b\u032d\u0333\u0338\u033a\u0346\u0350\7\2\3\2\b\2\2\3"+ + "z\2\3{\3\3|\4"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/parser/src/prog8/parser/prog8Parser.java b/parser/src/prog8/parser/prog8Parser.java index 161242364..3a555762b 100644 --- a/parser/src/prog8/parser/prog8Parser.java +++ b/parser/src/prog8/parser/prog8Parser.java @@ -1,4 +1,4 @@ -// Generated from /home/irmen/Projects/prog8/parser/antlr/prog8.g4 by ANTLR 4.7.2 +// Generated from ./parser/antlr/prog8.g4 by ANTLR 4.7.2 package prog8.parser; @@ -34,9 +34,9 @@ public class prog8Parser extends Parser { T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94, T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101, T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107, - T__107=108, T__108=109, T__109=110, LINECOMMENT=111, COMMENT=112, WS=113, - EOL=114, NAME=115, DEC_INTEGER=116, HEX_INTEGER=117, BIN_INTEGER=118, - FLOAT_NUMBER=119, STRING=120, INLINEASMBLOCK=121, SINGLECHAR=122, ZEROPAGE=123; + T__107=108, LINECOMMENT=109, COMMENT=110, WS=111, EOL=112, NAME=113, DEC_INTEGER=114, + HEX_INTEGER=115, BIN_INTEGER=116, ADDRESS_OF=117, FLOAT_NUMBER=118, STRING=119, + INLINEASMBLOCK=120, SINGLECHAR=121, ZEROPAGE=122; public static final int RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3, RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7, @@ -79,20 +79,19 @@ public class prog8Parser extends Parser { return new String[] { null, "'~'", "':'", "'goto'", "'%output'", "'%launcher'", "'%zeropage'", "'%zpreserved'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", - "'%asmbinary'", "'%option'", "','", "'='", "'const'", "'memory'", "'ubyte'", - "'byte'", "'uword'", "'word'", "'float'", "'str'", "'str_s'", "'['", - "']'", "'+='", "'-='", "'/='", "'*='", "'**='", "'&='", "'|='", "'^='", - "'%='", "'<<='", "'>>='", "'++'", "'--'", "'+'", "'-'", "'**'", "'*'", - "'/'", "'%'", "'<<'", "'>>'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", - "'&'", "'^'", "'|'", "'to'", "'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'", "'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, null, null, null, null, null, - null, null, null, null, "'@zp'" + "'%asmbinary'", "'%option'", "','", "'='", "'const'", "'ubyte'", "'byte'", + "'uword'", "'word'", "'float'", "'str'", "'str_s'", "'['", "']'", "'+='", + "'-='", "'/='", "'*='", "'**='", "'&='", "'|='", "'^='", "'%='", "'<<='", + "'>>='", "'++'", "'--'", "'+'", "'-'", "'**'", "'*'", "'/'", "'%'", "'<<'", + "'>>'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'^'", "'|'", "'to'", + "'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'", + "'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, + null, null, null, null, null, "'&'", null, null, null, null, "'@zp'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -107,8 +106,8 @@ public class prog8Parser extends Parser { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", - "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", + null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", + "BIN_INTEGER", "ADDRESS_OF", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", "SINGLECHAR", "ZEROPAGE" }; } @@ -330,7 +329,7 @@ public class prog8Parser extends Parser { setState(142); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 116)) & ~0x3f) == 0 && ((1L << (_la - 116)) & ((1L << (DEC_INTEGER - 116)) | (1L << (HEX_INTEGER - 116)) | (1L << (BIN_INTEGER - 116)))) != 0)) { + if (((((_la - 114)) & ~0x3f) == 0 && ((1L << (_la - 114)) & ((1L << (DEC_INTEGER - 114)) | (1L << (HEX_INTEGER - 114)) | (1L << (BIN_INTEGER - 114)))) != 0)) { { setState(141); integerliteral(); @@ -873,7 +872,7 @@ public class prog8Parser extends Parser { setState(203); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__24) { + if (_la==T__23) { { setState(202); arrayspec(); @@ -967,6 +966,7 @@ public class prog8Parser extends Parser { } public static class MemoryvardeclContext extends ParserRuleContext { + public TerminalNode ADDRESS_OF() { return getToken(prog8Parser.ADDRESS_OF, 0); } public VarinitializerContext varinitializer() { return getRuleContext(VarinitializerContext.class,0); } @@ -983,7 +983,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(214); - match(T__16); + match(ADDRESS_OF); setState(215); varinitializer(); } @@ -1015,7 +1015,7 @@ public class prog8Parser extends Parser { { setState(217); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0)) ) { + 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); } else { @@ -1053,11 +1053,11 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(219); - match(T__24); + match(T__23); setState(220); expression(0); setState(221); - match(T__25); + match(T__24); } } catch (RecognitionException re) { @@ -1186,7 +1186,7 @@ public class prog8Parser extends Parser { setState(236); ((AugassignmentContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((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) | (1L << T__36))) != 0)) ) { + 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)) ) { ((AugassignmentContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -1299,7 +1299,7 @@ public class prog8Parser extends Parser { setState(246); ((PostincrdecrContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__37 || _la==T__38) ) { + if ( !(_la==T__36 || _la==T__37) ) { ((PostincrdecrContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -1359,6 +1359,7 @@ public class prog8Parser extends Parser { public TerminalNode EOL(int i) { return getToken(prog8Parser.EOL, i); } + public TerminalNode ADDRESS_OF() { return getToken(prog8Parser.ADDRESS_OF, 0); } public TypecastContext typecast() { return getRuleContext(TypecastContext.class,0); } @@ -1398,7 +1399,7 @@ public class prog8Parser extends Parser { setState(250); ((ExpressionContext)_localctx).prefix = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__39) | (1L << T__40))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__38) | (1L << T__39))) != 0)) ) { ((ExpressionContext)_localctx).prefix = (Token)_errHandler.recoverInline(this); } else { @@ -1413,7 +1414,7 @@ public class prog8Parser extends Parser { case 3: { setState(252); - ((ExpressionContext)_localctx).prefix = match(T__61); + ((ExpressionContext)_localctx).prefix = match(T__59); setState(253); expression(9); } @@ -1457,11 +1458,11 @@ public class prog8Parser extends Parser { case 10: { setState(260); - match(T__62); + match(T__60); setState(261); expression(0); setState(262); - match(T__63); + match(T__61); } break; } @@ -1496,7 +1497,7 @@ public class prog8Parser extends Parser { } setState(270); - ((ExpressionContext)_localctx).bop = match(T__41); + ((ExpressionContext)_localctx).bop = match(T__40); setState(272); _errHandler.sync(this); _la = _input.LA(1); @@ -1532,7 +1533,7 @@ public class prog8Parser extends Parser { setState(279); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__42) | (1L << T__43) | (1L << T__44))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__41) | (1L << T__42) | (1L << T__43))) != 0)) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1575,7 +1576,7 @@ public class prog8Parser extends Parser { setState(288); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__39 || _la==T__40) ) { + if ( !(_la==T__38 || _la==T__39) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1618,7 +1619,7 @@ public class prog8Parser extends Parser { setState(297); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__45 || _la==T__46) ) { + if ( !(_la==T__44 || _la==T__45) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1661,7 +1662,7 @@ public class prog8Parser extends Parser { setState(306); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49))) != 0)) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1704,7 +1705,7 @@ public class prog8Parser extends Parser { setState(315); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__51 || _la==T__52) ) { + if ( !(_la==T__50 || _la==T__51) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1745,7 +1746,7 @@ public class prog8Parser extends Parser { } setState(324); - ((ExpressionContext)_localctx).bop = match(T__53); + ((ExpressionContext)_localctx).bop = match(ADDRESS_OF); setState(326); _errHandler.sync(this); _la = _input.LA(1); @@ -1779,7 +1780,7 @@ public class prog8Parser extends Parser { } setState(333); - ((ExpressionContext)_localctx).bop = match(T__54); + ((ExpressionContext)_localctx).bop = match(T__52); setState(335); _errHandler.sync(this); _la = _input.LA(1); @@ -1813,7 +1814,7 @@ public class prog8Parser extends Parser { } setState(342); - ((ExpressionContext)_localctx).bop = match(T__55); + ((ExpressionContext)_localctx).bop = match(T__53); setState(344); _errHandler.sync(this); _la = _input.LA(1); @@ -1847,7 +1848,7 @@ public class prog8Parser extends Parser { } setState(351); - ((ExpressionContext)_localctx).bop = match(T__58); + ((ExpressionContext)_localctx).bop = match(T__56); setState(353); _errHandler.sync(this); _la = _input.LA(1); @@ -1881,7 +1882,7 @@ public class prog8Parser extends Parser { } setState(360); - ((ExpressionContext)_localctx).bop = match(T__59); + ((ExpressionContext)_localctx).bop = match(T__57); setState(362); _errHandler.sync(this); _la = _input.LA(1); @@ -1915,7 +1916,7 @@ public class prog8Parser extends Parser { } setState(369); - ((ExpressionContext)_localctx).bop = match(T__60); + ((ExpressionContext)_localctx).bop = match(T__58); setState(371); _errHandler.sync(this); _la = _input.LA(1); @@ -1939,7 +1940,7 @@ public class prog8Parser extends Parser { setState(374); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); setState(375); - match(T__56); + match(T__54); setState(376); ((ExpressionContext)_localctx).rangeto = expression(0); setState(379); @@ -1948,7 +1949,7 @@ public class prog8Parser extends Parser { case 1: { setState(377); - match(T__57); + match(T__55); setState(378); ((ExpressionContext)_localctx).rangestep = expression(0); } @@ -2003,7 +2004,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(388); - match(T__64); + match(T__62); setState(389); datatype(); } @@ -2072,13 +2073,13 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(394); - match(T__65); + match(T__63); setState(395); - match(T__62); + match(T__60); setState(396); expression(0); setState(397); - match(T__63); + match(T__61); } } catch (RecognitionException re) { @@ -2093,6 +2094,7 @@ public class prog8Parser extends Parser { } public static class AddressofContext extends ParserRuleContext { + public TerminalNode ADDRESS_OF() { return getToken(prog8Parser.ADDRESS_OF, 0); } public Scoped_identifierContext scoped_identifier() { return getRuleContext(Scoped_identifierContext.class,0); } @@ -2109,7 +2111,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(399); - match(T__53); + match(ADDRESS_OF); setState(400); scoped_identifier(); } @@ -2148,11 +2150,11 @@ public class prog8Parser extends Parser { setState(402); scoped_identifier(); setState(403); - match(T__62); + match(T__60); setState(405); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__24) | (1L << T__39) | (1L << T__40) | (1L << T__53) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__70 - 66)) | (1L << (T__71 - 66)) | (1L << (T__72 - 66)) | (1L << (T__81 - 66)) | (1L << (T__82 - 66)) | (1L << (NAME - 66)) | (1L << (DEC_INTEGER - 66)) | (1L << (HEX_INTEGER - 66)) | (1L << (BIN_INTEGER - 66)) | (1L << (FLOAT_NUMBER - 66)) | (1L << (STRING - 66)) | (1L << (SINGLECHAR - 66)))) != 0)) { + 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(404); expression_list(); @@ -2160,7 +2162,7 @@ public class prog8Parser extends Parser { } setState(407); - match(T__63); + match(T__61); } } catch (RecognitionException re) { @@ -2197,11 +2199,11 @@ public class prog8Parser extends Parser { setState(409); scoped_identifier(); setState(410); - match(T__62); + match(T__60); setState(412); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__24) | (1L << T__39) | (1L << T__40) | (1L << T__53) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__70 - 66)) | (1L << (T__71 - 66)) | (1L << (T__72 - 66)) | (1L << (T__81 - 66)) | (1L << (T__82 - 66)) | (1L << (NAME - 66)) | (1L << (DEC_INTEGER - 66)) | (1L << (HEX_INTEGER - 66)) | (1L << (BIN_INTEGER - 66)) | (1L << (FLOAT_NUMBER - 66)) | (1L << (STRING - 66)) | (1L << (SINGLECHAR - 66)))) != 0)) { + 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(411); expression_list(); @@ -2209,7 +2211,7 @@ public class prog8Parser extends Parser { } setState(414); - match(T__63); + match(T__61); } } catch (RecognitionException re) { @@ -2305,7 +2307,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(427); - match(T__66); + match(T__64); setState(429); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { @@ -2343,7 +2345,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(431); - match(T__67); + match(T__65); } } catch (RecognitionException re) { @@ -2371,7 +2373,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(433); - match(T__68); + match(T__66); } } catch (RecognitionException re) { @@ -2442,7 +2444,7 @@ public class prog8Parser extends Parser { { { setState(438); - match(T__69); + match(T__67); setState(439); match(NAME); } @@ -2481,7 +2483,7 @@ public class prog8Parser extends Parser { { setState(445); _la = _input.LA(1); - if ( !(((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (T__70 - 71)) | (1L << (T__71 - 71)) | (1L << (T__72 - 71)))) != 0)) ) { + if ( !(((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (T__68 - 69)) | (1L << (T__69 - 69)) | (1L << (T__70 - 69)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -2518,7 +2520,7 @@ public class prog8Parser extends Parser { { setState(447); _la = _input.LA(1); - if ( !(((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (T__70 - 71)) | (1L << (T__71 - 71)) | (1L << (T__72 - 71)) | (1L << (T__73 - 71)) | (1L << (T__74 - 71)) | (1L << (T__75 - 71)))) != 0)) ) { + 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); } else { @@ -2555,7 +2557,7 @@ public class prog8Parser extends Parser { { setState(449); _la = _input.LA(1); - if ( !(((((_la - 77)) & ~0x3f) == 0 && ((1L << (_la - 77)) & ((1L << (T__76 - 77)) | (1L << (T__77 - 77)) | (1L << (T__78 - 77)) | (1L << (T__79 - 77)))) != 0)) ) { + 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); } else { @@ -2600,7 +2602,7 @@ public class prog8Parser extends Parser { setState(451); ((IntegerliteralContext)_localctx).intpart = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 116)) & ~0x3f) == 0 && ((1L << (_la - 116)) & ((1L << (DEC_INTEGER - 116)) | (1L << (HEX_INTEGER - 116)) | (1L << (BIN_INTEGER - 116)))) != 0)) ) { + if ( !(((((_la - 114)) & ~0x3f) == 0 && ((1L << (_la - 114)) & ((1L << (DEC_INTEGER - 114)) | (1L << (HEX_INTEGER - 114)) | (1L << (BIN_INTEGER - 114)))) != 0)) ) { ((IntegerliteralContext)_localctx).intpart = (Token)_errHandler.recoverInline(this); } else { @@ -2645,7 +2647,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(455); - match(T__80); + match(T__78); } } catch (RecognitionException re) { @@ -2675,7 +2677,7 @@ public class prog8Parser extends Parser { { setState(457); _la = _input.LA(1); - if ( !(_la==T__81 || _la==T__82) ) { + if ( !(_la==T__79 || _la==T__80) ) { _errHandler.recoverInline(this); } else { @@ -2721,7 +2723,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(459); - match(T__24); + match(T__23); setState(461); _errHandler.sync(this); _la = _input.LA(1); @@ -2771,7 +2773,7 @@ public class prog8Parser extends Parser { } setState(477); - match(T__25); + match(T__24); } } catch (RecognitionException re) { @@ -2913,15 +2915,15 @@ public class prog8Parser extends Parser { integerliteral(); } break; - case T__81: - case T__82: + case T__79: + case T__80: enterOuterAlt(_localctx, 2); { setState(486); booleanliteral(); } break; - case T__24: + case T__23: enterOuterAlt(_localctx, 3); { setState(487); @@ -2979,7 +2981,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(493); - match(T__83); + match(T__81); setState(494); match(INLINEASMBLOCK); } @@ -3023,15 +3025,15 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(496); - match(T__84); + match(T__82); setState(497); identifier(); setState(498); - match(T__62); + match(T__60); setState(500); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0)) { + 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(499); sub_params(); @@ -3039,11 +3041,11 @@ public class prog8Parser extends Parser { } setState(502); - match(T__63); + match(T__61); setState(504); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__85) { + if (_la==T__83) { { setState(503); sub_return_part(); @@ -3086,7 +3088,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(509); - match(T__85); + match(T__83); setState(510); sub_returns(); } @@ -3127,13 +3129,13 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(512); - match(T__86); + match(T__84); setState(513); match(EOL); setState(518); _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) | (1L << T__23))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__67 - 66)) | (1L << (T__68 - 66)) | (1L << (T__70 - 66)) | (1L << (T__71 - 66)) | (1L << (T__72 - 66)) | (1L << (T__83 - 66)) | (1L << (T__84 - 66)) | (1L << (T__88 - 66)) | (1L << (T__91 - 66)) | (1L << (T__93 - 66)) | (1L << (T__94 - 66)) | (1L << (T__95 - 66)) | (1L << (T__96 - 66)) | (1L << (T__97 - 66)) | (1L << (T__98 - 66)) | (1L << (T__99 - 66)) | (1L << (T__100 - 66)) | (1L << (T__101 - 66)) | (1L << (T__102 - 66)) | (1L << (T__103 - 66)) | (1L << (T__104 - 66)) | (1L << (T__105 - 66)) | (1L << (T__107 - 66)) | (1L << (T__108 - 66)) | (1L << (EOL - 66)) | (1L << (NAME - 66)))) != 0)) { + 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(516); _errHandler.sync(this); @@ -3157,18 +3159,19 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__23: + case T__63: + case T__64: case T__65: case T__66: - case T__67: case T__68: + case T__69: case T__70: - case T__71: - case T__72: - case T__83: - case T__84: - case T__88: + case T__81: + case T__82: + case T__86: + case T__89: case T__91: + case T__92: case T__93: case T__94: case T__95: @@ -3180,11 +3183,10 @@ public class prog8Parser extends Parser { case T__101: case T__102: case T__103: - case T__104: case T__105: - case T__107: - case T__108: + case T__106: case NAME: + case ADDRESS_OF: { setState(514); statement(); @@ -3205,7 +3207,7 @@ public class prog8Parser extends Parser { _la = _input.LA(1); } setState(521); - match(T__87); + match(T__85); } } catch (RecognitionException re) { @@ -3382,15 +3384,15 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(545); - match(T__88); + match(T__86); setState(546); identifier(); setState(547); - match(T__62); + match(T__60); setState(549); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0)) { + 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(548); asmsub_params(); @@ -3398,17 +3400,17 @@ public class prog8Parser extends Parser { } setState(551); - match(T__63); + match(T__61); setState(552); - match(T__85); + match(T__83); setState(553); - match(T__89); + match(T__87); setState(554); - match(T__62); + match(T__60); setState(556); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (T__70 - 71)) | (1L << (T__71 - 71)) | (1L << (T__72 - 71)))) != 0)) { + if (((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (T__68 - 69)) | (1L << (T__69 - 69)) | (1L << (T__70 - 69)))) != 0)) { { setState(555); clobber(); @@ -3416,15 +3418,15 @@ public class prog8Parser extends Parser { } setState(558); - match(T__63); + match(T__61); setState(559); - match(T__85); + match(T__83); setState(560); - match(T__62); + match(T__60); setState(562); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0)) { + 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(561); asmsub_returns(); @@ -3432,7 +3434,7 @@ public class prog8Parser extends Parser { } setState(564); - match(T__63); + match(T__61); setState(567); _errHandler.sync(this); switch (_input.LA(1)) { @@ -3442,7 +3444,7 @@ public class prog8Parser extends Parser { asmsub_address(); } break; - case T__86: + case T__84: { setState(566); statement_block(); @@ -3589,34 +3591,34 @@ public class prog8Parser extends Parser { setState(583); vardecl(); setState(584); - match(T__65); + match(T__63); setState(588); _errHandler.sync(this); switch (_input.LA(1)) { + case T__68: + case T__69: case T__70: case T__71: case T__72: case T__73: - case T__74: - case T__75: { setState(585); registerorpair(); } break; + case T__74: + case T__75: case T__76: case T__77: - case T__78: - case T__79: { setState(586); statusregister(); } break; - case T__90: + case T__88: { setState(587); - ((Asmsub_paramContext)_localctx).stack = match(T__90); + ((Asmsub_paramContext)_localctx).stack = match(T__88); } break; default: @@ -3777,34 +3779,34 @@ public class prog8Parser extends Parser { setState(609); datatype(); setState(610); - match(T__65); + match(T__63); setState(614); _errHandler.sync(this); switch (_input.LA(1)) { + case T__68: + case T__69: case T__70: case T__71: case T__72: case T__73: - case T__74: - case T__75: { setState(611); registerorpair(); } break; + case T__74: + case T__75: case T__76: case T__77: - case T__78: - case T__79: { setState(612); statusregister(); } break; - case T__90: + case T__88: { setState(613); - ((Asmsub_returnContext)_localctx).stack = match(T__90); + ((Asmsub_returnContext)_localctx).stack = match(T__88); } break; default: @@ -3854,7 +3856,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(616); - match(T__91); + match(T__89); setState(617); expression(0); setState(619); @@ -3889,18 +3891,19 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__23: + case T__63: + case T__64: case T__65: case T__66: - case T__67: case T__68: + case T__69: case T__70: - case T__71: - case T__72: - case T__83: - case T__84: - case T__88: + case T__81: + case T__82: + case T__86: + case T__89: case T__91: + case T__92: case T__93: case T__94: case T__95: @@ -3912,17 +3915,16 @@ public class prog8Parser extends Parser { case T__101: case T__102: case T__103: - case T__104: case T__105: - case T__107: - case T__108: + case T__106: case NAME: + case ADDRESS_OF: { setState(621); statement(); } break; - case T__86: + case T__84: { setState(622); statement_block(); @@ -3986,7 +3988,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(631); - match(T__92); + match(T__90); setState(633); _errHandler.sync(this); _la = _input.LA(1); @@ -4019,18 +4021,19 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__23: + case T__63: + case T__64: case T__65: case T__66: - case T__67: case T__68: + case T__69: case T__70: - case T__71: - case T__72: - case T__83: - case T__84: - case T__88: + case T__81: + case T__82: + case T__86: + case T__89: case T__91: + case T__92: case T__93: case T__94: case T__95: @@ -4042,17 +4045,16 @@ public class prog8Parser extends Parser { case T__101: case T__102: case T__103: - case T__104: case T__105: - case T__107: - case T__108: + case T__106: case NAME: + case ADDRESS_OF: { setState(635); statement(); } break; - case T__86: + case T__84: { setState(636); statement_block(); @@ -4138,18 +4140,19 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__23: + case T__63: + case T__64: case T__65: case T__66: - case T__67: case T__68: + case T__69: case T__70: - case T__71: - case T__72: - case T__83: - case T__84: - case T__88: + case T__81: + case T__82: + case T__86: + case T__89: case T__91: + case T__92: case T__93: case T__94: case T__95: @@ -4161,17 +4164,16 @@ public class prog8Parser extends Parser { case T__101: case T__102: case T__103: - case T__104: case T__105: - case T__107: - case T__108: + case T__106: case NAME: + case ADDRESS_OF: { setState(643); statement(); } break; - case T__86: + case T__84: { setState(644); statement_block(); @@ -4193,7 +4195,7 @@ public class prog8Parser extends Parser { setState(651); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__92) { + if (_la==T__90) { { setState(650); else_part(); @@ -4231,7 +4233,7 @@ public class prog8Parser extends Parser { { setState(655); _la = _input.LA(1); - if ( !(((((_la - 94)) & ~0x3f) == 0 && ((1L << (_la - 94)) & ((1L << (T__93 - 94)) | (1L << (T__94 - 94)) | (1L << (T__95 - 94)) | (1L << (T__96 - 94)) | (1L << (T__97 - 94)) | (1L << (T__98 - 94)) | (1L << (T__99 - 94)) | (1L << (T__100 - 94)) | (1L << (T__101 - 94)) | (1L << (T__102 - 94)) | (1L << (T__103 - 94)) | (1L << (T__104 - 94)))) != 0)) ) { + 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); } else { @@ -4287,11 +4289,11 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(657); - match(T__105); + match(T__103); setState(659); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0)) { + 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(658); datatype(); @@ -4311,9 +4313,9 @@ public class prog8Parser extends Parser { setState(666); _errHandler.sync(this); switch (_input.LA(1)) { + case T__68: + case T__69: case T__70: - case T__71: - case T__72: { setState(664); register(); @@ -4329,7 +4331,7 @@ public class prog8Parser extends Parser { throw new NoViableAltException(this); } setState(668); - match(T__106); + match(T__104); setState(669); expression(0); setState(671); @@ -4364,18 +4366,19 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__23: + case T__63: + case T__64: case T__65: case T__66: - case T__67: case T__68: + case T__69: case T__70: - case T__71: - case T__72: - case T__83: - case T__84: - case T__88: + case T__81: + case T__82: + case T__86: + case T__89: case T__91: + case T__92: case T__93: case T__94: case T__95: @@ -4387,17 +4390,16 @@ public class prog8Parser extends Parser { case T__101: case T__102: case T__103: - case T__104: case T__105: - case T__107: - case T__108: + case T__106: case NAME: + case ADDRESS_OF: { setState(673); statement(); } break; - case T__86: + case T__84: { setState(674); statement_block(); @@ -4444,7 +4446,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(677); - match(T__107); + match(T__105); setState(678); expression(0); setState(680); @@ -4479,18 +4481,19 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__23: + case T__63: + case T__64: case T__65: case T__66: - case T__67: case T__68: + case T__69: case T__70: - case T__71: - case T__72: - case T__83: - case T__84: - case T__88: + case T__81: + case T__82: + case T__86: + case T__89: case T__91: + case T__92: case T__93: case T__94: case T__95: @@ -4502,17 +4505,16 @@ public class prog8Parser extends Parser { case T__101: case T__102: case T__103: - case T__104: case T__105: - case T__107: - case T__108: + case T__106: case NAME: + case ADDRESS_OF: { setState(682); statement(); } break; - case T__86: + case T__84: { setState(683); statement_block(); @@ -4559,7 +4561,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(686); - match(T__108); + match(T__106); setState(689); _errHandler.sync(this); switch (_input.LA(1)) { @@ -4582,18 +4584,19 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__23: + case T__63: + case T__64: case T__65: case T__66: - case T__67: case T__68: + case T__69: case T__70: - case T__71: - case T__72: - case T__83: - case T__84: - case T__88: + case T__81: + case T__82: + case T__86: + case T__89: case T__91: + case T__92: case T__93: case T__94: case T__95: @@ -4605,17 +4608,16 @@ public class prog8Parser extends Parser { case T__101: case T__102: case T__103: - case T__104: case T__105: - case T__107: - case T__108: + case T__106: case NAME: + case ADDRESS_OF: { setState(687); statement(); } break; - case T__86: + case T__84: { setState(688); statement_block(); @@ -4635,7 +4637,7 @@ public class prog8Parser extends Parser { } setState(694); - match(T__109); + match(T__107); setState(695); expression(0); } @@ -4693,7 +4695,7 @@ public class prog8Parser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3}\u02bc\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3|\u02bc\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"+ @@ -4746,9 +4748,9 @@ public class prog8Parser extends Parser { ">\3>\3>\5>\u029d\n>\3>\3>\3>\5>\u02a2\n>\3>\3>\5>\u02a6\n>\3?\3?\3?\5"+ "?\u02ab\n?\3?\3?\5?\u02af\n?\3@\3@\3@\5@\u02b4\n@\3@\5@\u02b7\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\24\32\3\2\35"+ - "\'\3\2()\4\2\3\3*+\3\2-/\3\2*+\3\2\60\61\3\2\62\65\3\2\66\67\3\2IK\3\2"+ - "IN\3\2OR\3\2vx\3\2TU\3\2`k\2\u0309\2\u0084\3\2\2\2\4\u008b\3\2\2\2\6\u008d"+ + "\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\2G"+ + "L\3\2MP\3\2tv\3\2RS\3\2^i\2\u0309\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\u00d1\3\2\2\2\26\u00d5\3\2\2"+ "\2\30\u00d8\3\2\2\2\32\u00db\3\2\2\2\34\u00dd\3\2\2\2\36\u00e1\3\2\2\2"+ @@ -4762,13 +4764,13 @@ public class prog8Parser extends Parser { "`\u020d\3\2\2\2b\u0218\3\2\2\2d\u0223\3\2\2\2f\u023b\3\2\2\2h\u023e\3"+ "\2\2\2j\u0249\3\2\2\2l\u0250\3\2\2\2n\u0258\3\2\2\2p\u0263\3\2\2\2r\u026a"+ "\3\2\2\2t\u0279\3\2\2\2v\u0281\3\2\2\2x\u0291\3\2\2\2z\u0293\3\2\2\2|"+ - "\u02a7\3\2\2\2~\u02b0\3\2\2\2\u0080\u0083\5\4\3\2\u0081\u0083\7t\2\2\u0082"+ + "\u02a7\3\2\2\2~\u02b0\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\7t"+ + "\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"+ @@ -4791,14 +4793,14 @@ public class prog8Parser extends Parser { "\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"+ + "\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\u00cd\3\2\2\2\u00cc\u00ce\5\34\17\2\u00cd\u00cc\3"+ "\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf\u00d0\5> \2\u00d0"+ "\23\3\2\2\2\u00d1\u00d2\5\22\n\2\u00d2\u00d3\7\21\2\2\u00d3\u00d4\5(\25"+ "\2\u00d4\25\3\2\2\2\u00d5\u00d6\7\22\2\2\u00d6\u00d7\5\24\13\2\u00d7\27"+ - "\3\2\2\2\u00d8\u00d9\7\23\2\2\u00d9\u00da\5\24\13\2\u00da\31\3\2\2\2\u00db"+ - "\u00dc\t\3\2\2\u00dc\33\3\2\2\2\u00dd\u00de\7\33\2\2\u00de\u00df\5(\25"+ - "\2\u00df\u00e0\7\34\2\2\u00e0\35\3\2\2\2\u00e1\u00e2\5 \21\2\u00e2\u00e3"+ + "\3\2\2\2\u00d8\u00d9\7w\2\2\u00d9\u00da\5\24\13\2\u00da\31\3\2\2\2\u00db"+ + "\u00dc\t\3\2\2\u00dc\33\3\2\2\2\u00dd\u00de\7\32\2\2\u00de\u00df\5(\25"+ + "\2\u00df\u00e0\7\33\2\2\u00e0\35\3\2\2\2\u00e1\u00e2\5 \21\2\u00e2\u00e3"+ "\7\21\2\2\u00e3\u00e4\5(\25\2\u00e4\37\3\2\2\2\u00e5\u00ea\5$\23\2\u00e6"+ "\u00e7\7\20\2\2\u00e7\u00e9\5$\23\2\u00e8\u00e6\3\2\2\2\u00e9\u00ec\3"+ "\2\2\2\u00ea\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb!\3\2\2\2\u00ec\u00ea"+ @@ -4807,157 +4809,157 @@ public class prog8Parser extends Parser { "\u00f6\5.\30\2\u00f5\u00f1\3\2\2\2\u00f5\u00f2\3\2\2\2\u00f5\u00f3\3\2"+ "\2\2\u00f5\u00f4\3\2\2\2\u00f6%\3\2\2\2\u00f7\u00f8\5$\23\2\u00f8\u00f9"+ "\t\5\2\2\u00f9\'\3\2\2\2\u00fa\u00fb\b\25\1\2\u00fb\u010b\5\62\32\2\u00fc"+ - "\u00fd\t\6\2\2\u00fd\u010b\5(\25\31\u00fe\u00ff\7@\2\2\u00ff\u010b\5("+ + "\u00fd\t\6\2\2\u00fd\u010b\5(\25\31\u00fe\u00ff\7>\2\2\u00ff\u010b\5("+ "\25\13\u0100\u010b\5V,\2\u0101\u010b\5B\"\2\u0102\u010b\5@!\2\u0103\u010b"+ - "\5,\27\2\u0104\u010b\5.\30\2\u0105\u010b\5\60\31\2\u0106\u0107\7A\2\2"+ - "\u0107\u0108\5(\25\2\u0108\u0109\7B\2\2\u0109\u010b\3\2\2\2\u010a\u00fa"+ + "\5,\27\2\u0104\u010b\5.\30\2\u0105\u010b\5\60\31\2\u0106\u0107\7?\2\2"+ + "\u0107\u0108\5(\25\2\u0108\u0109\7@\2\2\u0109\u010b\3\2\2\2\u010a\u00fa"+ "\3\2\2\2\u010a\u00fc\3\2\2\2\u010a\u00fe\3\2\2\2\u010a\u0100\3\2\2\2\u010a"+ "\u0101\3\2\2\2\u010a\u0102\3\2\2\2\u010a\u0103\3\2\2\2\u010a\u0104\3\2"+ "\2\2\u010a\u0105\3\2\2\2\u010a\u0106\3\2\2\2\u010b\u0183\3\2\2\2\u010c"+ - "\u010e\f\30\2\2\u010d\u010f\7t\2\2\u010e\u010d\3\2\2\2\u010e\u010f\3\2"+ - "\2\2\u010f\u0110\3\2\2\2\u0110\u0112\7,\2\2\u0111\u0113\7t\2\2\u0112\u0111"+ + "\u010e\f\30\2\2\u010d\u010f\7r\2\2\u010e\u010d\3\2\2\2\u010e\u010f\3\2"+ + "\2\2\u010f\u0110\3\2\2\2\u0110\u0112\7+\2\2\u0111\u0113\7r\2\2\u0112\u0111"+ "\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0114\3\2\2\2\u0114\u0182\5(\25\31"+ - "\u0115\u0117\f\27\2\2\u0116\u0118\7t\2\2\u0117\u0116\3\2\2\2\u0117\u0118"+ - "\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011b\t\7\2\2\u011a\u011c\7t\2\2\u011b"+ + "\u0115\u0117\f\27\2\2\u0116\u0118\7r\2\2\u0117\u0116\3\2\2\2\u0117\u0118"+ + "\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011b\t\7\2\2\u011a\u011c\7r\2\2\u011b"+ "\u011a\3\2\2\2\u011b\u011c\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u0182\5("+ - "\25\30\u011e\u0120\f\26\2\2\u011f\u0121\7t\2\2\u0120\u011f\3\2\2\2\u0120"+ - "\u0121\3\2\2\2\u0121\u0122\3\2\2\2\u0122\u0124\t\b\2\2\u0123\u0125\7t"+ + "\25\30\u011e\u0120\f\26\2\2\u011f\u0121\7r\2\2\u0120\u011f\3\2\2\2\u0120"+ + "\u0121\3\2\2\2\u0121\u0122\3\2\2\2\u0122\u0124\t\b\2\2\u0123\u0125\7r"+ "\2\2\u0124\u0123\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0126\3\2\2\2\u0126"+ - "\u0182\5(\25\27\u0127\u0129\f\25\2\2\u0128\u012a\7t\2\2\u0129\u0128\3"+ + "\u0182\5(\25\27\u0127\u0129\f\25\2\2\u0128\u012a\7r\2\2\u0129\u0128\3"+ "\2\2\2\u0129\u012a\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u012d\t\t\2\2\u012c"+ - "\u012e\7t\2\2\u012d\u012c\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012f\3\2"+ - "\2\2\u012f\u0182\5(\25\26\u0130\u0132\f\24\2\2\u0131\u0133\7t\2\2\u0132"+ + "\u012e\7r\2\2\u012d\u012c\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012f\3\2"+ + "\2\2\u012f\u0182\5(\25\26\u0130\u0132\f\24\2\2\u0131\u0133\7r\2\2\u0132"+ "\u0131\3\2\2\2\u0132\u0133\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136\t\n"+ - "\2\2\u0135\u0137\7t\2\2\u0136\u0135\3\2\2\2\u0136\u0137\3\2\2\2\u0137"+ + "\2\2\u0135\u0137\7r\2\2\u0136\u0135\3\2\2\2\u0136\u0137\3\2\2\2\u0137"+ "\u0138\3\2\2\2\u0138\u0182\5(\25\25\u0139\u013b\f\23\2\2\u013a\u013c\7"+ - "t\2\2\u013b\u013a\3\2\2\2\u013b\u013c\3\2\2\2\u013c\u013d\3\2\2\2\u013d"+ - "\u013f\t\13\2\2\u013e\u0140\7t\2\2\u013f\u013e\3\2\2\2\u013f\u0140\3\2"+ + "r\2\2\u013b\u013a\3\2\2\2\u013b\u013c\3\2\2\2\u013c\u013d\3\2\2\2\u013d"+ + "\u013f\t\13\2\2\u013e\u0140\7r\2\2\u013f\u013e\3\2\2\2\u013f\u0140\3\2"+ "\2\2\u0140\u0141\3\2\2\2\u0141\u0182\5(\25\24\u0142\u0144\f\22\2\2\u0143"+ - "\u0145\7t\2\2\u0144\u0143\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\3\2"+ - "\2\2\u0146\u0148\78\2\2\u0147\u0149\7t\2\2\u0148\u0147\3\2\2\2\u0148\u0149"+ + "\u0145\7r\2\2\u0144\u0143\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\3\2"+ + "\2\2\u0146\u0148\7w\2\2\u0147\u0149\7r\2\2\u0148\u0147\3\2\2\2\u0148\u0149"+ "\3\2\2\2\u0149\u014a\3\2\2\2\u014a\u0182\5(\25\23\u014b\u014d\f\21\2\2"+ - "\u014c\u014e\7t\2\2\u014d\u014c\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u014f"+ - "\3\2\2\2\u014f\u0151\79\2\2\u0150\u0152\7t\2\2\u0151\u0150\3\2\2\2\u0151"+ + "\u014c\u014e\7r\2\2\u014d\u014c\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u014f"+ + "\3\2\2\2\u014f\u0151\7\67\2\2\u0150\u0152\7r\2\2\u0151\u0150\3\2\2\2\u0151"+ "\u0152\3\2\2\2\u0152\u0153\3\2\2\2\u0153\u0182\5(\25\22\u0154\u0156\f"+ - "\20\2\2\u0155\u0157\7t\2\2\u0156\u0155\3\2\2\2\u0156\u0157\3\2\2\2\u0157"+ - "\u0158\3\2\2\2\u0158\u015a\7:\2\2\u0159\u015b\7t\2\2\u015a\u0159\3\2\2"+ + "\20\2\2\u0155\u0157\7r\2\2\u0156\u0155\3\2\2\2\u0156\u0157\3\2\2\2\u0157"+ + "\u0158\3\2\2\2\u0158\u015a\78\2\2\u0159\u015b\7r\2\2\u015a\u0159\3\2\2"+ "\2\u015a\u015b\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u0182\5(\25\21\u015d"+ - "\u015f\f\16\2\2\u015e\u0160\7t\2\2\u015f\u015e\3\2\2\2\u015f\u0160\3\2"+ - "\2\2\u0160\u0161\3\2\2\2\u0161\u0163\7=\2\2\u0162\u0164\7t\2\2\u0163\u0162"+ + "\u015f\f\16\2\2\u015e\u0160\7r\2\2\u015f\u015e\3\2\2\2\u015f\u0160\3\2"+ + "\2\2\u0160\u0161\3\2\2\2\u0161\u0163\7;\2\2\u0162\u0164\7r\2\2\u0163\u0162"+ "\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0182\5(\25\17"+ - "\u0166\u0168\f\r\2\2\u0167\u0169\7t\2\2\u0168\u0167\3\2\2\2\u0168\u0169"+ - "\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016c\7>\2\2\u016b\u016d\7t\2\2\u016c"+ + "\u0166\u0168\f\r\2\2\u0167\u0169\7r\2\2\u0168\u0167\3\2\2\2\u0168\u0169"+ + "\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016c\7<\2\2\u016b\u016d\7r\2\2\u016c"+ "\u016b\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u0182\5("+ - "\25\16\u016f\u0171\f\f\2\2\u0170\u0172\7t\2\2\u0171\u0170\3\2\2\2\u0171"+ - "\u0172\3\2\2\2\u0172\u0173\3\2\2\2\u0173\u0175\7?\2\2\u0174\u0176\7t\2"+ + "\25\16\u016f\u0171\f\f\2\2\u0170\u0172\7r\2\2\u0171\u0170\3\2\2\2\u0171"+ + "\u0172\3\2\2\2\u0172\u0173\3\2\2\2\u0173\u0175\7=\2\2\u0174\u0176\7r\2"+ "\2\u0175\u0174\3\2\2\2\u0175\u0176\3\2\2\2\u0176\u0177\3\2\2\2\u0177\u0182"+ - "\5(\25\r\u0178\u0179\f\17\2\2\u0179\u017a\7;\2\2\u017a\u017d\5(\25\2\u017b"+ - "\u017c\7<\2\2\u017c\u017e\5(\25\2\u017d\u017b\3\2\2\2\u017d\u017e\3\2"+ + "\5(\25\r\u0178\u0179\f\17\2\2\u0179\u017a\79\2\2\u017a\u017d\5(\25\2\u017b"+ + "\u017c\7:\2\2\u017c\u017e\5(\25\2\u017d\u017b\3\2\2\2\u017d\u017e\3\2"+ "\2\2\u017e\u0182\3\2\2\2\u017f\u0180\f\4\2\2\u0180\u0182\5*\26\2\u0181"+ "\u010c\3\2\2\2\u0181\u0115\3\2\2\2\u0181\u011e\3\2\2\2\u0181\u0127\3\2"+ "\2\2\u0181\u0130\3\2\2\2\u0181\u0139\3\2\2\2\u0181\u0142\3\2\2\2\u0181"+ "\u014b\3\2\2\2\u0181\u0154\3\2\2\2\u0181\u015d\3\2\2\2\u0181\u0166\3\2"+ "\2\2\u0181\u016f\3\2\2\2\u0181\u0178\3\2\2\2\u0181\u017f\3\2\2\2\u0182"+ "\u0185\3\2\2\2\u0183\u0181\3\2\2\2\u0183\u0184\3\2\2\2\u0184)\3\2\2\2"+ - "\u0185\u0183\3\2\2\2\u0186\u0187\7C\2\2\u0187\u0188\5\32\16\2\u0188+\3"+ + "\u0185\u0183\3\2\2\2\u0186\u0187\7A\2\2\u0187\u0188\5\32\16\2\u0188+\3"+ "\2\2\2\u0189\u018a\5@!\2\u018a\u018b\5\34\17\2\u018b-\3\2\2\2\u018c\u018d"+ - "\7D\2\2\u018d\u018e\7A\2\2\u018e\u018f\5(\25\2\u018f\u0190\7B\2\2\u0190"+ - "/\3\2\2\2\u0191\u0192\78\2\2\u0192\u0193\5@!\2\u0193\61\3\2\2\2\u0194"+ - "\u0195\5@!\2\u0195\u0197\7A\2\2\u0196\u0198\5\66\34\2\u0197\u0196\3\2"+ - "\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019a\7B\2\2\u019a"+ - "\63\3\2\2\2\u019b\u019c\5@!\2\u019c\u019e\7A\2\2\u019d\u019f\5\66\34\2"+ + "\7B\2\2\u018d\u018e\7?\2\2\u018e\u018f\5(\25\2\u018f\u0190\7@\2\2\u0190"+ + "/\3\2\2\2\u0191\u0192\7w\2\2\u0192\u0193\5@!\2\u0193\61\3\2\2\2\u0194"+ + "\u0195\5@!\2\u0195\u0197\7?\2\2\u0196\u0198\5\66\34\2\u0197\u0196\3\2"+ + "\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019a\7@\2\2\u019a"+ + "\63\3\2\2\2\u019b\u019c\5@!\2\u019c\u019e\7?\2\2\u019d\u019f\5\66\34\2"+ "\u019e\u019d\3\2\2\2\u019e\u019f\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0\u01a1"+ - "\7B\2\2\u01a1\65\3\2\2\2\u01a2\u01aa\5(\25\2\u01a3\u01a5\7\20\2\2\u01a4"+ - "\u01a6\7t\2\2\u01a5\u01a4\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a7\3\2"+ + "\7@\2\2\u01a1\65\3\2\2\2\u01a2\u01aa\5(\25\2\u01a3\u01a5\7\20\2\2\u01a4"+ + "\u01a6\7r\2\2\u01a5\u01a4\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a7\3\2"+ "\2\2\u01a7\u01a9\5(\25\2\u01a8\u01a3\3\2\2\2\u01a9\u01ac\3\2\2\2\u01aa"+ "\u01a8\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\67\3\2\2\2\u01ac\u01aa\3\2\2"+ - "\2\u01ad\u01af\7E\2\2\u01ae\u01b0\5\66\34\2\u01af\u01ae\3\2\2\2\u01af"+ - "\u01b0\3\2\2\2\u01b09\3\2\2\2\u01b1\u01b2\7F\2\2\u01b2;\3\2\2\2\u01b3"+ - "\u01b4\7G\2\2\u01b4=\3\2\2\2\u01b5\u01b6\7u\2\2\u01b6?\3\2\2\2\u01b7\u01bc"+ - "\7u\2\2\u01b8\u01b9\7H\2\2\u01b9\u01bb\7u\2\2\u01ba\u01b8\3\2\2\2\u01bb"+ + "\2\u01ad\u01af\7C\2\2\u01ae\u01b0\5\66\34\2\u01af\u01ae\3\2\2\2\u01af"+ + "\u01b0\3\2\2\2\u01b09\3\2\2\2\u01b1\u01b2\7D\2\2\u01b2;\3\2\2\2\u01b3"+ + "\u01b4\7E\2\2\u01b4=\3\2\2\2\u01b5\u01b6\7s\2\2\u01b6?\3\2\2\2\u01b7\u01bc"+ + "\7s\2\2\u01b8\u01b9\7F\2\2\u01b9\u01bb\7s\2\2\u01ba\u01b8\3\2\2\2\u01bb"+ "\u01be\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bc\u01bd\3\2\2\2\u01bdA\3\2\2\2"+ "\u01be\u01bc\3\2\2\2\u01bf\u01c0\t\f\2\2\u01c0C\3\2\2\2\u01c1\u01c2\t"+ "\r\2\2\u01c2E\3\2\2\2\u01c3\u01c4\t\16\2\2\u01c4G\3\2\2\2\u01c5\u01c7"+ "\t\17\2\2\u01c6\u01c8\5J&\2\u01c7\u01c6\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8"+ - "I\3\2\2\2\u01c9\u01ca\7S\2\2\u01caK\3\2\2\2\u01cb\u01cc\t\20\2\2\u01cc"+ - "M\3\2\2\2\u01cd\u01cf\7\33\2\2\u01ce\u01d0\7t\2\2\u01cf\u01ce\3\2\2\2"+ + "I\3\2\2\2\u01c9\u01ca\7Q\2\2\u01caK\3\2\2\2\u01cb\u01cc\t\20\2\2\u01cc"+ + "M\3\2\2\2\u01cd\u01cf\7\32\2\2\u01ce\u01d0\7r\2\2\u01cf\u01ce\3\2\2\2"+ "\u01cf\u01d0\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d9\5(\25\2\u01d2\u01d4"+ - "\7\20\2\2\u01d3\u01d5\7t\2\2\u01d4\u01d3\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5"+ + "\7\20\2\2\u01d3\u01d5\7r\2\2\u01d4\u01d3\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5"+ "\u01d6\3\2\2\2\u01d6\u01d8\5(\25\2\u01d7\u01d2\3\2\2\2\u01d8\u01db\3\2"+ "\2\2\u01d9\u01d7\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01dd\3\2\2\2\u01db"+ - "\u01d9\3\2\2\2\u01dc\u01de\7t\2\2\u01dd\u01dc\3\2\2\2\u01dd\u01de\3\2"+ - "\2\2\u01de\u01df\3\2\2\2\u01df\u01e0\7\34\2\2\u01e0O\3\2\2\2\u01e1\u01e2"+ - "\7z\2\2\u01e2Q\3\2\2\2\u01e3\u01e4\7|\2\2\u01e4S\3\2\2\2\u01e5\u01e6\7"+ - "y\2\2\u01e6U\3\2\2\2\u01e7\u01ee\5H%\2\u01e8\u01ee\5L\'\2\u01e9\u01ee"+ + "\u01d9\3\2\2\2\u01dc\u01de\7r\2\2\u01dd\u01dc\3\2\2\2\u01dd\u01de\3\2"+ + "\2\2\u01de\u01df\3\2\2\2\u01df\u01e0\7\33\2\2\u01e0O\3\2\2\2\u01e1\u01e2"+ + "\7y\2\2\u01e2Q\3\2\2\2\u01e3\u01e4\7{\2\2\u01e4S\3\2\2\2\u01e5\u01e6\7"+ + "x\2\2\u01e6U\3\2\2\2\u01e7\u01ee\5H%\2\u01e8\u01ee\5L\'\2\u01e9\u01ee"+ "\5N(\2\u01ea\u01ee\5P)\2\u01eb\u01ee\5R*\2\u01ec\u01ee\5T+\2\u01ed\u01e7"+ "\3\2\2\2\u01ed\u01e8\3\2\2\2\u01ed\u01e9\3\2\2\2\u01ed\u01ea\3\2\2\2\u01ed"+ - "\u01eb\3\2\2\2\u01ed\u01ec\3\2\2\2\u01eeW\3\2\2\2\u01ef\u01f0\7V\2\2\u01f0"+ - "\u01f1\7{\2\2\u01f1Y\3\2\2\2\u01f2\u01f3\7W\2\2\u01f3\u01f4\5> \2\u01f4"+ - "\u01f6\7A\2\2\u01f5\u01f7\5`\61\2\u01f6\u01f5\3\2\2\2\u01f6\u01f7\3\2"+ - "\2\2\u01f7\u01f8\3\2\2\2\u01f8\u01fa\7B\2\2\u01f9\u01fb\5\\/\2\u01fa\u01f9"+ + "\u01eb\3\2\2\2\u01ed\u01ec\3\2\2\2\u01eeW\3\2\2\2\u01ef\u01f0\7T\2\2\u01f0"+ + "\u01f1\7z\2\2\u01f1Y\3\2\2\2\u01f2\u01f3\7U\2\2\u01f3\u01f4\5> \2\u01f4"+ + "\u01f6\7?\2\2\u01f5\u01f7\5`\61\2\u01f6\u01f5\3\2\2\2\u01f6\u01f7\3\2"+ + "\2\2\u01f7\u01f8\3\2\2\2\u01f8\u01fa\7@\2\2\u01f9\u01fb\5\\/\2\u01fa\u01f9"+ "\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fc\3\2\2\2\u01fc\u01fd\5^\60\2\u01fd"+ - "\u01fe\7t\2\2\u01fe[\3\2\2\2\u01ff\u0200\7X\2\2\u0200\u0201\5b\62\2\u0201"+ - "]\3\2\2\2\u0202\u0203\7Y\2\2\u0203\u0208\7t\2\2\u0204\u0207\5\b\5\2\u0205"+ - "\u0207\7t\2\2\u0206\u0204\3\2\2\2\u0206\u0205\3\2\2\2\u0207\u020a\3\2"+ + "\u01fe\7r\2\2\u01fe[\3\2\2\2\u01ff\u0200\7V\2\2\u0200\u0201\5b\62\2\u0201"+ + "]\3\2\2\2\u0202\u0203\7W\2\2\u0203\u0208\7r\2\2\u0204\u0207\5\b\5\2\u0205"+ + "\u0207\7r\2\2\u0206\u0204\3\2\2\2\u0206\u0205\3\2\2\2\u0207\u020a\3\2"+ "\2\2\u0208\u0206\3\2\2\2\u0208\u0209\3\2\2\2\u0209\u020b\3\2\2\2\u020a"+ - "\u0208\3\2\2\2\u020b\u020c\7Z\2\2\u020c_\3\2\2\2\u020d\u0215\5\22\n\2"+ - "\u020e\u0210\7\20\2\2\u020f\u0211\7t\2\2\u0210\u020f\3\2\2\2\u0210\u0211"+ + "\u0208\3\2\2\2\u020b\u020c\7X\2\2\u020c_\3\2\2\2\u020d\u0215\5\22\n\2"+ + "\u020e\u0210\7\20\2\2\u020f\u0211\7r\2\2\u0210\u020f\3\2\2\2\u0210\u0211"+ "\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u0214\5\22\n\2\u0213\u020e\3\2\2\2"+ "\u0214\u0217\3\2\2\2\u0215\u0213\3\2\2\2\u0215\u0216\3\2\2\2\u0216a\3"+ "\2\2\2\u0217\u0215\3\2\2\2\u0218\u0220\5\32\16\2\u0219\u021b\7\20\2\2"+ - "\u021a\u021c\7t\2\2\u021b\u021a\3\2\2\2\u021b\u021c\3\2\2\2\u021c\u021d"+ + "\u021a\u021c\7r\2\2\u021b\u021a\3\2\2\2\u021b\u021c\3\2\2\2\u021c\u021d"+ "\3\2\2\2\u021d\u021f\5\32\16\2\u021e\u0219\3\2\2\2\u021f\u0222\3\2\2\2"+ "\u0220\u021e\3\2\2\2\u0220\u0221\3\2\2\2\u0221c\3\2\2\2\u0222\u0220\3"+ - "\2\2\2\u0223\u0224\7[\2\2\u0224\u0225\5> \2\u0225\u0227\7A\2\2\u0226\u0228"+ + "\2\2\2\u0223\u0224\7Y\2\2\u0224\u0225\5> \2\u0225\u0227\7?\2\2\u0226\u0228"+ "\5h\65\2\u0227\u0226\3\2\2\2\u0227\u0228\3\2\2\2\u0228\u0229\3\2\2\2\u0229"+ - "\u022a\7B\2\2\u022a\u022b\7X\2\2\u022b\u022c\7\\\2\2\u022c\u022e\7A\2"+ - "\2\u022d\u022f\5l\67\2\u022e\u022d\3\2\2\2\u022e\u022f\3\2\2\2\u022f\u0230"+ - "\3\2\2\2\u0230\u0231\7B\2\2\u0231\u0232\7X\2\2\u0232\u0234\7A\2\2\u0233"+ + "\u022a\7@\2\2\u022a\u022b\7V\2\2\u022b\u022c\7Z\2\2\u022c\u022e\7?\2\2"+ + "\u022d\u022f\5l\67\2\u022e\u022d\3\2\2\2\u022e\u022f\3\2\2\2\u022f\u0230"+ + "\3\2\2\2\u0230\u0231\7@\2\2\u0231\u0232\7V\2\2\u0232\u0234\7?\2\2\u0233"+ "\u0235\5n8\2\u0234\u0233\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0236\3\2\2"+ - "\2\u0236\u0239\7B\2\2\u0237\u023a\5f\64\2\u0238\u023a\5^\60\2\u0239\u0237"+ + "\2\u0236\u0239\7@\2\2\u0237\u023a\5f\64\2\u0238\u023a\5^\60\2\u0239\u0237"+ "\3\2\2\2\u0239\u0238\3\2\2\2\u023ae\3\2\2\2\u023b\u023c\7\21\2\2\u023c"+ "\u023d\5H%\2\u023dg\3\2\2\2\u023e\u0246\5j\66\2\u023f\u0241\7\20\2\2\u0240"+ - "\u0242\7t\2\2\u0241\u0240\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0243\3\2"+ + "\u0242\7r\2\2\u0241\u0240\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0243\3\2"+ "\2\2\u0243\u0245\5j\66\2\u0244\u023f\3\2\2\2\u0245\u0248\3\2\2\2\u0246"+ "\u0244\3\2\2\2\u0246\u0247\3\2\2\2\u0247i\3\2\2\2\u0248\u0246\3\2\2\2"+ - "\u0249\u024a\5\22\n\2\u024a\u024e\7D\2\2\u024b\u024f\5D#\2\u024c\u024f"+ - "\5F$\2\u024d\u024f\7]\2\2\u024e\u024b\3\2\2\2\u024e\u024c\3\2\2\2\u024e"+ + "\u0249\u024a\5\22\n\2\u024a\u024e\7B\2\2\u024b\u024f\5D#\2\u024c\u024f"+ + "\5F$\2\u024d\u024f\7[\2\2\u024e\u024b\3\2\2\2\u024e\u024c\3\2\2\2\u024e"+ "\u024d\3\2\2\2\u024fk\3\2\2\2\u0250\u0255\5B\"\2\u0251\u0252\7\20\2\2"+ "\u0252\u0254\5B\"\2\u0253\u0251\3\2\2\2\u0254\u0257\3\2\2\2\u0255\u0253"+ "\3\2\2\2\u0255\u0256\3\2\2\2\u0256m\3\2\2\2\u0257\u0255\3\2\2\2\u0258"+ - "\u0260\5p9\2\u0259\u025b\7\20\2\2\u025a\u025c\7t\2\2\u025b\u025a\3\2\2"+ + "\u0260\5p9\2\u0259\u025b\7\20\2\2\u025a\u025c\7r\2\2\u025b\u025a\3\2\2"+ "\2\u025b\u025c\3\2\2\2\u025c\u025d\3\2\2\2\u025d\u025f\5p9\2\u025e\u0259"+ "\3\2\2\2\u025f\u0262\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261"+ - "o\3\2\2\2\u0262\u0260\3\2\2\2\u0263\u0264\5\32\16\2\u0264\u0268\7D\2\2"+ - "\u0265\u0269\5D#\2\u0266\u0269\5F$\2\u0267\u0269\7]\2\2\u0268\u0265\3"+ + "o\3\2\2\2\u0262\u0260\3\2\2\2\u0263\u0264\5\32\16\2\u0264\u0268\7B\2\2"+ + "\u0265\u0269\5D#\2\u0266\u0269\5F$\2\u0267\u0269\7[\2\2\u0268\u0265\3"+ "\2\2\2\u0268\u0266\3\2\2\2\u0268\u0267\3\2\2\2\u0269q\3\2\2\2\u026a\u026b"+ - "\7^\2\2\u026b\u026d\5(\25\2\u026c\u026e\7t\2\2\u026d\u026c\3\2\2\2\u026d"+ + "\7\\\2\2\u026b\u026d\5(\25\2\u026c\u026e\7r\2\2\u026d\u026c\3\2\2\2\u026d"+ "\u026e\3\2\2\2\u026e\u0271\3\2\2\2\u026f\u0272\5\b\5\2\u0270\u0272\5^"+ "\60\2\u0271\u026f\3\2\2\2\u0271\u0270\3\2\2\2\u0272\u0274\3\2\2\2\u0273"+ - "\u0275\7t\2\2\u0274\u0273\3\2\2\2\u0274\u0275\3\2\2\2\u0275\u0277\3\2"+ + "\u0275\7r\2\2\u0274\u0273\3\2\2\2\u0274\u0275\3\2\2\2\u0275\u0277\3\2"+ "\2\2\u0276\u0278\5t;\2\u0277\u0276\3\2\2\2\u0277\u0278\3\2\2\2\u0278s"+ - "\3\2\2\2\u0279\u027b\7_\2\2\u027a\u027c\7t\2\2\u027b\u027a\3\2\2\2\u027b"+ + "\3\2\2\2\u0279\u027b\7]\2\2\u027a\u027c\7r\2\2\u027b\u027a\3\2\2\2\u027b"+ "\u027c\3\2\2\2\u027c\u027f\3\2\2\2\u027d\u0280\5\b\5\2\u027e\u0280\5^"+ "\60\2\u027f\u027d\3\2\2\2\u027f\u027e\3\2\2\2\u0280u\3\2\2\2\u0281\u0283"+ - "\5x=\2\u0282\u0284\7t\2\2\u0283\u0282\3\2\2\2\u0283\u0284\3\2\2\2\u0284"+ + "\5x=\2\u0282\u0284\7r\2\2\u0283\u0282\3\2\2\2\u0283\u0284\3\2\2\2\u0284"+ "\u0287\3\2\2\2\u0285\u0288\5\b\5\2\u0286\u0288\5^\60\2\u0287\u0285\3\2"+ - "\2\2\u0287\u0286\3\2\2\2\u0288\u028a\3\2\2\2\u0289\u028b\7t\2\2\u028a"+ + "\2\2\u0287\u0286\3\2\2\2\u0288\u028a\3\2\2\2\u0289\u028b\7r\2\2\u028a"+ "\u0289\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u028d\3\2\2\2\u028c\u028e\5t"+ ";\2\u028d\u028c\3\2\2\2\u028d\u028e\3\2\2\2\u028e\u028f\3\2\2\2\u028f"+ - "\u0290\7t\2\2\u0290w\3\2\2\2\u0291\u0292\t\21\2\2\u0292y\3\2\2\2\u0293"+ - "\u0295\7l\2\2\u0294\u0296\5\32\16\2\u0295\u0294\3\2\2\2\u0295\u0296\3"+ - "\2\2\2\u0296\u0298\3\2\2\2\u0297\u0299\7}\2\2\u0298\u0297\3\2\2\2\u0298"+ + "\u0290\7r\2\2\u0290w\3\2\2\2\u0291\u0292\t\21\2\2\u0292y\3\2\2\2\u0293"+ + "\u0295\7j\2\2\u0294\u0296\5\32\16\2\u0295\u0294\3\2\2\2\u0295\u0296\3"+ + "\2\2\2\u0296\u0298\3\2\2\2\u0297\u0299\7|\2\2\u0298\u0297\3\2\2\2\u0298"+ "\u0299\3\2\2\2\u0299\u029c\3\2\2\2\u029a\u029d\5B\"\2\u029b\u029d\5> "+ "\2\u029c\u029a\3\2\2\2\u029c\u029b\3\2\2\2\u029d\u029e\3\2\2\2\u029e\u029f"+ - "\7m\2\2\u029f\u02a1\5(\25\2\u02a0\u02a2\7t\2\2\u02a1\u02a0\3\2\2\2\u02a1"+ + "\7k\2\2\u029f\u02a1\5(\25\2\u02a0\u02a2\7r\2\2\u02a1\u02a0\3\2\2\2\u02a1"+ "\u02a2\3\2\2\2\u02a2\u02a5\3\2\2\2\u02a3\u02a6\5\b\5\2\u02a4\u02a6\5^"+ "\60\2\u02a5\u02a3\3\2\2\2\u02a5\u02a4\3\2\2\2\u02a6{\3\2\2\2\u02a7\u02a8"+ - "\7n\2\2\u02a8\u02aa\5(\25\2\u02a9\u02ab\7t\2\2\u02aa\u02a9\3\2\2\2\u02aa"+ + "\7l\2\2\u02a8\u02aa\5(\25\2\u02a9\u02ab\7r\2\2\u02aa\u02a9\3\2\2\2\u02aa"+ "\u02ab\3\2\2\2\u02ab\u02ae\3\2\2\2\u02ac\u02af\5\b\5\2\u02ad\u02af\5^"+ "\60\2\u02ae\u02ac\3\2\2\2\u02ae\u02ad\3\2\2\2\u02af}\3\2\2\2\u02b0\u02b3"+ - "\7o\2\2\u02b1\u02b4\5\b\5\2\u02b2\u02b4\5^\60\2\u02b3\u02b1\3\2\2\2\u02b3"+ - "\u02b2\3\2\2\2\u02b4\u02b6\3\2\2\2\u02b5\u02b7\7t\2\2\u02b6\u02b5\3\2"+ - "\2\2\u02b6\u02b7\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8\u02b9\7p\2\2\u02b9"+ + "\7m\2\2\u02b1\u02b4\5\b\5\2\u02b2\u02b4\5^\60\2\u02b3\u02b1\3\2\2\2\u02b3"+ + "\u02b2\3\2\2\2\u02b4\u02b6\3\2\2\2\u02b5\u02b7\7r\2\2\u02b6\u02b5\3\2"+ + "\2\2\u02b6\u02b7\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8\u02b9\7n\2\2\u02b9"+ "\u02ba\5(\25\2\u02ba\177\3\2\2\2^\u0082\u0084\u008b\u0090\u00ab\u00b3"+ "\u00b7\u00be\u00c1\u00c6\u00ca\u00cd\u00ea\u00f5\u010a\u010e\u0112\u0117"+ "\u011b\u0120\u0124\u0129\u012d\u0132\u0136\u013b\u013f\u0144\u0148\u014d"+