added remainder operator '%'

This commit is contained in:
Irmen de Jong 2018-09-16 00:59:12 +02:00
parent 3426593a06
commit 1a40a88103
8 changed files with 409 additions and 612 deletions

View File

@ -112,7 +112,7 @@ expression :
| functioncall | functioncall
| prefix = ('+'|'-'|'~') expression | prefix = ('+'|'-'|'~') expression
| left = expression bop = '**' right = expression | left = expression bop = '**' right = expression
| left = expression bop = ('*' | '/' ) right = expression | left = expression bop = ('*' | '/' | '%' ) right = expression
| left = expression bop = ('+' | '-' ) right = expression | left = expression bop = ('+' | '-' ) right = expression
| left = expression bop = ('<' | '>' | '<=' | '>=') right = expression | left = expression bop = ('<' | '>' | '<=' | '>=') right = expression
| left = expression bop = ('==' | '!=') right = expression | left = expression bop = ('==' | '!=') right = expression

View File

@ -1,269 +1,21 @@
%output prg %output prg
%launcher basic %launcher basic
%option enable_floats
%import c64lib ~ main {
~ not_main $d000 { sub start() -> () {
byte [100] array1 = 0
word [100] array2 = 1
word [4] array2b = [1,2,3,4]
byte [2,3] matrix1 = 2
byte [2,3] matrix2 = [1,2,3,4,5,6]
const byte [100] carray1 = 2 word tx = 0
const word [100] carray2 = 1.w word ty = 12 % 5
const byte [2,3] cmatrix1 = [1,2,3,4,5,255] float time = 0.0
_vm_gfx_clearscr(0)
const float len1 = len([1,2,3])
const float round1 = len([1,2,3])
const float sin1 = len([1,2,3])
float cos1 = len([1,2,3])
loop:
tx = round(sin(time*1.01)*150 + 160)
ty = round((cos(time)+sin(time/44.1))*60 + 128)
_vm_gfx_pixel(tx, ty, rnd() % 4 + 7)
time += 0.02
goto loop
} }
~ main $c003 {
const byte [2,3] cmatrix1 = [1,2,3,4,5,255]
const word[1000] constarray1000 = 99.w
const byte[4] constarray1 = 99
byte[20] array2_20 = 199
byte[3] array3_3 = [1,2,3]
word zzzzz=len(cmatrix1)
word qqqqq=len(constarray1000)
byte Qzzzzz=len(cmatrix1)
byte Qqqqqq=len(constarray1)
word lsb1 = lsb($ea31)
word msb1 = msb($ea31)
byte lsb2 = lsb($ea31)
byte msb2 = msb($ea31)
word lsb3 = lsb($ea)
word msb3 = msb($ea)
const byte matrixsize = len(cmatrix1)
const byte matrixsize2 = len(not_main.cmatrix1)
const word len1 = len([1,2,3,wa1, wa2, ws1, all1])
const word wa1 = ceil(abs(-999.22))
const byte wa1b = abs(99)
const byte wa1c = -(1-99)
const byte wa1d = -0
const byte wa2 = abs(-99)
const byte wa2b= abs(-99.w)
const byte wa2c = abs(-99)
const word wa2d = abs(-999)
float wa3 = abs(-1.23456)
const float wa4 = abs(-133)
const float avg1 = avg([-1.23456, 99999])
const float sum1 = sum([-1.23456, 99999])
const word ws1 = floor(sum([1,2,3,4.9]))
const word ws2 = ceil(avg([1,2,3,4.9]))
const word ws3 = round(sum([1,2,3,4.9]))
const word any1 = any([0,0,0,0,0,22,0,0])
const word any2 = any([2+sin(2.0), 2])
const word all1 = all([0,0,0,0,0,22,0,0])
const word all2 = all([0.0])
const word all3 = all([wa1, wa2, ws1, all1])
const word max1 = max([-1,-2,3.33,99+22])
const str greeting = "Hello world!"
str greeting2 = "Hello world 2!"
const word min1 = min([1,2,3,99+22])
word dinges = round(not_main.len1)
wa3 = rnd()
wa3 = rndw()
wa3 = rndf(22)
_vm_write_memchr($a000)
_vm_write_memstr($a000)
_vm_write_num(wa3)
_vm_write_char(wa2c)
_vm_write_str(greeting)
_vm_write_str(greeting2)
_vm_write_str(greeting2)
_vm_write_str(wa3)
; greeting2 = _vm_input_var(len(greeting2))
_vm_gfx_clearscr(6)
_vm_gfx_pixel(10, 20, 1)
_vm_gfx_pixel(11, 21, 2)
_vm_gfx_pixel(12, 22, 3)
_vm_gfx_text(50,100,7,"Ahoy!")
A += 8
A += rnd()
A =A+ rnd()
A = X>2
X = Y>Y
byte myByteChar = "A"
word myWordChar = "B"
word[1000] ascending = 10 to 1009
str ascending3 = "a" to "z"
str ascending5 = "z" to "z"
const byte cc = 4 + (2==9)
byte cc2 = 4 - (2==10)
; memory byte derp = max([$ffdd]) ; @todo implement memory vars in stackvm
; memory byte derpA = abs(-20000)
; memory byte derpB = max([1, 2.2, 4.4, 100])
; memory byte cderp = min([$ffdd])+ (1/1)
; memory byte cderpA = min([$ffdd, 10, 20, 30])
; memory byte cderpB = min([1, 2.2, 4.4, 100])
; memory byte derp2 = 2+$ffdd+round(10*sin(3.1))
const byte hopla=55-33
const byte hopla3=100+(-hopla)
const byte hopla4 = 100-hopla
const byte hopla1=main.hopla
const float blerp1 = zwop / 2.22
const float zwop = -1.7014118345e+38
const float zwop2 = -1.7014118345e+38
const float blerp2 = zwop / 2.22
const byte equal = 4==4
const byte equal2 = (4+hopla)>0
byte[10] array10 = 22
byte[1000] array1000 = 33
; goto 64738
A++
; derp++
cc2--
goto mega
if_eq goto mega
if_eq {
A=99
} else {
A=100
}
byte equalQQ = 4==4
const byte equalQQ2 = (4+hopla)>0
const str string1 = "hallo"
str string2 = "doei dat was het weer"+"sdfdsf"*5
equalQQ++
AX++
A=msb(X + round(sin(Y)+ 1111))
A=lsb(X + round(sin(Y)+1111))
equalQQ= X
equalQQ= len([X, Y, AX])
equalQQ= len("abcdef")
equalQQ= len([1,2,3])
equalQQ= len(string1)
equalQQ= lsb(len(string2))
equalQQ= len(string2)
;equalQQ = len(array10) ; @todo muust work byte
; equalQQ = len(array1000) ; @todo must fail word
P_carry(1)
P_irqd(0)
;equalQQ = foo(33)
;equalQQ = main.foo(33)
foo(33)
main.foo(33)
XY = hopla*2+hopla1
byte equalWW = 4==4
const byte equalWW2 = (4+hopla)>0
if (1==1) goto cool
if (1==2) return 44
if (2==2) A=4
if (3==3) X=5 else A=99
if (5==5) {
A=99
}
if(6==6) {
A=lsb(sin(X))
X=max([1,233,Y])
X=min([1,2,Y])
X=lsl(12)
X=lsl(Y)
P_carry(0)
P_carry(1)
P_carry(1-1)
P_irqd(0)
P_irqd(1)
} else X=33
X= extra233.thingy()
if(6>36) {
A=99
} else {
X=33
}
main.foo(1,2,3)
return
sub start () -> () {
word dinges = 0
word blerp1 =999
word blerp3 = 1
byte blerp2 =99
float flob =1.1
dinges=blerp1
blerp3 = blerp2
A=blerp2
A=$02
;A=$02.w ; @todo error word/byte
;A=$002 ; @todo error word/byte
;A=$00ff ; @todo error word/byte
A=%11001100
; A=%0010011001 ;@todo error word/byte
; A=99.w ; @todo error word/byte
XY=blerp1
X=blerp2
return
}
mega:
X += 1
cool:
Y=2
goto start
sub foo () -> () {
byte blerp = 3
A=99
; return 33
return
ultrafoo()
X =33
mega:
cool:
return
sub ultrafoo() -> () {
X= extra233.thingy()
;return 33
return
goto main.mega
}
}
some_label_def: A=44
;return 1+999
return
} }
%import imported
%import imported
%import imported2
%import imported2

View File

@ -300,6 +300,7 @@ class Compiler(private val options: CompilationOptions) {
"-" -> "sub" "-" -> "sub"
"*" -> "mul" "*" -> "mul"
"/" -> "div" "/" -> "div"
"%" -> "remainder"
"**" -> "pow" "**" -> "pow"
"&" -> "bitand" "&" -> "bitand"
"|" -> "bitor" "|" -> "bitor"

View File

@ -11,6 +11,7 @@ class ConstExprEvaluator {
"-" -> minus(left, right) "-" -> minus(left, right)
"*" -> multiply(left, right) "*" -> multiply(left, right)
"/" -> divide(left, right) "/" -> divide(left, right)
"%" -> remainder(left, right)
"**" -> power(left, right) "**" -> power(left, right)
"&" -> bitwiseand(left, right) "&" -> bitwiseand(left, right)
"|" -> bitwiseor(left, right) "|" -> bitwiseor(left, right)
@ -302,4 +303,33 @@ class ConstExprEvaluator {
else -> throw ExpressionError(error, left.position) else -> throw ExpressionError(error, left.position)
} }
} }
private fun remainder(left: LiteralValue, right: LiteralValue): LiteralValue {
val error = "cannot compute remainder of $left by $right"
return when {
left.asIntegerValue!=null -> when {
right.asIntegerValue!=null -> {
if(right.asIntegerValue==0) throw ExpressionError("attempt to divide by zero", left.position)
LiteralValue.optimalNumeric(left.asIntegerValue % right.asIntegerValue, left.position)
}
right.floatvalue!=null -> {
if(right.floatvalue==0.0) throw ExpressionError("attempt to divide by zero", left.position)
LiteralValue(DataType.FLOAT, floatvalue = left.asIntegerValue % right.floatvalue, position = left.position)
}
else -> throw ExpressionError(error, left.position)
}
left.floatvalue!=null -> when {
right.asIntegerValue!=null -> {
if(right.asIntegerValue==0) throw ExpressionError("attempt to divide by zero", left.position)
LiteralValue(DataType.FLOAT, floatvalue = left.floatvalue % right.asIntegerValue, position = left.position)
}
right.floatvalue!=null -> {
if(right.floatvalue==0.0) throw ExpressionError("attempt to divide by zero", left.position)
LiteralValue(DataType.FLOAT, floatvalue = left.floatvalue % right.floatvalue, position = left.position)
}
else -> throw ExpressionError(error, left.position)
}
else -> throw ExpressionError(error, left.position)
}
}
} }

View File

@ -1,4 +1,4 @@
// Generated from prog8.g4 by ANTLR 4.7.1 // Generated from /home/irmen/Projects/prog8/compiler/antlr/prog8.g4 by ANTLR 4.7
package prog8.parser; package prog8.parser;
import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStream;
@ -11,7 +11,7 @@ import org.antlr.v4.runtime.misc.*;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class prog8Lexer extends Lexer { public class prog8Lexer extends Lexer {
static { RuntimeMetaData.checkVersion("4.7.1", RuntimeMetaData.VERSION); } static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA; protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache = protected static final PredictionContextCache _sharedContextCache =
@ -29,8 +29,8 @@ public class prog8Lexer extends Lexer {
T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73, T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80, T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87, T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
LINECOMMENT=88, COMMENT=89, WS=90, EOL=91, NAME=92, DEC_INTEGER=93, HEX_INTEGER=94, T__87=88, LINECOMMENT=89, COMMENT=90, WS=91, EOL=92, NAME=93, DEC_INTEGER=94,
BIN_INTEGER=95, FLOAT_NUMBER=96, STRING=97, INLINEASMBLOCK=98; HEX_INTEGER=95, BIN_INTEGER=96, FLOAT_NUMBER=97, STRING=98, INLINEASMBLOCK=99;
public static String[] channelNames = { public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN" "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
}; };
@ -50,9 +50,9 @@ public class prog8Lexer extends Lexer {
"T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64", "T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64",
"T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72", "T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72",
"T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80", "T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80",
"T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "LINECOMMENT", "COMMENT", "T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "LINECOMMENT",
"WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER",
"FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK" "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK"
}; };
private static final String[] _LITERAL_NAMES = { private static final String[] _LITERAL_NAMES = {
@ -61,12 +61,12 @@ public class prog8Lexer extends Lexer {
"'%option'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'", "'%option'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'",
"'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='",
"'-='", "'/='", "'*='", "'**='", "'&='", "'|='", "'^='", "'++'", "'--'", "'-='", "'/='", "'*='", "'**='", "'&='", "'|='", "'^='", "'++'", "'--'",
"'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'", "'<'", "'>'", "'<='", "'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'", "'%'", "'<'", "'>'",
"'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'and'", "'or'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'and'",
"'xor'", "'not'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'or'", "'xor'", "'not'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'",
"'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'",
"'sub'", "'->'", "'{'", "'}'", "'?'", "'if'", "'else'", "'if_cs'", "'if_cc'", "'%asm'", "'sub'", "'->'", "'{'", "'}'", "'?'", "'if'", "'else'", "'if_cs'",
"'if_eq'", "'if_ne'", "'if_pl'", "'if_mi'", "'if_vs'", "'if_vc'" "'if_cc'", "'if_eq'", "'if_ne'", "'if_pl'", "'if_mi'", "'if_vs'", "'if_vc'"
}; };
private static final String[] _SYMBOLIC_NAMES = { private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@ -76,7 +76,7 @@ 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, 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", null, null, null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME",
"DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING",
"INLINEASMBLOCK" "INLINEASMBLOCK"
}; };
@ -140,10 +140,10 @@ public class prog8Lexer extends Lexer {
@Override @Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) { switch (ruleIndex) {
case 98: case 99:
STRING_action((RuleContext)_localctx, actionIndex); STRING_action((RuleContext)_localctx, actionIndex);
break; break;
case 99: case 100:
INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex); INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex);
break; break;
} }
@ -172,7 +172,7 @@ public class prog8Lexer extends Lexer {
} }
public static final String _serializedATN = public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2d\u02a6\b\1\4\2\t"+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2e\u02aa\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"+ "\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"+ "\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"+ "\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"+
@ -183,220 +183,221 @@ public class prog8Lexer extends Lexer {
"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ "\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\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ "\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\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4"+ "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3"+
"\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"+ "\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"+
"\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\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"+
"\3\b\3\b\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"+ "\b\3\b\3\b\3\b\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"+
"\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"+ "\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"+
"\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\r\3\r\3\r\3\r\3"+ "\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\r\3\r\3"+
"\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21"+ "\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3"+
"\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23"+ "\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3"+
"\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\26\3\26"+ "\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"+
"\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"+ "\26\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"+
"\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"+ "\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"+
"\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"+ "\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)\3)\3)\3*"+
"+\3,\3,\3-\3-\3.\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3\62\3\62"+ "\3*\3+\3+\3,\3,\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3\62"+
"\3\63\3\63\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\67\3\67\3\67"+ "\3\62\3\62\3\63\3\63\3\64\3\64\3\65\3\65\3\66\3\66\3\66\3\67\3\67\3\67"+
"\38\38\38\38\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3;\3;\3<\3<\3=\3=\3>\3>"+ "\3\67\38\38\38\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@\3A\3A\3A\3B\3B\3B\3C\3C\3C\3D\3D\3D\3E\3E\3E\3F\3F"+ "=\3>\3>\3?\3?\3@\3@\3@\3A\3A\3A\3B\3B\3B\3C\3C\3C\3D\3D\3D\3E\3E\3E\3"+
"\3F\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3J\3J\3J\3J\3K\3K"+ "F\3F\3F\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3K\3"+
"\3K\3L\3L\3M\3M\3N\3N\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R"+ "K\3K\3K\3L\3L\3L\3M\3M\3N\3N\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3"+
"\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3V"+ "R\3R\3R\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3V\3V\3"+
"\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\7Y\u023d\nY"+ "V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3"+
"\fY\16Y\u0240\13Y\3Y\3Y\3Y\3Y\3Z\3Z\7Z\u0248\nZ\fZ\16Z\u024b\13Z\3Z\3"+ "Z\7Z\u0241\nZ\fZ\16Z\u0244\13Z\3Z\3Z\3Z\3Z\3[\3[\7[\u024c\n[\f[\16[\u024f"+
"Z\3[\3[\3[\3[\3\\\6\\\u0254\n\\\r\\\16\\\u0255\3]\3]\7]\u025a\n]\f]\16"+ "\13[\3[\3[\3\\\3\\\3\\\3\\\3]\6]\u0258\n]\r]\16]\u0259\3^\3^\7^\u025e"+
"]\u025d\13]\3^\3^\3^\6^\u0262\n^\r^\16^\u0263\5^\u0266\n^\3_\3_\6_\u026a"+ "\n^\f^\16^\u0261\13^\3_\3_\3_\6_\u0266\n_\r_\16_\u0267\5_\u026a\n_\3`"+
"\n_\r_\16_\u026b\3`\3`\6`\u0270\n`\r`\16`\u0271\3a\3a\3a\5a\u0277\na\3"+ "\3`\6`\u026e\n`\r`\16`\u026f\3a\3a\6a\u0274\na\ra\16a\u0275\3b\3b\3b\5"+
"a\5a\u027a\na\3b\6b\u027d\nb\rb\16b\u027e\3b\3b\6b\u0283\nb\rb\16b\u0284"+ "b\u027b\nb\3b\5b\u027e\nb\3c\6c\u0281\nc\rc\16c\u0282\3c\3c\6c\u0287\n"+
"\5b\u0287\nb\3c\3c\3c\3c\5c\u028d\nc\3d\3d\3d\7d\u0292\nd\fd\16d\u0295"+ "c\rc\16c\u0288\5c\u028b\nc\3d\3d\3d\3d\5d\u0291\nd\3e\3e\3e\7e\u0296\n"+
"\13d\3d\3d\3d\3e\3e\3e\3e\6e\u029e\ne\re\16e\u029f\3e\3e\3e\3e\3e\3\u029f"+ "e\fe\16e\u0299\13e\3e\3e\3e\3f\3f\3f\3f\6f\u02a2\nf\rf\16f\u02a3\3f\3"+
"\2f\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"+ "f\3f\3f\3f\3\u02a3\2g\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27"+
"\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36"+ "\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33"+
";\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67"+ "\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63"+
"m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d"+ "e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089"+
"H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+ "F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d"+
"R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5"+ "P\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1"+
"\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3\2\u00c5\2\u00c7c\u00c9"+ "Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5"+
"d\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;"+ "\2\u00c7\2\u00c9d\u00cbe\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|"+
"CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u02b4\2\3\3\2\2\2\2\5\3\2\2\2"+ "\6\2\62;C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u02b8"+
"\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\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\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\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\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\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\61\3\2\2\2\2\63\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\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\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\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\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"+
"\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"+ "\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\2"+
"\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"+ "U\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\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"+ "\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"+
"\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"+ "\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\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\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"+
"\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\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2"+
"\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\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"+
"\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\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2"+
"\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\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"+
"\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\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2"+
"\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\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"+
"\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\3\u00cb"+ "\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"+
"\3\2\2\2\5\u00cd\3\2\2\2\7\u00cf\3\2\2\2\t\u00d4\3\2\2\2\13\u00dc\3\2"+ "\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\3\u00cd\3\2\2\2\5\u00cf\3\2\2\2\7\u00d1"+
"\2\2\r\u00e6\3\2\2\2\17\u00f0\3\2\2\2\21\u00f9\3\2\2\2\23\u0101\3\2\2"+ "\3\2\2\2\t\u00d6\3\2\2\2\13\u00de\3\2\2\2\r\u00e8\3\2\2\2\17\u00f2\3\2"+
"\2\25\u010d\3\2\2\2\27\u0119\3\2\2\2\31\u0124\3\2\2\2\33\u012c\3\2\2\2"+ "\2\2\21\u00fb\3\2\2\2\23\u0103\3\2\2\2\25\u010f\3\2\2\2\27\u011b\3\2\2"+
"\35\u012e\3\2\2\2\37\u0130\3\2\2\2!\u0136\3\2\2\2#\u013d\3\2\2\2%\u0142"+ "\2\31\u0126\3\2\2\2\33\u012e\3\2\2\2\35\u0130\3\2\2\2\37\u0132\3\2\2\2"+
"\3\2\2\2\'\u0147\3\2\2\2)\u014d\3\2\2\2+\u0151\3\2\2\2-\u0157\3\2\2\2"+ "!\u0138\3\2\2\2#\u013f\3\2\2\2%\u0144\3\2\2\2\'\u0149\3\2\2\2)\u014f\3"+
"/\u015d\3\2\2\2\61\u0164\3\2\2\2\63\u0166\3\2\2\2\65\u0168\3\2\2\2\67"+ "\2\2\2+\u0153\3\2\2\2-\u0159\3\2\2\2/\u015f\3\2\2\2\61\u0166\3\2\2\2\63"+
"\u016b\3\2\2\29\u016e\3\2\2\2;\u0171\3\2\2\2=\u0174\3\2\2\2?\u0178\3\2"+ "\u0168\3\2\2\2\65\u016a\3\2\2\2\67\u016d\3\2\2\29\u0170\3\2\2\2;\u0173"+
"\2\2A\u017b\3\2\2\2C\u017e\3\2\2\2E\u0181\3\2\2\2G\u0184\3\2\2\2I\u0187"+ "\3\2\2\2=\u0176\3\2\2\2?\u017a\3\2\2\2A\u017d\3\2\2\2C\u0180\3\2\2\2E"+
"\3\2\2\2K\u0189\3\2\2\2M\u018b\3\2\2\2O\u018d\3\2\2\2Q\u018f\3\2\2\2S"+ "\u0183\3\2\2\2G\u0186\3\2\2\2I\u0189\3\2\2\2K\u018b\3\2\2\2M\u018d\3\2"+
"\u0192\3\2\2\2U\u0194\3\2\2\2W\u0196\3\2\2\2Y\u0198\3\2\2\2[\u019a\3\2"+ "\2\2O\u018f\3\2\2\2Q\u0191\3\2\2\2S\u0194\3\2\2\2U\u0196\3\2\2\2W\u0198"+
"\2\2]\u019d\3\2\2\2_\u01a0\3\2\2\2a\u01a3\3\2\2\2c\u01a6\3\2\2\2e\u01a8"+ "\3\2\2\2Y\u019a\3\2\2\2[\u019c\3\2\2\2]\u019e\3\2\2\2_\u01a1\3\2\2\2a"+
"\3\2\2\2g\u01aa\3\2\2\2i\u01ac\3\2\2\2k\u01af\3\2\2\2m\u01b3\3\2\2\2o"+ "\u01a4\3\2\2\2c\u01a7\3\2\2\2e\u01aa\3\2\2\2g\u01ac\3\2\2\2i\u01ae\3\2"+
"\u01b6\3\2\2\2q\u01ba\3\2\2\2s\u01be\3\2\2\2u\u01c5\3\2\2\2w\u01c7\3\2"+ "\2\2k\u01b0\3\2\2\2m\u01b3\3\2\2\2o\u01b7\3\2\2\2q\u01ba\3\2\2\2s\u01be"+
"\2\2y\u01c9\3\2\2\2{\u01cb\3\2\2\2}\u01cd\3\2\2\2\177\u01d0\3\2\2\2\u0081"+ "\3\2\2\2u\u01c2\3\2\2\2w\u01c9\3\2\2\2y\u01cb\3\2\2\2{\u01cd\3\2\2\2}"+
"\u01d3\3\2\2\2\u0083\u01d6\3\2\2\2\u0085\u01d9\3\2\2\2\u0087\u01dc\3\2"+ "\u01cf\3\2\2\2\177\u01d1\3\2\2\2\u0081\u01d4\3\2\2\2\u0083\u01d7\3\2\2"+
"\2\2\u0089\u01df\3\2\2\2\u008b\u01e2\3\2\2\2\u008d\u01e5\3\2\2\2\u008f"+ "\2\u0085\u01da\3\2\2\2\u0087\u01dd\3\2\2\2\u0089\u01e0\3\2\2\2\u008b\u01e3"+
"\u01ea\3\2\2\2\u0091\u01f0\3\2\2\2\u0093\u01f5\3\2\2\2\u0095\u01f9\3\2"+ "\3\2\2\2\u008d\u01e6\3\2\2\2\u008f\u01e9\3\2\2\2\u0091\u01ee\3\2\2\2\u0093"+
"\2\2\u0097\u01fc\3\2\2\2\u0099\u01fe\3\2\2\2\u009b\u0200\3\2\2\2\u009d"+ "\u01f4\3\2\2\2\u0095\u01f9\3\2\2\2\u0097\u01fd\3\2\2\2\u0099\u0200\3\2"+
"\u0202\3\2\2\2\u009f\u0205\3\2\2\2\u00a1\u020a\3\2\2\2\u00a3\u0210\3\2"+ "\2\2\u009b\u0202\3\2\2\2\u009d\u0204\3\2\2\2\u009f\u0206\3\2\2\2\u00a1"+
"\2\2\u00a5\u0216\3\2\2\2\u00a7\u021c\3\2\2\2\u00a9\u0222\3\2\2\2\u00ab"+ "\u0209\3\2\2\2\u00a3\u020e\3\2\2\2\u00a5\u0214\3\2\2\2\u00a7\u021a\3\2"+
"\u0228\3\2\2\2\u00ad\u022e\3\2\2\2\u00af\u0234\3\2\2\2\u00b1\u023a\3\2"+ "\2\2\u00a9\u0220\3\2\2\2\u00ab\u0226\3\2\2\2\u00ad\u022c\3\2\2\2\u00af"+
"\2\2\u00b3\u0245\3\2\2\2\u00b5\u024e\3\2\2\2\u00b7\u0253\3\2\2\2\u00b9"+ "\u0232\3\2\2\2\u00b1\u0238\3\2\2\2\u00b3\u023e\3\2\2\2\u00b5\u0249\3\2"+
"\u0257\3\2\2\2\u00bb\u0265\3\2\2\2\u00bd\u0267\3\2\2\2\u00bf\u026d\3\2"+ "\2\2\u00b7\u0252\3\2\2\2\u00b9\u0257\3\2\2\2\u00bb\u025b\3\2\2\2\u00bd"+
"\2\2\u00c1\u0273\3\2\2\2\u00c3\u027c\3\2\2\2\u00c5\u028c\3\2\2\2\u00c7"+ "\u0269\3\2\2\2\u00bf\u026b\3\2\2\2\u00c1\u0271\3\2\2\2\u00c3\u0277\3\2"+
"\u028e\3\2\2\2\u00c9\u0299\3\2\2\2\u00cb\u00cc\7\u0080\2\2\u00cc\4\3\2"+ "\2\2\u00c5\u0280\3\2\2\2\u00c7\u0290\3\2\2\2\u00c9\u0292\3\2\2\2\u00cb"+
"\2\2\u00cd\u00ce\7<\2\2\u00ce\6\3\2\2\2\u00cf\u00d0\7i\2\2\u00d0\u00d1"+ "\u029d\3\2\2\2\u00cd\u00ce\7\u0080\2\2\u00ce\4\3\2\2\2\u00cf\u00d0\7<"+
"\7q\2\2\u00d1\u00d2\7v\2\2\u00d2\u00d3\7q\2\2\u00d3\b\3\2\2\2\u00d4\u00d5"+ "\2\2\u00d0\6\3\2\2\2\u00d1\u00d2\7i\2\2\u00d2\u00d3\7q\2\2\u00d3\u00d4"+
"\7\'\2\2\u00d5\u00d6\7q\2\2\u00d6\u00d7\7w\2\2\u00d7\u00d8\7v\2\2\u00d8"+ "\7v\2\2\u00d4\u00d5\7q\2\2\u00d5\b\3\2\2\2\u00d6\u00d7\7\'\2\2\u00d7\u00d8"+
"\u00d9\7r\2\2\u00d9\u00da\7w\2\2\u00da\u00db\7v\2\2\u00db\n\3\2\2\2\u00dc"+ "\7q\2\2\u00d8\u00d9\7w\2\2\u00d9\u00da\7v\2\2\u00da\u00db\7r\2\2\u00db"+
"\u00dd\7\'\2\2\u00dd\u00de\7n\2\2\u00de\u00df\7c\2\2\u00df\u00e0\7w\2"+ "\u00dc\7w\2\2\u00dc\u00dd\7v\2\2\u00dd\n\3\2\2\2\u00de\u00df\7\'\2\2\u00df"+
"\2\u00e0\u00e1\7p\2\2\u00e1\u00e2\7e\2\2\u00e2\u00e3\7j\2\2\u00e3\u00e4"+ "\u00e0\7n\2\2\u00e0\u00e1\7c\2\2\u00e1\u00e2\7w\2\2\u00e2\u00e3\7p\2\2"+
"\7g\2\2\u00e4\u00e5\7t\2\2\u00e5\f\3\2\2\2\u00e6\u00e7\7\'\2\2\u00e7\u00e8"+ "\u00e3\u00e4\7e\2\2\u00e4\u00e5\7j\2\2\u00e5\u00e6\7g\2\2\u00e6\u00e7"+
"\7|\2\2\u00e8\u00e9\7g\2\2\u00e9\u00ea\7t\2\2\u00ea\u00eb\7q\2\2\u00eb"+ "\7t\2\2\u00e7\f\3\2\2\2\u00e8\u00e9\7\'\2\2\u00e9\u00ea\7|\2\2\u00ea\u00eb"+
"\u00ec\7r\2\2\u00ec\u00ed\7c\2\2\u00ed\u00ee\7i\2\2\u00ee\u00ef\7g\2\2"+ "\7g\2\2\u00eb\u00ec\7t\2\2\u00ec\u00ed\7q\2\2\u00ed\u00ee\7r\2\2\u00ee"+
"\u00ef\16\3\2\2\2\u00f0\u00f1\7\'\2\2\u00f1\u00f2\7c\2\2\u00f2\u00f3\7"+ "\u00ef\7c\2\2\u00ef\u00f0\7i\2\2\u00f0\u00f1\7g\2\2\u00f1\16\3\2\2\2\u00f2"+
"f\2\2\u00f3\u00f4\7f\2\2\u00f4\u00f5\7t\2\2\u00f5\u00f6\7g\2\2\u00f6\u00f7"+ "\u00f3\7\'\2\2\u00f3\u00f4\7c\2\2\u00f4\u00f5\7f\2\2\u00f5\u00f6\7f\2"+
"\7u\2\2\u00f7\u00f8\7u\2\2\u00f8\20\3\2\2\2\u00f9\u00fa\7\'\2\2\u00fa"+ "\2\u00f6\u00f7\7t\2\2\u00f7\u00f8\7g\2\2\u00f8\u00f9\7u\2\2\u00f9\u00fa"+
"\u00fb\7k\2\2\u00fb\u00fc\7o\2\2\u00fc\u00fd\7r\2\2\u00fd\u00fe\7q\2\2"+ "\7u\2\2\u00fa\20\3\2\2\2\u00fb\u00fc\7\'\2\2\u00fc\u00fd\7k\2\2\u00fd"+
"\u00fe\u00ff\7t\2\2\u00ff\u0100\7v\2\2\u0100\22\3\2\2\2\u0101\u0102\7"+ "\u00fe\7o\2\2\u00fe\u00ff\7r\2\2\u00ff\u0100\7q\2\2\u0100\u0101\7t\2\2"+
"\'\2\2\u0102\u0103\7d\2\2\u0103\u0104\7t\2\2\u0104\u0105\7g\2\2\u0105"+ "\u0101\u0102\7v\2\2\u0102\22\3\2\2\2\u0103\u0104\7\'\2\2\u0104\u0105\7"+
"\u0106\7c\2\2\u0106\u0107\7m\2\2\u0107\u0108\7r\2\2\u0108\u0109\7q\2\2"+ "d\2\2\u0105\u0106\7t\2\2\u0106\u0107\7g\2\2\u0107\u0108\7c\2\2\u0108\u0109"+
"\u0109\u010a\7k\2\2\u010a\u010b\7p\2\2\u010b\u010c\7v\2\2\u010c\24\3\2"+ "\7m\2\2\u0109\u010a\7r\2\2\u010a\u010b\7q\2\2\u010b\u010c\7k\2\2\u010c"+
"\2\2\u010d\u010e\7\'\2\2\u010e\u010f\7c\2\2\u010f\u0110\7u\2\2\u0110\u0111"+ "\u010d\7p\2\2\u010d\u010e\7v\2\2\u010e\24\3\2\2\2\u010f\u0110\7\'\2\2"+
"\7o\2\2\u0111\u0112\7k\2\2\u0112\u0113\7p\2\2\u0113\u0114\7e\2\2\u0114"+ "\u0110\u0111\7c\2\2\u0111\u0112\7u\2\2\u0112\u0113\7o\2\2\u0113\u0114"+
"\u0115\7n\2\2\u0115\u0116\7w\2\2\u0116\u0117\7f\2\2\u0117\u0118\7g\2\2"+ "\7k\2\2\u0114\u0115\7p\2\2\u0115\u0116\7e\2\2\u0116\u0117\7n\2\2\u0117"+
"\u0118\26\3\2\2\2\u0119\u011a\7\'\2\2\u011a\u011b\7c\2\2\u011b\u011c\7"+ "\u0118\7w\2\2\u0118\u0119\7f\2\2\u0119\u011a\7g\2\2\u011a\26\3\2\2\2\u011b"+
"u\2\2\u011c\u011d\7o\2\2\u011d\u011e\7d\2\2\u011e\u011f\7k\2\2\u011f\u0120"+ "\u011c\7\'\2\2\u011c\u011d\7c\2\2\u011d\u011e\7u\2\2\u011e\u011f\7o\2"+
"\7p\2\2\u0120\u0121\7c\2\2\u0121\u0122\7t\2\2\u0122\u0123\7{\2\2\u0123"+ "\2\u011f\u0120\7d\2\2\u0120\u0121\7k\2\2\u0121\u0122\7p\2\2\u0122\u0123"+
"\30\3\2\2\2\u0124\u0125\7\'\2\2\u0125\u0126\7q\2\2\u0126\u0127\7r\2\2"+ "\7c\2\2\u0123\u0124\7t\2\2\u0124\u0125\7{\2\2\u0125\30\3\2\2\2\u0126\u0127"+
"\u0127\u0128\7v\2\2\u0128\u0129\7k\2\2\u0129\u012a\7q\2\2\u012a\u012b"+ "\7\'\2\2\u0127\u0128\7q\2\2\u0128\u0129\7r\2\2\u0129\u012a\7v\2\2\u012a"+
"\7p\2\2\u012b\32\3\2\2\2\u012c\u012d\7.\2\2\u012d\34\3\2\2\2\u012e\u012f"+ "\u012b\7k\2\2\u012b\u012c\7q\2\2\u012c\u012d\7p\2\2\u012d\32\3\2\2\2\u012e"+
"\7?\2\2\u012f\36\3\2\2\2\u0130\u0131\7e\2\2\u0131\u0132\7q\2\2\u0132\u0133"+ "\u012f\7.\2\2\u012f\34\3\2\2\2\u0130\u0131\7?\2\2\u0131\36\3\2\2\2\u0132"+
"\7p\2\2\u0133\u0134\7u\2\2\u0134\u0135\7v\2\2\u0135 \3\2\2\2\u0136\u0137"+ "\u0133\7e\2\2\u0133\u0134\7q\2\2\u0134\u0135\7p\2\2\u0135\u0136\7u\2\2"+
"\7o\2\2\u0137\u0138\7g\2\2\u0138\u0139\7o\2\2\u0139\u013a\7q\2\2\u013a"+ "\u0136\u0137\7v\2\2\u0137 \3\2\2\2\u0138\u0139\7o\2\2\u0139\u013a\7g\2"+
"\u013b\7t\2\2\u013b\u013c\7{\2\2\u013c\"\3\2\2\2\u013d\u013e\7d\2\2\u013e"+ "\2\u013a\u013b\7o\2\2\u013b\u013c\7q\2\2\u013c\u013d\7t\2\2\u013d\u013e"+
"\u013f\7{\2\2\u013f\u0140\7v\2\2\u0140\u0141\7g\2\2\u0141$\3\2\2\2\u0142"+ "\7{\2\2\u013e\"\3\2\2\2\u013f\u0140\7d\2\2\u0140\u0141\7{\2\2\u0141\u0142"+
"\u0143\7y\2\2\u0143\u0144\7q\2\2\u0144\u0145\7t\2\2\u0145\u0146\7f\2\2"+ "\7v\2\2\u0142\u0143\7g\2\2\u0143$\3\2\2\2\u0144\u0145\7y\2\2\u0145\u0146"+
"\u0146&\3\2\2\2\u0147\u0148\7h\2\2\u0148\u0149\7n\2\2\u0149\u014a\7q\2"+ "\7q\2\2\u0146\u0147\7t\2\2\u0147\u0148\7f\2\2\u0148&\3\2\2\2\u0149\u014a"+
"\2\u014a\u014b\7c\2\2\u014b\u014c\7v\2\2\u014c(\3\2\2\2\u014d\u014e\7"+ "\7h\2\2\u014a\u014b\7n\2\2\u014b\u014c\7q\2\2\u014c\u014d\7c\2\2\u014d"+
"u\2\2\u014e\u014f\7v\2\2\u014f\u0150\7t\2\2\u0150*\3\2\2\2\u0151\u0152"+ "\u014e\7v\2\2\u014e(\3\2\2\2\u014f\u0150\7u\2\2\u0150\u0151\7v\2\2\u0151"+
"\7u\2\2\u0152\u0153\7v\2\2\u0153\u0154\7t\2\2\u0154\u0155\7a\2\2\u0155"+ "\u0152\7t\2\2\u0152*\3\2\2\2\u0153\u0154\7u\2\2\u0154\u0155\7v\2\2\u0155"+
"\u0156\7r\2\2\u0156,\3\2\2\2\u0157\u0158\7u\2\2\u0158\u0159\7v\2\2\u0159"+ "\u0156\7t\2\2\u0156\u0157\7a\2\2\u0157\u0158\7r\2\2\u0158,\3\2\2\2\u0159"+
"\u015a\7t\2\2\u015a\u015b\7a\2\2\u015b\u015c\7u\2\2\u015c.\3\2\2\2\u015d"+ "\u015a\7u\2\2\u015a\u015b\7v\2\2\u015b\u015c\7t\2\2\u015c\u015d\7a\2\2"+
"\u015e\7u\2\2\u015e\u015f\7v\2\2\u015f\u0160\7t\2\2\u0160\u0161\7a\2\2"+ "\u015d\u015e\7u\2\2\u015e.\3\2\2\2\u015f\u0160\7u\2\2\u0160\u0161\7v\2"+
"\u0161\u0162\7r\2\2\u0162\u0163\7u\2\2\u0163\60\3\2\2\2\u0164\u0165\7"+ "\2\u0161\u0162\7t\2\2\u0162\u0163\7a\2\2\u0163\u0164\7r\2\2\u0164\u0165"+
"]\2\2\u0165\62\3\2\2\2\u0166\u0167\7_\2\2\u0167\64\3\2\2\2\u0168\u0169"+ "\7u\2\2\u0165\60\3\2\2\2\u0166\u0167\7]\2\2\u0167\62\3\2\2\2\u0168\u0169"+
"\7-\2\2\u0169\u016a\7?\2\2\u016a\66\3\2\2\2\u016b\u016c\7/\2\2\u016c\u016d"+ "\7_\2\2\u0169\64\3\2\2\2\u016a\u016b\7-\2\2\u016b\u016c\7?\2\2\u016c\66"+
"\7?\2\2\u016d8\3\2\2\2\u016e\u016f\7\61\2\2\u016f\u0170\7?\2\2\u0170:"+ "\3\2\2\2\u016d\u016e\7/\2\2\u016e\u016f\7?\2\2\u016f8\3\2\2\2\u0170\u0171"+
"\3\2\2\2\u0171\u0172\7,\2\2\u0172\u0173\7?\2\2\u0173<\3\2\2\2\u0174\u0175"+ "\7\61\2\2\u0171\u0172\7?\2\2\u0172:\3\2\2\2\u0173\u0174\7,\2\2\u0174\u0175"+
"\7,\2\2\u0175\u0176\7,\2\2\u0176\u0177\7?\2\2\u0177>\3\2\2\2\u0178\u0179"+ "\7?\2\2\u0175<\3\2\2\2\u0176\u0177\7,\2\2\u0177\u0178\7,\2\2\u0178\u0179"+
"\7(\2\2\u0179\u017a\7?\2\2\u017a@\3\2\2\2\u017b\u017c\7~\2\2\u017c\u017d"+ "\7?\2\2\u0179>\3\2\2\2\u017a\u017b\7(\2\2\u017b\u017c\7?\2\2\u017c@\3"+
"\7?\2\2\u017dB\3\2\2\2\u017e\u017f\7`\2\2\u017f\u0180\7?\2\2\u0180D\3"+ "\2\2\2\u017d\u017e\7~\2\2\u017e\u017f\7?\2\2\u017fB\3\2\2\2\u0180\u0181"+
"\2\2\2\u0181\u0182\7-\2\2\u0182\u0183\7-\2\2\u0183F\3\2\2\2\u0184\u0185"+ "\7`\2\2\u0181\u0182\7?\2\2\u0182D\3\2\2\2\u0183\u0184\7-\2\2\u0184\u0185"+
"\7/\2\2\u0185\u0186\7/\2\2\u0186H\3\2\2\2\u0187\u0188\7*\2\2\u0188J\3"+ "\7-\2\2\u0185F\3\2\2\2\u0186\u0187\7/\2\2\u0187\u0188\7/\2\2\u0188H\3"+
"\2\2\2\u0189\u018a\7+\2\2\u018aL\3\2\2\2\u018b\u018c\7-\2\2\u018cN\3\2"+ "\2\2\2\u0189\u018a\7*\2\2\u018aJ\3\2\2\2\u018b\u018c\7+\2\2\u018cL\3\2"+
"\2\2\u018d\u018e\7/\2\2\u018eP\3\2\2\2\u018f\u0190\7,\2\2\u0190\u0191"+ "\2\2\u018d\u018e\7-\2\2\u018eN\3\2\2\2\u018f\u0190\7/\2\2\u0190P\3\2\2"+
"\7,\2\2\u0191R\3\2\2\2\u0192\u0193\7,\2\2\u0193T\3\2\2\2\u0194\u0195\7"+ "\2\u0191\u0192\7,\2\2\u0192\u0193\7,\2\2\u0193R\3\2\2\2\u0194\u0195\7"+
"\61\2\2\u0195V\3\2\2\2\u0196\u0197\7>\2\2\u0197X\3\2\2\2\u0198\u0199\7"+ ",\2\2\u0195T\3\2\2\2\u0196\u0197\7\61\2\2\u0197V\3\2\2\2\u0198\u0199\7"+
"@\2\2\u0199Z\3\2\2\2\u019a\u019b\7>\2\2\u019b\u019c\7?\2\2\u019c\\\3\2"+ "\'\2\2\u0199X\3\2\2\2\u019a\u019b\7>\2\2\u019bZ\3\2\2\2\u019c\u019d\7"+
"\2\2\u019d\u019e\7@\2\2\u019e\u019f\7?\2\2\u019f^\3\2\2\2\u01a0\u01a1"+ "@\2\2\u019d\\\3\2\2\2\u019e\u019f\7>\2\2\u019f\u01a0\7?\2\2\u01a0^\3\2"+
"\7?\2\2\u01a1\u01a2\7?\2\2\u01a2`\3\2\2\2\u01a3\u01a4\7#\2\2\u01a4\u01a5"+ "\2\2\u01a1\u01a2\7@\2\2\u01a2\u01a3\7?\2\2\u01a3`\3\2\2\2\u01a4\u01a5"+
"\7?\2\2\u01a5b\3\2\2\2\u01a6\u01a7\7(\2\2\u01a7d\3\2\2\2\u01a8\u01a9\7"+ "\7?\2\2\u01a5\u01a6\7?\2\2\u01a6b\3\2\2\2\u01a7\u01a8\7#\2\2\u01a8\u01a9"+
"`\2\2\u01a9f\3\2\2\2\u01aa\u01ab\7~\2\2\u01abh\3\2\2\2\u01ac\u01ad\7v"+ "\7?\2\2\u01a9d\3\2\2\2\u01aa\u01ab\7(\2\2\u01abf\3\2\2\2\u01ac\u01ad\7"+
"\2\2\u01ad\u01ae\7q\2\2\u01aej\3\2\2\2\u01af\u01b0\7c\2\2\u01b0\u01b1"+ "`\2\2\u01adh\3\2\2\2\u01ae\u01af\7~\2\2\u01afj\3\2\2\2\u01b0\u01b1\7v"+
"\7p\2\2\u01b1\u01b2\7f\2\2\u01b2l\3\2\2\2\u01b3\u01b4\7q\2\2\u01b4\u01b5"+ "\2\2\u01b1\u01b2\7q\2\2\u01b2l\3\2\2\2\u01b3\u01b4\7c\2\2\u01b4\u01b5"+
"\7t\2\2\u01b5n\3\2\2\2\u01b6\u01b7\7z\2\2\u01b7\u01b8\7q\2\2\u01b8\u01b9"+ "\7p\2\2\u01b5\u01b6\7f\2\2\u01b6n\3\2\2\2\u01b7\u01b8\7q\2\2\u01b8\u01b9"+
"\7t\2\2\u01b9p\3\2\2\2\u01ba\u01bb\7p\2\2\u01bb\u01bc\7q\2\2\u01bc\u01bd"+ "\7t\2\2\u01b9p\3\2\2\2\u01ba\u01bb\7z\2\2\u01bb\u01bc\7q\2\2\u01bc\u01bd"+
"\7v\2\2\u01bdr\3\2\2\2\u01be\u01bf\7t\2\2\u01bf\u01c0\7g\2\2\u01c0\u01c1"+ "\7t\2\2\u01bdr\3\2\2\2\u01be\u01bf\7p\2\2\u01bf\u01c0\7q\2\2\u01c0\u01c1"+
"\7v\2\2\u01c1\u01c2\7w\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4\7p\2\2\u01c4"+ "\7v\2\2\u01c1t\3\2\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5"+
"t\3\2\2\2\u01c5\u01c6\7\60\2\2\u01c6v\3\2\2\2\u01c7\u01c8\7C\2\2\u01c8"+ "\7v\2\2\u01c5\u01c6\7w\2\2\u01c6\u01c7\7t\2\2\u01c7\u01c8\7p\2\2\u01c8"+
"x\3\2\2\2\u01c9\u01ca\7Z\2\2\u01caz\3\2\2\2\u01cb\u01cc\7[\2\2\u01cc|"+ "v\3\2\2\2\u01c9\u01ca\7\60\2\2\u01cax\3\2\2\2\u01cb\u01cc\7C\2\2\u01cc"+
"\3\2\2\2\u01cd\u01ce\7C\2\2\u01ce\u01cf\7Z\2\2\u01cf~\3\2\2\2\u01d0\u01d1"+ "z\3\2\2\2\u01cd\u01ce\7Z\2\2\u01ce|\3\2\2\2\u01cf\u01d0\7[\2\2\u01d0~"+
"\7C\2\2\u01d1\u01d2\7[\2\2\u01d2\u0080\3\2\2\2\u01d3\u01d4\7Z\2\2\u01d4"+ "\3\2\2\2\u01d1\u01d2\7C\2\2\u01d2\u01d3\7Z\2\2\u01d3\u0080\3\2\2\2\u01d4"+
"\u01d5\7[\2\2\u01d5\u0082\3\2\2\2\u01d6\u01d7\7R\2\2\u01d7\u01d8\7e\2"+ "\u01d5\7C\2\2\u01d5\u01d6\7[\2\2\u01d6\u0082\3\2\2\2\u01d7\u01d8\7Z\2"+
"\2\u01d8\u0084\3\2\2\2\u01d9\u01da\7R\2\2\u01da\u01db\7|\2\2\u01db\u0086"+ "\2\u01d8\u01d9\7[\2\2\u01d9\u0084\3\2\2\2\u01da\u01db\7R\2\2\u01db\u01dc"+
"\3\2\2\2\u01dc\u01dd\7R\2\2\u01dd\u01de\7p\2\2\u01de\u0088\3\2\2\2\u01df"+ "\7e\2\2\u01dc\u0086\3\2\2\2\u01dd\u01de\7R\2\2\u01de\u01df\7|\2\2\u01df"+
"\u01e0\7R\2\2\u01e0\u01e1\7x\2\2\u01e1\u008a\3\2\2\2\u01e2\u01e3\7\60"+ "\u0088\3\2\2\2\u01e0\u01e1\7R\2\2\u01e1\u01e2\7p\2\2\u01e2\u008a\3\2\2"+
"\2\2\u01e3\u01e4\7y\2\2\u01e4\u008c\3\2\2\2\u01e5\u01e6\7v\2\2\u01e6\u01e7"+ "\2\u01e3\u01e4\7R\2\2\u01e4\u01e5\7x\2\2\u01e5\u008c\3\2\2\2\u01e6\u01e7"+
"\7t\2\2\u01e7\u01e8\7w\2\2\u01e8\u01e9\7g\2\2\u01e9\u008e\3\2\2\2\u01ea"+ "\7\60\2\2\u01e7\u01e8\7y\2\2\u01e8\u008e\3\2\2\2\u01e9\u01ea\7v\2\2\u01ea"+
"\u01eb\7h\2\2\u01eb\u01ec\7c\2\2\u01ec\u01ed\7n\2\2\u01ed\u01ee\7u\2\2"+ "\u01eb\7t\2\2\u01eb\u01ec\7w\2\2\u01ec\u01ed\7g\2\2\u01ed\u0090\3\2\2"+
"\u01ee\u01ef\7g\2\2\u01ef\u0090\3\2\2\2\u01f0\u01f1\7\'\2\2\u01f1\u01f2"+ "\2\u01ee\u01ef\7h\2\2\u01ef\u01f0\7c\2\2\u01f0\u01f1\7n\2\2\u01f1\u01f2"+
"\7c\2\2\u01f2\u01f3\7u\2\2\u01f3\u01f4\7o\2\2\u01f4\u0092\3\2\2\2\u01f5"+ "\7u\2\2\u01f2\u01f3\7g\2\2\u01f3\u0092\3\2\2\2\u01f4\u01f5\7\'\2\2\u01f5"+
"\u01f6\7u\2\2\u01f6\u01f7\7w\2\2\u01f7\u01f8\7d\2\2\u01f8\u0094\3\2\2"+ "\u01f6\7c\2\2\u01f6\u01f7\7u\2\2\u01f7\u01f8\7o\2\2\u01f8\u0094\3\2\2"+
"\2\u01f9\u01fa\7/\2\2\u01fa\u01fb\7@\2\2\u01fb\u0096\3\2\2\2\u01fc\u01fd"+ "\2\u01f9\u01fa\7u\2\2\u01fa\u01fb\7w\2\2\u01fb\u01fc\7d\2\2\u01fc\u0096"+
"\7}\2\2\u01fd\u0098\3\2\2\2\u01fe\u01ff\7\177\2\2\u01ff\u009a\3\2\2\2"+ "\3\2\2\2\u01fd\u01fe\7/\2\2\u01fe\u01ff\7@\2\2\u01ff\u0098\3\2\2\2\u0200"+
"\u0200\u0201\7A\2\2\u0201\u009c\3\2\2\2\u0202\u0203\7k\2\2\u0203\u0204"+ "\u0201\7}\2\2\u0201\u009a\3\2\2\2\u0202\u0203\7\177\2\2\u0203\u009c\3"+
"\7h\2\2\u0204\u009e\3\2\2\2\u0205\u0206\7g\2\2\u0206\u0207\7n\2\2\u0207"+ "\2\2\2\u0204\u0205\7A\2\2\u0205\u009e\3\2\2\2\u0206\u0207\7k\2\2\u0207"+
"\u0208\7u\2\2\u0208\u0209\7g\2\2\u0209\u00a0\3\2\2\2\u020a\u020b\7k\2"+ "\u0208\7h\2\2\u0208\u00a0\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020b\7n\2"+
"\2\u020b\u020c\7h\2\2\u020c\u020d\7a\2\2\u020d\u020e\7e\2\2\u020e\u020f"+ "\2\u020b\u020c\7u\2\2\u020c\u020d\7g\2\2\u020d\u00a2\3\2\2\2\u020e\u020f"+
"\7u\2\2\u020f\u00a2\3\2\2\2\u0210\u0211\7k\2\2\u0211\u0212\7h\2\2\u0212"+ "\7k\2\2\u020f\u0210\7h\2\2\u0210\u0211\7a\2\2\u0211\u0212\7e\2\2\u0212"+
"\u0213\7a\2\2\u0213\u0214\7e\2\2\u0214\u0215\7e\2\2\u0215\u00a4\3\2\2"+ "\u0213\7u\2\2\u0213\u00a4\3\2\2\2\u0214\u0215\7k\2\2\u0215\u0216\7h\2"+
"\2\u0216\u0217\7k\2\2\u0217\u0218\7h\2\2\u0218\u0219\7a\2\2\u0219\u021a"+ "\2\u0216\u0217\7a\2\2\u0217\u0218\7e\2\2\u0218\u0219\7e\2\2\u0219\u00a6"+
"\7g\2\2\u021a\u021b\7s\2\2\u021b\u00a6\3\2\2\2\u021c\u021d\7k\2\2\u021d"+ "\3\2\2\2\u021a\u021b\7k\2\2\u021b\u021c\7h\2\2\u021c\u021d\7a\2\2\u021d"+
"\u021e\7h\2\2\u021e\u021f\7a\2\2\u021f\u0220\7p\2\2\u0220\u0221\7g\2\2"+ "\u021e\7g\2\2\u021e\u021f\7s\2\2\u021f\u00a8\3\2\2\2\u0220\u0221\7k\2"+
"\u0221\u00a8\3\2\2\2\u0222\u0223\7k\2\2\u0223\u0224\7h\2\2\u0224\u0225"+ "\2\u0221\u0222\7h\2\2\u0222\u0223\7a\2\2\u0223\u0224\7p\2\2\u0224\u0225"+
"\7a\2\2\u0225\u0226\7r\2\2\u0226\u0227\7n\2\2\u0227\u00aa\3\2\2\2\u0228"+ "\7g\2\2\u0225\u00aa\3\2\2\2\u0226\u0227\7k\2\2\u0227\u0228\7h\2\2\u0228"+
"\u0229\7k\2\2\u0229\u022a\7h\2\2\u022a\u022b\7a\2\2\u022b\u022c\7o\2\2"+ "\u0229\7a\2\2\u0229\u022a\7r\2\2\u022a\u022b\7n\2\2\u022b\u00ac\3\2\2"+
"\u022c\u022d\7k\2\2\u022d\u00ac\3\2\2\2\u022e\u022f\7k\2\2\u022f\u0230"+ "\2\u022c\u022d\7k\2\2\u022d\u022e\7h\2\2\u022e\u022f\7a\2\2\u022f\u0230"+
"\7h\2\2\u0230\u0231\7a\2\2\u0231\u0232\7x\2\2\u0232\u0233\7u\2\2\u0233"+ "\7o\2\2\u0230\u0231\7k\2\2\u0231\u00ae\3\2\2\2\u0232\u0233\7k\2\2\u0233"+
"\u00ae\3\2\2\2\u0234\u0235\7k\2\2\u0235\u0236\7h\2\2\u0236\u0237\7a\2"+ "\u0234\7h\2\2\u0234\u0235\7a\2\2\u0235\u0236\7x\2\2\u0236\u0237\7u\2\2"+
"\2\u0237\u0238\7x\2\2\u0238\u0239\7e\2\2\u0239\u00b0\3\2\2\2\u023a\u023e"+ "\u0237\u00b0\3\2\2\2\u0238\u0239\7k\2\2\u0239\u023a\7h\2\2\u023a\u023b"+
"\t\2\2\2\u023b\u023d\t\3\2\2\u023c\u023b\3\2\2\2\u023d\u0240\3\2\2\2\u023e"+ "\7a\2\2\u023b\u023c\7x\2\2\u023c\u023d\7e\2\2\u023d\u00b2\3\2\2\2\u023e"+
"\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u0241\3\2\2\2\u0240\u023e\3\2"+ "\u0242\t\2\2\2\u023f\u0241\t\3\2\2\u0240\u023f\3\2\2\2\u0241\u0244\3\2"+
"\2\2\u0241\u0242\5\u00b3Z\2\u0242\u0243\3\2\2\2\u0243\u0244\bY\2\2\u0244"+ "\2\2\u0242\u0240\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u0245\3\2\2\2\u0244"+
"\u00b2\3\2\2\2\u0245\u0249\7=\2\2\u0246\u0248\n\2\2\2\u0247\u0246\3\2"+ "\u0242\3\2\2\2\u0245\u0246\5\u00b5[\2\u0246\u0247\3\2\2\2\u0247\u0248"+
"\2\2\u0248\u024b\3\2\2\2\u0249\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a"+ "\bZ\2\2\u0248\u00b4\3\2\2\2\u0249\u024d\7=\2\2\u024a\u024c\n\2\2\2\u024b"+
"\u024c\3\2\2\2\u024b\u0249\3\2\2\2\u024c\u024d\bZ\2\2\u024d\u00b4\3\2"+ "\u024a\3\2\2\2\u024c\u024f\3\2\2\2\u024d\u024b\3\2\2\2\u024d\u024e\3\2"+
"\2\2\u024e\u024f\t\3\2\2\u024f\u0250\3\2\2\2\u0250\u0251\b[\3\2\u0251"+ "\2\2\u024e\u0250\3\2\2\2\u024f\u024d\3\2\2\2\u0250\u0251\b[\2\2\u0251"+
"\u00b6\3\2\2\2\u0252\u0254\t\2\2\2\u0253\u0252\3\2\2\2\u0254\u0255\3\2"+ "\u00b6\3\2\2\2\u0252\u0253\t\3\2\2\u0253\u0254\3\2\2\2\u0254\u0255\b\\"+
"\2\2\u0255\u0253\3\2\2\2\u0255\u0256\3\2\2\2\u0256\u00b8\3\2\2\2\u0257"+ "\3\2\u0255\u00b8\3\2\2\2\u0256\u0258\t\2\2\2\u0257\u0256\3\2\2\2\u0258"+
"\u025b\t\4\2\2\u0258\u025a\t\5\2\2\u0259\u0258\3\2\2\2\u025a\u025d\3\2"+ "\u0259\3\2\2\2\u0259\u0257\3\2\2\2\u0259\u025a\3\2\2\2\u025a\u00ba\3\2"+
"\2\2\u025b\u0259\3\2\2\2\u025b\u025c\3\2\2\2\u025c\u00ba\3\2\2\2\u025d"+ "\2\2\u025b\u025f\t\4\2\2\u025c\u025e\t\5\2\2\u025d\u025c\3\2\2\2\u025e"+
"\u025b\3\2\2\2\u025e\u0266\4\62;\2\u025f\u0261\4\63;\2\u0260\u0262\4\62"+ "\u0261\3\2\2\2\u025f\u025d\3\2\2\2\u025f\u0260\3\2\2\2\u0260\u00bc\3\2"+
";\2\u0261\u0260\3\2\2\2\u0262\u0263\3\2\2\2\u0263\u0261\3\2\2\2\u0263"+ "\2\2\u0261\u025f\3\2\2\2\u0262\u026a\4\62;\2\u0263\u0265\4\63;\2\u0264"+
"\u0264\3\2\2\2\u0264\u0266\3\2\2\2\u0265\u025e\3\2\2\2\u0265\u025f\3\2"+ "\u0266\4\62;\2\u0265\u0264\3\2\2\2\u0266\u0267\3\2\2\2\u0267\u0265\3\2"+
"\2\2\u0266\u00bc\3\2\2\2\u0267\u0269\7&\2\2\u0268\u026a\t\6\2\2\u0269"+ "\2\2\u0267\u0268\3\2\2\2\u0268\u026a\3\2\2\2\u0269\u0262\3\2\2\2\u0269"+
"\u0268\3\2\2\2\u026a\u026b\3\2\2\2\u026b\u0269\3\2\2\2\u026b\u026c\3\2"+ "\u0263\3\2\2\2\u026a\u00be\3\2\2\2\u026b\u026d\7&\2\2\u026c\u026e\t\6"+
"\2\2\u026c\u00be\3\2\2\2\u026d\u026f\7\'\2\2\u026e\u0270\4\62\63\2\u026f"+ "\2\2\u026d\u026c\3\2\2\2\u026e\u026f\3\2\2\2\u026f\u026d\3\2\2\2\u026f"+
"\u026e\3\2\2\2\u0270\u0271\3\2\2\2\u0271\u026f\3\2\2\2\u0271\u0272\3\2"+ "\u0270\3\2\2\2\u0270\u00c0\3\2\2\2\u0271\u0273\7\'\2\2\u0272\u0274\4\62"+
"\2\2\u0272\u00c0\3\2\2\2\u0273\u0279\5\u00c3b\2\u0274\u0276\t\7\2\2\u0275"+ "\63\2\u0273\u0272\3\2\2\2\u0274\u0275\3\2\2\2\u0275\u0273\3\2\2\2\u0275"+
"\u0277\t\b\2\2\u0276\u0275\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0278\3\2"+ "\u0276\3\2\2\2\u0276\u00c2\3\2\2\2\u0277\u027d\5\u00c5c\2\u0278\u027a"+
"\2\2\u0278\u027a\5\u00c3b\2\u0279\u0274\3\2\2\2\u0279\u027a\3\2\2\2\u027a"+ "\t\7\2\2\u0279\u027b\t\b\2\2\u027a\u0279\3\2\2\2\u027a\u027b\3\2\2\2\u027b"+
"\u00c2\3\2\2\2\u027b\u027d\4\62;\2\u027c\u027b\3\2\2\2\u027d\u027e\3\2"+ "\u027c\3\2\2\2\u027c\u027e\5\u00c5c\2\u027d\u0278\3\2\2\2\u027d\u027e"+
"\2\2\u027e\u027c\3\2\2\2\u027e\u027f\3\2\2\2\u027f\u0286\3\2\2\2\u0280"+ "\3\2\2\2\u027e\u00c4\3\2\2\2\u027f\u0281\4\62;\2\u0280\u027f\3\2\2\2\u0281"+
"\u0282\7\60\2\2\u0281\u0283\4\62;\2\u0282\u0281\3\2\2\2\u0283\u0284\3"+ "\u0282\3\2\2\2\u0282\u0280\3\2\2\2\u0282\u0283\3\2\2\2\u0283\u028a\3\2"+
"\2\2\2\u0284\u0282\3\2\2\2\u0284\u0285\3\2\2\2\u0285\u0287\3\2\2\2\u0286"+ "\2\2\u0284\u0286\7\60\2\2\u0285\u0287\4\62;\2\u0286\u0285\3\2\2\2\u0287"+
"\u0280\3\2\2\2\u0286\u0287\3\2\2\2\u0287\u00c4\3\2\2\2\u0288\u0289\7^"+ "\u0288\3\2\2\2\u0288\u0286\3\2\2\2\u0288\u0289\3\2\2\2\u0289\u028b\3\2"+
"\2\2\u0289\u028d\13\2\2\2\u028a\u028b\7^\2\2\u028b\u028d\5\u00b7\\\2\u028c"+ "\2\2\u028a\u0284\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u00c6\3\2\2\2\u028c"+
"\u0288\3\2\2\2\u028c\u028a\3\2\2\2\u028d\u00c6\3\2\2\2\u028e\u0293\7$"+ "\u028d\7^\2\2\u028d\u0291\13\2\2\2\u028e\u028f\7^\2\2\u028f\u0291\5\u00b9"+
"\2\2\u028f\u0292\5\u00c5c\2\u0290\u0292\n\t\2\2\u0291\u028f\3\2\2\2\u0291"+ "]\2\u0290\u028c\3\2\2\2\u0290\u028e\3\2\2\2\u0291\u00c8\3\2\2\2\u0292"+
"\u0290\3\2\2\2\u0292\u0295\3\2\2\2\u0293\u0291\3\2\2\2\u0293\u0294\3\2"+ "\u0297\7$\2\2\u0293\u0296\5\u00c7d\2\u0294\u0296\n\t\2\2\u0295\u0293\3"+
"\2\2\u0294\u0296\3\2\2\2\u0295\u0293\3\2\2\2\u0296\u0297\7$\2\2\u0297"+ "\2\2\2\u0295\u0294\3\2\2\2\u0296\u0299\3\2\2\2\u0297\u0295\3\2\2\2\u0297"+
"\u0298\bd\4\2\u0298\u00c8\3\2\2\2\u0299\u029a\7}\2\2\u029a\u029b\7}\2"+ "\u0298\3\2\2\2\u0298\u029a\3\2\2\2\u0299\u0297\3\2\2\2\u029a\u029b\7$"+
"\2\u029b\u029d\3\2\2\2\u029c\u029e\13\2\2\2\u029d\u029c\3\2\2\2\u029e"+ "\2\2\u029b\u029c\be\4\2\u029c\u00ca\3\2\2\2\u029d\u029e\7}\2\2\u029e\u029f"+
"\u029f\3\2\2\2\u029f\u02a0\3\2\2\2\u029f\u029d\3\2\2\2\u02a0\u02a1\3\2"+ "\7}\2\2\u029f\u02a1\3\2\2\2\u02a0\u02a2\13\2\2\2\u02a1\u02a0\3\2\2\2\u02a2"+
"\2\2\u02a1\u02a2\7\177\2\2\u02a2\u02a3\7\177\2\2\u02a3\u02a4\3\2\2\2\u02a4"+ "\u02a3\3\2\2\2\u02a3\u02a4\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4\u02a5\3\2"+
"\u02a5\be\5\2\u02a5\u00ca\3\2\2\2\25\2\u023e\u0249\u0255\u025b\u0263\u0265"+ "\2\2\u02a5\u02a6\7\177\2\2\u02a6\u02a7\7\177\2\2\u02a7\u02a8\3\2\2\2\u02a8"+
"\u0269\u026b\u0271\u0276\u0279\u027e\u0284\u0286\u028c\u0291\u0293\u029f"+ "\u02a9\bf\5\2\u02a9\u00cc\3\2\2\2\25\2\u0242\u024d\u0259\u025f\u0267\u0269"+
"\6\2\3\2\b\2\2\3d\2\3e\3"; "\u026d\u026f\u0275\u027a\u027d\u0282\u0288\u028a\u0290\u0295\u0297\u02a3"+
"\6\2\3\2\b\2\2\3e\2\3f\3";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@ -1,4 +1,4 @@
// Generated from prog8.g4 by ANTLR 4.7.1 // Generated from /home/irmen/Projects/prog8/compiler/antlr/prog8.g4 by ANTLR 4.7
package prog8.parser; package prog8.parser;
import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.dfa.DFA;
@ -11,7 +11,7 @@ import java.util.ArrayList;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class prog8Parser extends Parser { public class prog8Parser extends Parser {
static { RuntimeMetaData.checkVersion("4.7.1", RuntimeMetaData.VERSION); } static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA; protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache = protected static final PredictionContextCache _sharedContextCache =
@ -29,8 +29,8 @@ public class prog8Parser extends Parser {
T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73, T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80, T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87, T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
LINECOMMENT=88, COMMENT=89, WS=90, EOL=91, NAME=92, DEC_INTEGER=93, HEX_INTEGER=94, T__87=88, LINECOMMENT=89, COMMENT=90, WS=91, EOL=92, NAME=93, DEC_INTEGER=94,
BIN_INTEGER=95, FLOAT_NUMBER=96, STRING=97, INLINEASMBLOCK=98; HEX_INTEGER=95, BIN_INTEGER=96, FLOAT_NUMBER=97, STRING=98, INLINEASMBLOCK=99;
public static final int public static final int
RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3, RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3,
RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7, RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7,
@ -63,12 +63,12 @@ public class prog8Parser extends Parser {
"'%option'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'", "'%option'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'",
"'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='",
"'-='", "'/='", "'*='", "'**='", "'&='", "'|='", "'^='", "'++'", "'--'", "'-='", "'/='", "'*='", "'**='", "'&='", "'|='", "'^='", "'++'", "'--'",
"'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'", "'<'", "'>'", "'<='", "'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'", "'%'", "'<'", "'>'",
"'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'and'", "'or'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'and'",
"'xor'", "'not'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'or'", "'xor'", "'not'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'",
"'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'",
"'sub'", "'->'", "'{'", "'}'", "'?'", "'if'", "'else'", "'if_cs'", "'if_cc'", "'%asm'", "'sub'", "'->'", "'{'", "'}'", "'?'", "'if'", "'else'", "'if_cs'",
"'if_eq'", "'if_ne'", "'if_pl'", "'if_mi'", "'if_vs'", "'if_vc'" "'if_cc'", "'if_eq'", "'if_ne'", "'if_pl'", "'if_mi'", "'if_vs'", "'if_vc'"
}; };
private static final String[] _SYMBOLIC_NAMES = { private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
@ -78,7 +78,7 @@ 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, 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", null, null, null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME",
"DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING",
"INLINEASMBLOCK" "INLINEASMBLOCK"
}; };
@ -296,7 +296,7 @@ public class prog8Parser extends Parser {
setState(108); setState(108);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (((((_la - 93)) & ~0x3f) == 0 && ((1L << (_la - 93)) & ((1L << (DEC_INTEGER - 93)) | (1L << (HEX_INTEGER - 93)) | (1L << (BIN_INTEGER - 93)))) != 0)) { if (((((_la - 94)) & ~0x3f) == 0 && ((1L << (_la - 94)) & ((1L << (DEC_INTEGER - 94)) | (1L << (HEX_INTEGER - 94)) | (1L << (BIN_INTEGER - 94)))) != 0)) {
{ {
setState(107); setState(107);
integerliteral(); integerliteral();
@ -1286,7 +1286,7 @@ public class prog8Parser extends Parser {
case 4: case 4:
{ {
setState(213); setState(213);
((ExpressionContext)_localctx).prefix = match(T__55); ((ExpressionContext)_localctx).prefix = match(T__56);
setState(214); setState(214);
expression(5); expression(5);
} }
@ -1353,7 +1353,7 @@ public class prog8Parser extends Parser {
setState(225); setState(225);
((ExpressionContext)_localctx).bop = _input.LT(1); ((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(_la==T__40 || _la==T__41) ) { if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__40) | (1L << T__41) | (1L << T__42))) != 0)) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1399,7 +1399,7 @@ public class prog8Parser extends Parser {
setState(231); setState(231);
((ExpressionContext)_localctx).bop = _input.LT(1); ((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1); _la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) ) { if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__46))) != 0)) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1422,7 +1422,7 @@ public class prog8Parser extends Parser {
setState(234); setState(234);
((ExpressionContext)_localctx).bop = _input.LT(1); ((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(_la==T__46 || _la==T__47) ) { if ( !(_la==T__47 || _la==T__48) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1443,7 +1443,7 @@ public class prog8Parser extends Parser {
setState(236); setState(236);
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
setState(237); setState(237);
((ExpressionContext)_localctx).bop = match(T__48); ((ExpressionContext)_localctx).bop = match(T__49);
setState(238); setState(238);
((ExpressionContext)_localctx).right = expression(13); ((ExpressionContext)_localctx).right = expression(13);
} }
@ -1457,7 +1457,7 @@ public class prog8Parser extends Parser {
setState(239); setState(239);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
setState(240); setState(240);
((ExpressionContext)_localctx).bop = match(T__49); ((ExpressionContext)_localctx).bop = match(T__50);
setState(241); setState(241);
((ExpressionContext)_localctx).right = expression(12); ((ExpressionContext)_localctx).right = expression(12);
} }
@ -1471,7 +1471,7 @@ public class prog8Parser extends Parser {
setState(242); setState(242);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
setState(243); setState(243);
((ExpressionContext)_localctx).bop = match(T__50); ((ExpressionContext)_localctx).bop = match(T__51);
setState(244); setState(244);
((ExpressionContext)_localctx).right = expression(11); ((ExpressionContext)_localctx).right = expression(11);
} }
@ -1485,7 +1485,7 @@ public class prog8Parser extends Parser {
setState(245); setState(245);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
setState(246); setState(246);
match(T__51); match(T__52);
setState(247); setState(247);
((ExpressionContext)_localctx).rangeto = expression(10); ((ExpressionContext)_localctx).rangeto = expression(10);
} }
@ -1499,7 +1499,7 @@ public class prog8Parser extends Parser {
setState(248); setState(248);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
setState(249); setState(249);
((ExpressionContext)_localctx).bop = match(T__52); ((ExpressionContext)_localctx).bop = match(T__53);
setState(250); setState(250);
((ExpressionContext)_localctx).right = expression(9); ((ExpressionContext)_localctx).right = expression(9);
} }
@ -1513,7 +1513,7 @@ public class prog8Parser extends Parser {
setState(251); setState(251);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
setState(252); setState(252);
((ExpressionContext)_localctx).bop = match(T__53); ((ExpressionContext)_localctx).bop = match(T__54);
setState(253); setState(253);
((ExpressionContext)_localctx).right = expression(8); ((ExpressionContext)_localctx).right = expression(8);
} }
@ -1527,7 +1527,7 @@ public class prog8Parser extends Parser {
setState(254); setState(254);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
setState(255); setState(255);
((ExpressionContext)_localctx).bop = match(T__54); ((ExpressionContext)_localctx).bop = match(T__55);
setState(256); setState(256);
((ExpressionContext)_localctx).right = expression(7); ((ExpressionContext)_localctx).right = expression(7);
} }
@ -1606,7 +1606,7 @@ public class prog8Parser extends Parser {
setState(270); setState(270);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__35) | (1L << T__37) | (1L << T__38) | (1L << T__55) | (1L << T__58) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__35) | (1L << T__37) | (1L << T__38) | (1L << T__56) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
{ {
setState(269); setState(269);
expression_list(); expression_list();
@ -1672,7 +1672,7 @@ public class prog8Parser extends Parser {
setState(280); setState(280);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__35) | (1L << T__37) | (1L << T__38) | (1L << T__55) | (1L << T__58) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__35) | (1L << T__37) | (1L << T__38) | (1L << T__56) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
{ {
setState(279); setState(279);
expression_list(); expression_list();
@ -1762,7 +1762,7 @@ public class prog8Parser extends Parser {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(292); setState(292);
match(T__56); match(T__57);
setState(294); setState(294);
_errHandler.sync(this); _errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) {
@ -1844,7 +1844,7 @@ public class prog8Parser extends Parser {
{ {
{ {
setState(299); setState(299);
match(T__57); match(T__58);
setState(300); setState(300);
match(NAME); match(NAME);
} }
@ -1886,7 +1886,7 @@ public class prog8Parser extends Parser {
{ {
setState(305); setState(305);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (T__58 - 59)) | (1L << (T__59 - 59)) | (1L << (T__60 - 59)) | (1L << (T__61 - 59)) | (1L << (T__62 - 59)) | (1L << (T__63 - 59)))) != 0)) ) { if ( !(((((_la - 60)) & ~0x3f) == 0 && ((1L << (_la - 60)) & ((1L << (T__59 - 60)) | (1L << (T__60 - 60)) | (1L << (T__61 - 60)) | (1L << (T__62 - 60)) | (1L << (T__63 - 60)) | (1L << (T__64 - 60)))) != 0)) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
} }
else { else {
@ -1923,7 +1923,7 @@ public class prog8Parser extends Parser {
{ {
setState(307); setState(307);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)))) != 0)) ) { if ( !(((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__67 - 66)) | (1L << (T__68 - 66)))) != 0)) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
} }
else { else {
@ -1968,7 +1968,7 @@ public class prog8Parser extends Parser {
setState(309); setState(309);
((IntegerliteralContext)_localctx).intpart = _input.LT(1); ((IntegerliteralContext)_localctx).intpart = _input.LT(1);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(((((_la - 93)) & ~0x3f) == 0 && ((1L << (_la - 93)) & ((1L << (DEC_INTEGER - 93)) | (1L << (HEX_INTEGER - 93)) | (1L << (BIN_INTEGER - 93)))) != 0)) ) { if ( !(((((_la - 94)) & ~0x3f) == 0 && ((1L << (_la - 94)) & ((1L << (DEC_INTEGER - 94)) | (1L << (HEX_INTEGER - 94)) | (1L << (BIN_INTEGER - 94)))) != 0)) ) {
((IntegerliteralContext)_localctx).intpart = (Token)_errHandler.recoverInline(this); ((IntegerliteralContext)_localctx).intpart = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -2013,7 +2013,7 @@ public class prog8Parser extends Parser {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(313); setState(313);
match(T__68); match(T__69);
} }
} }
catch (RecognitionException re) { catch (RecognitionException re) {
@ -2043,7 +2043,7 @@ public class prog8Parser extends Parser {
{ {
setState(315); setState(315);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(_la==T__69 || _la==T__70) ) { if ( !(_la==T__70 || _la==T__71) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
} }
else { else {
@ -2215,8 +2215,8 @@ public class prog8Parser extends Parser {
integerliteral(); integerliteral();
} }
break; break;
case T__69:
case T__70: case T__70:
case T__71:
enterOuterAlt(_localctx, 2); enterOuterAlt(_localctx, 2);
{ {
setState(333); setState(333);
@ -2274,7 +2274,7 @@ public class prog8Parser extends Parser {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(339); setState(339);
match(T__71); match(T__72);
setState(340); setState(340);
match(INLINEASMBLOCK); match(INLINEASMBLOCK);
} }
@ -2321,7 +2321,7 @@ public class prog8Parser extends Parser {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(342); setState(342);
match(T__72); match(T__73);
setState(343); setState(343);
identifier(); identifier();
setState(344); setState(344);
@ -2339,13 +2339,13 @@ public class prog8Parser extends Parser {
setState(348); setState(348);
match(T__36); match(T__36);
setState(349); setState(349);
match(T__73); match(T__74);
setState(350); setState(350);
match(T__35); match(T__35);
setState(352); setState(352);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & ((1L << (T__58 - 59)) | (1L << (T__59 - 59)) | (1L << (T__60 - 59)) | (1L << (T__61 - 59)) | (1L << (T__62 - 59)) | (1L << (T__63 - 59)) | (1L << (T__64 - 59)) | (1L << (T__65 - 59)) | (1L << (T__66 - 59)) | (1L << (T__67 - 59)) | (1L << (T__76 - 59)))) != 0)) { if (((((_la - 60)) & ~0x3f) == 0 && ((1L << (_la - 60)) & ((1L << (T__59 - 60)) | (1L << (T__60 - 60)) | (1L << (T__61 - 60)) | (1L << (T__62 - 60)) | (1L << (T__63 - 60)) | (1L << (T__64 - 60)) | (1L << (T__65 - 60)) | (1L << (T__66 - 60)) | (1L << (T__67 - 60)) | (1L << (T__68 - 60)) | (1L << (T__77 - 60)))) != 0)) {
{ {
setState(351); setState(351);
sub_returns(); sub_returns();
@ -2363,7 +2363,7 @@ public class prog8Parser extends Parser {
sub_address(); sub_address();
} }
break; break;
case T__74: case T__75:
{ {
{ {
setState(356); setState(356);
@ -2414,13 +2414,13 @@ public class prog8Parser extends Parser {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(361); setState(361);
match(T__74); match(T__75);
setState(362); setState(362);
match(EOL); match(EOL);
setState(367); setState(367);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _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__14) | (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__56) | (1L << T__58) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__77 - 64)) | (1L << (T__79 - 64)) | (1L << (T__80 - 64)) | (1L << (T__81 - 64)) | (1L << (T__82 - 64)) | (1L << (T__83 - 64)) | (1L << (T__84 - 64)) | (1L << (T__85 - 64)) | (1L << (T__86 - 64)) | (1L << (EOL - 64)) | (1L << (NAME - 64)))) != 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__14) | (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__57) | (1L << T__59) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__78 - 64)) | (1L << (T__80 - 64)) | (1L << (T__81 - 64)) | (1L << (T__82 - 64)) | (1L << (T__83 - 64)) | (1L << (T__84 - 64)) | (1L << (T__85 - 64)) | (1L << (T__86 - 64)) | (1L << (T__87 - 64)) | (1L << (EOL - 64)) | (1L << (NAME - 64)))) != 0)) {
{ {
setState(365); setState(365);
_errHandler.sync(this); _errHandler.sync(this);
@ -2444,17 +2444,16 @@ public class prog8Parser extends Parser {
case T__20: case T__20:
case T__21: case T__21:
case T__22: case T__22:
case T__56: case T__57:
case T__58:
case T__59: case T__59:
case T__60: case T__60:
case T__61: case T__61:
case T__62: case T__62:
case T__63: case T__63:
case T__71: case T__64:
case T__72: case T__72:
case T__77: case T__73:
case T__79: case T__78:
case T__80: case T__80:
case T__81: case T__81:
case T__82: case T__82:
@ -2462,6 +2461,7 @@ public class prog8Parser extends Parser {
case T__84: case T__84:
case T__85: case T__85:
case T__86: case T__86:
case T__87:
case NAME: case NAME:
{ {
setState(363); setState(363);
@ -2483,7 +2483,7 @@ public class prog8Parser extends Parser {
_la = _input.LA(1); _la = _input.LA(1);
} }
setState(370); setState(370);
match(T__75); match(T__76);
} }
} }
catch (RecognitionException re) { catch (RecognitionException re) {
@ -2610,21 +2610,21 @@ public class prog8Parser extends Parser {
setState(387); setState(387);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__58:
case T__59: case T__59:
case T__60: case T__60:
case T__61: case T__61:
case T__62: case T__62:
case T__63: case T__63:
case T__64:
{ {
setState(385); setState(385);
register(); register();
} }
break; break;
case T__64:
case T__65: case T__65:
case T__66: case T__66:
case T__67: case T__67:
case T__68:
{ {
setState(386); setState(386);
statusflag(); statusflag();
@ -2667,14 +2667,13 @@ public class prog8Parser extends Parser {
setState(398); setState(398);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__76: case T__77:
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(389); setState(389);
match(T__76); match(T__77);
} }
break; break;
case T__58:
case T__59: case T__59:
case T__60: case T__60:
case T__61: case T__61:
@ -2684,6 +2683,7 @@ public class prog8Parser extends Parser {
case T__65: case T__65:
case T__66: case T__66:
case T__67: case T__67:
case T__68:
enterOuterAlt(_localctx, 2); enterOuterAlt(_localctx, 2);
{ {
{ {
@ -2746,21 +2746,21 @@ public class prog8Parser extends Parser {
setState(402); setState(402);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__58:
case T__59: case T__59:
case T__60: case T__60:
case T__61: case T__61:
case T__62: case T__62:
case T__63: case T__63:
case T__64:
{ {
setState(400); setState(400);
register(); register();
} }
break; break;
case T__64:
case T__65: case T__65:
case T__66: case T__66:
case T__67: case T__67:
case T__68:
{ {
setState(401); setState(401);
statusflag(); statusflag();
@ -2772,10 +2772,10 @@ public class prog8Parser extends Parser {
setState(405); setState(405);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==T__76) { if (_la==T__77) {
{ {
setState(404); setState(404);
match(T__76); match(T__77);
} }
} }
@ -2823,7 +2823,7 @@ public class prog8Parser extends Parser {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(407); setState(407);
match(T__77); match(T__78);
setState(408); setState(408);
match(T__35); match(T__35);
setState(409); setState(409);
@ -2862,17 +2862,16 @@ public class prog8Parser extends Parser {
case T__20: case T__20:
case T__21: case T__21:
case T__22: case T__22:
case T__56: case T__57:
case T__58:
case T__59: case T__59:
case T__60: case T__60:
case T__61: case T__61:
case T__62: case T__62:
case T__63: case T__63:
case T__71: case T__64:
case T__72: case T__72:
case T__77: case T__73:
case T__79: case T__78:
case T__80: case T__80:
case T__81: case T__81:
case T__82: case T__82:
@ -2880,13 +2879,14 @@ public class prog8Parser extends Parser {
case T__84: case T__84:
case T__85: case T__85:
case T__86: case T__86:
case T__87:
case NAME: case NAME:
{ {
setState(414); setState(414);
statement(); statement();
} }
break; break;
case T__74: case T__75:
{ {
setState(415); setState(415);
statement_block(); statement_block();
@ -2908,7 +2908,7 @@ public class prog8Parser extends Parser {
setState(422); setState(422);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==T__78) { if (_la==T__79) {
{ {
setState(421); setState(421);
else_part(); else_part();
@ -2952,7 +2952,7 @@ public class prog8Parser extends Parser {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(426); setState(426);
match(T__78); match(T__79);
setState(428); setState(428);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
@ -2985,17 +2985,16 @@ public class prog8Parser extends Parser {
case T__20: case T__20:
case T__21: case T__21:
case T__22: case T__22:
case T__56: case T__57:
case T__58:
case T__59: case T__59:
case T__60: case T__60:
case T__61: case T__61:
case T__62: case T__62:
case T__63: case T__63:
case T__71: case T__64:
case T__72: case T__72:
case T__77: case T__73:
case T__79: case T__78:
case T__80: case T__80:
case T__81: case T__81:
case T__82: case T__82:
@ -3003,13 +3002,14 @@ public class prog8Parser extends Parser {
case T__84: case T__84:
case T__85: case T__85:
case T__86: case T__86:
case T__87:
case NAME: case NAME:
{ {
setState(430); setState(430);
statement(); statement();
} }
break; break;
case T__74: case T__75:
{ {
setState(431); setState(431);
statement_block(); statement_block();
@ -3095,17 +3095,16 @@ public class prog8Parser extends Parser {
case T__20: case T__20:
case T__21: case T__21:
case T__22: case T__22:
case T__56: case T__57:
case T__58:
case T__59: case T__59:
case T__60: case T__60:
case T__61: case T__61:
case T__62: case T__62:
case T__63: case T__63:
case T__71: case T__64:
case T__72: case T__72:
case T__77: case T__73:
case T__79: case T__78:
case T__80: case T__80:
case T__81: case T__81:
case T__82: case T__82:
@ -3113,13 +3112,14 @@ public class prog8Parser extends Parser {
case T__84: case T__84:
case T__85: case T__85:
case T__86: case T__86:
case T__87:
case NAME: case NAME:
{ {
setState(438); setState(438);
statement(); statement();
} }
break; break;
case T__74: case T__75:
{ {
setState(439); setState(439);
statement_block(); statement_block();
@ -3141,7 +3141,7 @@ public class prog8Parser extends Parser {
setState(446); setState(446);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==T__78) { if (_la==T__79) {
{ {
setState(445); setState(445);
else_part(); else_part();
@ -3179,7 +3179,7 @@ public class prog8Parser extends Parser {
{ {
setState(450); setState(450);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (T__79 - 80)) | (1L << (T__80 - 80)) | (1L << (T__81 - 80)) | (1L << (T__82 - 80)) | (1L << (T__83 - 80)) | (1L << (T__84 - 80)) | (1L << (T__85 - 80)) | (1L << (T__86 - 80)))) != 0)) ) { if ( !(((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (T__80 - 81)) | (1L << (T__81 - 81)) | (1L << (T__82 - 81)) | (1L << (T__83 - 81)) | (1L << (T__84 - 81)) | (1L << (T__85 - 81)) | (1L << (T__86 - 81)) | (1L << (T__87 - 81)))) != 0)) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
} }
else { else {
@ -3240,7 +3240,7 @@ public class prog8Parser extends Parser {
} }
public static final String _serializedATN = public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3d\u01c7\4\2\t\2\4"+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3e\u01c7\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"+ "\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"+ "\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"+ "\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"+
@ -3273,8 +3273,8 @@ public class prog8Parser extends Parser {
"\3,\3-\3-\5-\u01af\n-\3-\3-\5-\u01b3\n-\3.\3.\5.\u01b7\n.\3.\3.\5.\u01bb"+ "\3,\3-\3-\5-\u01af\n-\3-\3-\5-\u01b3\n-\3.\3.\5.\u01b7\n.\3.\3.\5.\u01bb"+
"\n.\3.\5.\u01be\n.\3.\5.\u01c1\n.\3.\3.\3/\3/\3/\2\3&\60\2\4\6\b\n\f\16"+ "\n.\3.\5.\u01be\n.\3.\5.\u01c1\n.\3.\3.\3/\3/\3/\2\3&\60\2\4\6\b\n\f\16"+
"\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\\2\20"+ "\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\\2\20"+
"\3\2\6\16\3\2\23\31\3\2\34#\3\2$%\4\2\3\3()\3\2+,\3\2()\3\2-\60\3\2\61"+ "\3\2\6\16\3\2\23\31\3\2\34#\3\2$%\4\2\3\3()\3\2+-\3\2()\3\2.\61\3\2\62"+
"\62\3\2=B\3\2CF\3\2_a\3\2HI\3\2RY\2\u01ed\2b\3\2\2\2\4i\3\2\2\2\6k\3\2"+ "\63\3\2>C\3\2DG\3\2`b\3\2IJ\3\2SZ\2\u01ed\2b\3\2\2\2\4i\3\2\2\2\6k\3\2"+
"\2\2\b\u0083\3\2\2\2\n\u0085\3\2\2\2\f\u0088\3\2\2\2\16\u008e\3\2\2\2"+ "\2\2\b\u0083\3\2\2\2\n\u0085\3\2\2\2\f\u0088\3\2\2\2\16\u008e\3\2\2\2"+
"\20\u009f\3\2\2\2\22\u00a1\3\2\2\2\24\u00a7\3\2\2\2\26\u00af\3\2\2\2\30"+ "\20\u009f\3\2\2\2\22\u00a1\3\2\2\2\24\u00a7\3\2\2\2\26\u00af\3\2\2\2\30"+
"\u00b2\3\2\2\2\32\u00b5\3\2\2\2\34\u00b7\3\2\2\2\36\u00bf\3\2\2\2 \u00c3"+ "\u00b2\3\2\2\2\32\u00b5\3\2\2\2\34\u00b7\3\2\2\2\36\u00bf\3\2\2\2 \u00c3"+
@ -3284,11 +3284,11 @@ public class prog8Parser extends Parser {
"\2<\u013d\3\2\2\2>\u013f\3\2\2\2@\u014a\3\2\2\2B\u014c\3\2\2\2D\u0153"+ "\2<\u013d\3\2\2\2>\u013f\3\2\2\2@\u014a\3\2\2\2B\u014c\3\2\2\2D\u0153"+
"\3\2\2\2F\u0155\3\2\2\2H\u0158\3\2\2\2J\u016b\3\2\2\2L\u0176\3\2\2\2N"+ "\3\2\2\2F\u0155\3\2\2\2H\u0158\3\2\2\2J\u016b\3\2\2\2L\u0176\3\2\2\2N"+
"\u0179\3\2\2\2P\u0181\3\2\2\2R\u0190\3\2\2\2T\u0194\3\2\2\2V\u0199\3\2"+ "\u0179\3\2\2\2P\u0181\3\2\2\2R\u0190\3\2\2\2T\u0194\3\2\2\2V\u0199\3\2"+
"\2\2X\u01ac\3\2\2\2Z\u01b4\3\2\2\2\\\u01c4\3\2\2\2^a\5\4\3\2_a\7]\2\2"+ "\2\2X\u01ac\3\2\2\2Z\u01b4\3\2\2\2\\\u01c4\3\2\2\2^a\5\4\3\2_a\7^\2\2"+
"`^\3\2\2\2`_\3\2\2\2ad\3\2\2\2b`\3\2\2\2bc\3\2\2\2ce\3\2\2\2db\3\2\2\2"+ "`^\3\2\2\2`_\3\2\2\2ad\3\2\2\2b`\3\2\2\2bc\3\2\2\2ce\3\2\2\2db\3\2\2\2"+
"ef\7\2\2\3f\3\3\2\2\2gj\5\16\b\2hj\5\6\4\2ig\3\2\2\2ih\3\2\2\2j\5\3\2"+ "ef\7\2\2\3f\3\3\2\2\2gj\5\16\b\2hj\5\6\4\2ig\3\2\2\2ih\3\2\2\2j\5\3\2"+
"\2\2kl\7\3\2\2ln\5\60\31\2mo\58\35\2nm\3\2\2\2no\3\2\2\2op\3\2\2\2pq\5"+ "\2\2kl\7\3\2\2ln\5\60\31\2mo\58\35\2nm\3\2\2\2no\3\2\2\2op\3\2\2\2pq\5"+
"J&\2qr\7]\2\2r\7\3\2\2\2s\u0084\5\16\b\2t\u0084\5\24\13\2u\u0084\5\22"+ "J&\2qr\7^\2\2r\7\3\2\2\2s\u0084\5\16\b\2t\u0084\5\24\13\2u\u0084\5\22"+
"\n\2v\u0084\5\26\f\2w\u0084\5\30\r\2x\u0084\5\36\20\2y\u0084\5 \21\2z"+ "\n\2v\u0084\5\26\f\2w\u0084\5\30\r\2x\u0084\5\36\20\2y\u0084\5 \21\2z"+
"\u0084\5\f\7\2{\u0084\5$\23\2|\u0084\5*\26\2}\u0084\5V,\2~\u0084\5Z.\2"+ "\u0084\5\f\7\2{\u0084\5$\23\2|\u0084\5*\26\2}\u0084\5V,\2~\u0084\5Z.\2"+
"\177\u0084\5H%\2\u0080\u0084\5F$\2\u0081\u0084\5\n\6\2\u0082\u0084\5."+ "\177\u0084\5H%\2\u0080\u0084\5F$\2\u0081\u0084\5\n\6\2\u0082\u0084\5."+
@ -3322,7 +3322,7 @@ public class prog8Parser extends Parser {
"\u00c9\3\2\2\2\u00cb#\3\2\2\2\u00cc\u00cd\5\"\22\2\u00cd\u00ce\t\5\2\2"+ "\u00c9\3\2\2\2\u00cb#\3\2\2\2\u00cc\u00cd\5\"\22\2\u00cd\u00ce\t\5\2\2"+
"\u00ce%\3\2\2\2\u00cf\u00d0\b\24\1\2\u00d0\u00d1\7&\2\2\u00d1\u00d2\5"+ "\u00ce%\3\2\2\2\u00cf\u00d0\b\24\1\2\u00d0\u00d1\7&\2\2\u00d1\u00d2\5"+
"&\24\2\u00d2\u00d3\7\'\2\2\u00d3\u00de\3\2\2\2\u00d4\u00de\5(\25\2\u00d5"+ "&\24\2\u00d2\u00d3\7\'\2\2\u00d3\u00de\3\2\2\2\u00d4\u00de\5(\25\2\u00d5"+
"\u00d6\t\6\2\2\u00d6\u00de\5&\24\24\u00d7\u00d8\7:\2\2\u00d8\u00de\5&"+ "\u00d6\t\6\2\2\u00d6\u00de\5&\24\24\u00d7\u00d8\7;\2\2\u00d8\u00de\5&"+
"\24\7\u00d9\u00de\5D#\2\u00da\u00de\5\64\33\2\u00db\u00de\5\60\31\2\u00dc"+ "\24\7\u00d9\u00de\5D#\2\u00da\u00de\5\64\33\2\u00db\u00de\5\60\31\2\u00dc"+
"\u00de\5\62\32\2\u00dd\u00cf\3\2\2\2\u00dd\u00d4\3\2\2\2\u00dd\u00d5\3"+ "\u00de\5\62\32\2\u00dd\u00cf\3\2\2\2\u00dd\u00d4\3\2\2\2\u00dd\u00d5\3"+
"\2\2\2\u00dd\u00d7\3\2\2\2\u00dd\u00d9\3\2\2\2\u00dd\u00da\3\2\2\2\u00dd"+ "\2\2\2\u00dd\u00d7\3\2\2\2\u00dd\u00d9\3\2\2\2\u00dd\u00da\3\2\2\2\u00dd"+
@ -3331,15 +3331,15 @@ public class prog8Parser extends Parser {
"\u00e4\t\7\2\2\u00e4\u0106\5&\24\23\u00e5\u00e6\f\21\2\2\u00e6\u00e7\t"+ "\u00e4\t\7\2\2\u00e4\u0106\5&\24\23\u00e5\u00e6\f\21\2\2\u00e6\u00e7\t"+
"\b\2\2\u00e7\u0106\5&\24\22\u00e8\u00e9\f\20\2\2\u00e9\u00ea\t\t\2\2\u00ea"+ "\b\2\2\u00e7\u0106\5&\24\22\u00e8\u00e9\f\20\2\2\u00e9\u00ea\t\t\2\2\u00ea"+
"\u0106\5&\24\21\u00eb\u00ec\f\17\2\2\u00ec\u00ed\t\n\2\2\u00ed\u0106\5"+ "\u0106\5&\24\21\u00eb\u00ec\f\17\2\2\u00ec\u00ed\t\n\2\2\u00ed\u0106\5"+
"&\24\20\u00ee\u00ef\f\16\2\2\u00ef\u00f0\7\63\2\2\u00f0\u0106\5&\24\17"+ "&\24\20\u00ee\u00ef\f\16\2\2\u00ef\u00f0\7\64\2\2\u00f0\u0106\5&\24\17"+
"\u00f1\u00f2\f\r\2\2\u00f2\u00f3\7\64\2\2\u00f3\u0106\5&\24\16\u00f4\u00f5"+ "\u00f1\u00f2\f\r\2\2\u00f2\u00f3\7\65\2\2\u00f3\u0106\5&\24\16\u00f4\u00f5"+
"\f\f\2\2\u00f5\u00f6\7\65\2\2\u00f6\u0106\5&\24\r\u00f7\u00f8\f\13\2\2"+ "\f\f\2\2\u00f5\u00f6\7\66\2\2\u00f6\u0106\5&\24\r\u00f7\u00f8\f\13\2\2"+
"\u00f8\u00f9\7\66\2\2\u00f9\u0106\5&\24\f\u00fa\u00fb\f\n\2\2\u00fb\u00fc"+ "\u00f8\u00f9\7\67\2\2\u00f9\u0106\5&\24\f\u00fa\u00fb\f\n\2\2\u00fb\u00fc"+
"\7\67\2\2\u00fc\u0106\5&\24\13\u00fd\u00fe\f\t\2\2\u00fe\u00ff\78\2\2"+ "\78\2\2\u00fc\u0106\5&\24\13\u00fd\u00fe\f\t\2\2\u00fe\u00ff\79\2\2\u00ff"+
"\u00ff\u0106\5&\24\n\u0100\u0101\f\b\2\2\u0101\u0102\79\2\2\u0102\u0106"+ "\u0106\5&\24\n\u0100\u0101\f\b\2\2\u0101\u0102\7:\2\2\u0102\u0106\5&\24"+
"\5&\24\t\u0103\u0104\f\26\2\2\u0104\u0106\5\34\17\2\u0105\u00df\3\2\2"+ "\t\u0103\u0104\f\26\2\2\u0104\u0106\5\34\17\2\u0105\u00df\3\2\2\2\u0105"+
"\2\u0105\u00e2\3\2\2\2\u0105\u00e5\3\2\2\2\u0105\u00e8\3\2\2\2\u0105\u00eb"+ "\u00e2\3\2\2\2\u0105\u00e5\3\2\2\2\u0105\u00e8\3\2\2\2\u0105\u00eb\3\2"+
"\3\2\2\2\u0105\u00ee\3\2\2\2\u0105\u00f1\3\2\2\2\u0105\u00f4\3\2\2\2\u0105"+ "\2\2\u0105\u00ee\3\2\2\2\u0105\u00f1\3\2\2\2\u0105\u00f4\3\2\2\2\u0105"+
"\u00f7\3\2\2\2\u0105\u00fa\3\2\2\2\u0105\u00fd\3\2\2\2\u0105\u0100\3\2"+ "\u00f7\3\2\2\2\u0105\u00fa\3\2\2\2\u0105\u00fd\3\2\2\2\u0105\u0100\3\2"+
"\2\2\u0105\u0103\3\2\2\2\u0106\u0109\3\2\2\2\u0107\u0105\3\2\2\2\u0107"+ "\2\2\u0105\u0103\3\2\2\2\u0106\u0109\3\2\2\2\u0107\u0105\3\2\2\2\u0107"+
"\u0108\3\2\2\2\u0108\'\3\2\2\2\u0109\u0107\3\2\2\2\u010a\u010d\5\60\31"+ "\u0108\3\2\2\2\u0108\'\3\2\2\2\u0109\u0107\3\2\2\2\u010a\u010d\5\60\31"+
@ -3352,57 +3352,57 @@ public class prog8Parser extends Parser {
"\2\2\u011c\u011d\7\'\2\2\u011d+\3\2\2\2\u011e\u0123\5&\24\2\u011f\u0120"+ "\2\2\u011c\u011d\7\'\2\2\u011d+\3\2\2\2\u011e\u0123\5&\24\2\u011f\u0120"+
"\7\17\2\2\u0120\u0122\5&\24\2\u0121\u011f\3\2\2\2\u0122\u0125\3\2\2\2"+ "\7\17\2\2\u0120\u0122\5&\24\2\u0121\u011f\3\2\2\2\u0122\u0125\3\2\2\2"+
"\u0123\u0121\3\2\2\2\u0123\u0124\3\2\2\2\u0124-\3\2\2\2\u0125\u0123\3"+ "\u0123\u0121\3\2\2\2\u0123\u0124\3\2\2\2\u0124-\3\2\2\2\u0125\u0123\3"+
"\2\2\2\u0126\u0128\7;\2\2\u0127\u0129\5,\27\2\u0128\u0127\3\2\2\2\u0128"+ "\2\2\2\u0126\u0128\7<\2\2\u0127\u0129\5,\27\2\u0128\u0127\3\2\2\2\u0128"+
"\u0129\3\2\2\2\u0129/\3\2\2\2\u012a\u012b\7^\2\2\u012b\61\3\2\2\2\u012c"+ "\u0129\3\2\2\2\u0129/\3\2\2\2\u012a\u012b\7_\2\2\u012b\61\3\2\2\2\u012c"+
"\u012f\7^\2\2\u012d\u012e\7<\2\2\u012e\u0130\7^\2\2\u012f\u012d\3\2\2"+ "\u012f\7_\2\2\u012d\u012e\7=\2\2\u012e\u0130\7_\2\2\u012f\u012d\3\2\2"+
"\2\u0130\u0131\3\2\2\2\u0131\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132\63"+ "\2\u0130\u0131\3\2\2\2\u0131\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132\63"+
"\3\2\2\2\u0133\u0134\t\13\2\2\u0134\65\3\2\2\2\u0135\u0136\t\f\2\2\u0136"+ "\3\2\2\2\u0133\u0134\t\13\2\2\u0134\65\3\2\2\2\u0135\u0136\t\f\2\2\u0136"+
"\67\3\2\2\2\u0137\u0139\t\r\2\2\u0138\u013a\5:\36\2\u0139\u0138\3\2\2"+ "\67\3\2\2\2\u0137\u0139\t\r\2\2\u0138\u013a\5:\36\2\u0139\u0138\3\2\2"+
"\2\u0139\u013a\3\2\2\2\u013a9\3\2\2\2\u013b\u013c\7G\2\2\u013c;\3\2\2"+ "\2\u0139\u013a\3\2\2\2\u013a9\3\2\2\2\u013b\u013c\7H\2\2\u013c;\3\2\2"+
"\2\u013d\u013e\t\16\2\2\u013e=\3\2\2\2\u013f\u0140\7\32\2\2\u0140\u0145"+ "\2\u013d\u013e\t\16\2\2\u013e=\3\2\2\2\u013f\u0140\7\32\2\2\u0140\u0145"+
"\5&\24\2\u0141\u0142\7\17\2\2\u0142\u0144\5&\24\2\u0143\u0141\3\2\2\2"+ "\5&\24\2\u0141\u0142\7\17\2\2\u0142\u0144\5&\24\2\u0143\u0141\3\2\2\2"+
"\u0144\u0147\3\2\2\2\u0145\u0143\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0148"+ "\u0144\u0147\3\2\2\2\u0145\u0143\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0148"+
"\3\2\2\2\u0147\u0145\3\2\2\2\u0148\u0149\7\33\2\2\u0149?\3\2\2\2\u014a"+ "\3\2\2\2\u0147\u0145\3\2\2\2\u0148\u0149\7\33\2\2\u0149?\3\2\2\2\u014a"+
"\u014b\7c\2\2\u014bA\3\2\2\2\u014c\u014d\7b\2\2\u014dC\3\2\2\2\u014e\u0154"+ "\u014b\7d\2\2\u014bA\3\2\2\2\u014c\u014d\7c\2\2\u014dC\3\2\2\2\u014e\u0154"+
"\58\35\2\u014f\u0154\5<\37\2\u0150\u0154\5> \2\u0151\u0154\5@!\2\u0152"+ "\58\35\2\u014f\u0154\5<\37\2\u0150\u0154\5> \2\u0151\u0154\5@!\2\u0152"+
"\u0154\5B\"\2\u0153\u014e\3\2\2\2\u0153\u014f\3\2\2\2\u0153\u0150\3\2"+ "\u0154\5B\"\2\u0153\u014e\3\2\2\2\u0153\u014f\3\2\2\2\u0153\u0150\3\2"+
"\2\2\u0153\u0151\3\2\2\2\u0153\u0152\3\2\2\2\u0154E\3\2\2\2\u0155\u0156"+ "\2\2\u0153\u0151\3\2\2\2\u0153\u0152\3\2\2\2\u0154E\3\2\2\2\u0155\u0156"+
"\7J\2\2\u0156\u0157\7d\2\2\u0157G\3\2\2\2\u0158\u0159\7K\2\2\u0159\u015a"+ "\7K\2\2\u0156\u0157\7e\2\2\u0157G\3\2\2\2\u0158\u0159\7L\2\2\u0159\u015a"+
"\5\60\31\2\u015a\u015c\7&\2\2\u015b\u015d\5N(\2\u015c\u015b\3\2\2\2\u015c"+ "\5\60\31\2\u015a\u015c\7&\2\2\u015b\u015d\5N(\2\u015c\u015b\3\2\2\2\u015c"+
"\u015d\3\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\7\'\2\2\u015f\u0160\7L"+ "\u015d\3\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\7\'\2\2\u015f\u0160\7M"+
"\2\2\u0160\u0162\7&\2\2\u0161\u0163\5R*\2\u0162\u0161\3\2\2\2\u0162\u0163"+ "\2\2\u0160\u0162\7&\2\2\u0161\u0163\5R*\2\u0162\u0161\3\2\2\2\u0162\u0163"+
"\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0169\7\'\2\2\u0165\u016a\5L\'\2\u0166"+ "\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0169\7\'\2\2\u0165\u016a\5L\'\2\u0166"+
"\u0167\5J&\2\u0167\u0168\7]\2\2\u0168\u016a\3\2\2\2\u0169\u0165\3\2\2"+ "\u0167\5J&\2\u0167\u0168\7^\2\2\u0168\u016a\3\2\2\2\u0169\u0165\3\2\2"+
"\2\u0169\u0166\3\2\2\2\u016aI\3\2\2\2\u016b\u016c\7M\2\2\u016c\u0171\7"+ "\2\u0169\u0166\3\2\2\2\u016aI\3\2\2\2\u016b\u016c\7N\2\2\u016c\u0171\7"+
"]\2\2\u016d\u0170\5\b\5\2\u016e\u0170\7]\2\2\u016f\u016d\3\2\2\2\u016f"+ "^\2\2\u016d\u0170\5\b\5\2\u016e\u0170\7^\2\2\u016f\u016d\3\2\2\2\u016f"+
"\u016e\3\2\2\2\u0170\u0173\3\2\2\2\u0171\u016f\3\2\2\2\u0171\u0172\3\2"+ "\u016e\3\2\2\2\u0170\u0173\3\2\2\2\u0171\u016f\3\2\2\2\u0171\u0172\3\2"+
"\2\2\u0172\u0174\3\2\2\2\u0173\u0171\3\2\2\2\u0174\u0175\7N\2\2\u0175"+ "\2\2\u0172\u0174\3\2\2\2\u0173\u0171\3\2\2\2\u0174\u0175\7O\2\2\u0175"+
"K\3\2\2\2\u0176\u0177\7\20\2\2\u0177\u0178\58\35\2\u0178M\3\2\2\2\u0179"+ "K\3\2\2\2\u0176\u0177\7\20\2\2\u0177\u0178\58\35\2\u0178M\3\2\2\2\u0179"+
"\u017e\5P)\2\u017a\u017b\7\17\2\2\u017b\u017d\5P)\2\u017c\u017a\3\2\2"+ "\u017e\5P)\2\u017a\u017b\7\17\2\2\u017b\u017d\5P)\2\u017c\u017a\3\2\2"+
"\2\u017d\u0180\3\2\2\2\u017e\u017c\3\2\2\2\u017e\u017f\3\2\2\2\u017fO"+ "\2\u017d\u0180\3\2\2\2\u017e\u017c\3\2\2\2\u017e\u017f\3\2\2\2\u017fO"+
"\3\2\2\2\u0180\u017e\3\2\2\2\u0181\u0182\5\60\31\2\u0182\u0185\7\4\2\2"+ "\3\2\2\2\u0180\u017e\3\2\2\2\u0181\u0182\5\60\31\2\u0182\u0185\7\4\2\2"+
"\u0183\u0186\5\64\33\2\u0184\u0186\5\66\34\2\u0185\u0183\3\2\2\2\u0185"+ "\u0183\u0186\5\64\33\2\u0184\u0186\5\66\34\2\u0185\u0183\3\2\2\2\u0185"+
"\u0184\3\2\2\2\u0186Q\3\2\2\2\u0187\u0191\7O\2\2\u0188\u018d\5T+\2\u0189"+ "\u0184\3\2\2\2\u0186Q\3\2\2\2\u0187\u0191\7P\2\2\u0188\u018d\5T+\2\u0189"+
"\u018a\7\17\2\2\u018a\u018c\5T+\2\u018b\u0189\3\2\2\2\u018c\u018f\3\2"+ "\u018a\7\17\2\2\u018a\u018c\5T+\2\u018b\u0189\3\2\2\2\u018c\u018f\3\2"+
"\2\2\u018d\u018b\3\2\2\2\u018d\u018e\3\2\2\2\u018e\u0191\3\2\2\2\u018f"+ "\2\2\u018d\u018b\3\2\2\2\u018d\u018e\3\2\2\2\u018e\u0191\3\2\2\2\u018f"+
"\u018d\3\2\2\2\u0190\u0187\3\2\2\2\u0190\u0188\3\2\2\2\u0191S\3\2\2\2"+ "\u018d\3\2\2\2\u0190\u0187\3\2\2\2\u0190\u0188\3\2\2\2\u0191S\3\2\2\2"+
"\u0192\u0195\5\64\33\2\u0193\u0195\5\66\34\2\u0194\u0192\3\2\2\2\u0194"+ "\u0192\u0195\5\64\33\2\u0193\u0195\5\66\34\2\u0194\u0192\3\2\2\2\u0194"+
"\u0193\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0198\7O\2\2\u0197\u0196\3\2"+ "\u0193\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0198\7P\2\2\u0197\u0196\3\2"+
"\2\2\u0197\u0198\3\2\2\2\u0198U\3\2\2\2\u0199\u019a\7P\2\2\u019a\u019b"+ "\2\2\u0197\u0198\3\2\2\2\u0198U\3\2\2\2\u0199\u019a\7Q\2\2\u019a\u019b"+
"\7&\2\2\u019b\u019c\5&\24\2\u019c\u019e\7\'\2\2\u019d\u019f\7]\2\2\u019e"+ "\7&\2\2\u019b\u019c\5&\24\2\u019c\u019e\7\'\2\2\u019d\u019f\7^\2\2\u019e"+
"\u019d\3\2\2\2\u019e\u019f\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u01a3\5\b"+ "\u019d\3\2\2\2\u019e\u019f\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u01a3\5\b"+
"\5\2\u01a1\u01a3\5J&\2\u01a2\u01a0\3\2\2\2\u01a2\u01a1\3\2\2\2\u01a3\u01a5"+ "\5\2\u01a1\u01a3\5J&\2\u01a2\u01a0\3\2\2\2\u01a2\u01a1\3\2\2\2\u01a3\u01a5"+
"\3\2\2\2\u01a4\u01a6\7]\2\2\u01a5\u01a4\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+ "\3\2\2\2\u01a4\u01a6\7^\2\2\u01a5\u01a4\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+
"\u01a8\3\2\2\2\u01a7\u01a9\5X-\2\u01a8\u01a7\3\2\2\2\u01a8\u01a9\3\2\2"+ "\u01a8\3\2\2\2\u01a7\u01a9\5X-\2\u01a8\u01a7\3\2\2\2\u01a8\u01a9\3\2\2"+
"\2\u01a9\u01aa\3\2\2\2\u01aa\u01ab\7]\2\2\u01abW\3\2\2\2\u01ac\u01ae\7"+ "\2\u01a9\u01aa\3\2\2\2\u01aa\u01ab\7^\2\2\u01abW\3\2\2\2\u01ac\u01ae\7"+
"Q\2\2\u01ad\u01af\7]\2\2\u01ae\u01ad\3\2\2\2\u01ae\u01af\3\2\2\2\u01af"+ "R\2\2\u01ad\u01af\7^\2\2\u01ae\u01ad\3\2\2\2\u01ae\u01af\3\2\2\2\u01af"+
"\u01b2\3\2\2\2\u01b0\u01b3\5\b\5\2\u01b1\u01b3\5J&\2\u01b2\u01b0\3\2\2"+ "\u01b2\3\2\2\2\u01b0\u01b3\5\b\5\2\u01b1\u01b3\5J&\2\u01b2\u01b0\3\2\2"+
"\2\u01b2\u01b1\3\2\2\2\u01b3Y\3\2\2\2\u01b4\u01b6\5\\/\2\u01b5\u01b7\7"+ "\2\u01b2\u01b1\3\2\2\2\u01b3Y\3\2\2\2\u01b4\u01b6\5\\/\2\u01b5\u01b7\7"+
"]\2\2\u01b6\u01b5\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8"+ "^\2\2\u01b6\u01b5\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8"+
"\u01bb\5\b\5\2\u01b9\u01bb\5J&\2\u01ba\u01b8\3\2\2\2\u01ba\u01b9\3\2\2"+ "\u01bb\5\b\5\2\u01b9\u01bb\5J&\2\u01ba\u01b8\3\2\2\2\u01ba\u01b9\3\2\2"+
"\2\u01bb\u01bd\3\2\2\2\u01bc\u01be\7]\2\2\u01bd\u01bc\3\2\2\2\u01bd\u01be"+ "\2\u01bb\u01bd\3\2\2\2\u01bc\u01be\7^\2\2\u01bd\u01bc\3\2\2\2\u01bd\u01be"+
"\3\2\2\2\u01be\u01c0\3\2\2\2\u01bf\u01c1\5X-\2\u01c0\u01bf\3\2\2\2\u01c0"+ "\3\2\2\2\u01be\u01c0\3\2\2\2\u01bf\u01c1\5X-\2\u01c0\u01bf\3\2\2\2\u01c0"+
"\u01c1\3\2\2\2\u01c1\u01c2\3\2\2\2\u01c2\u01c3\7]\2\2\u01c3[\3\2\2\2\u01c4"+ "\u01c1\3\2\2\2\u01c1\u01c2\3\2\2\2\u01c2\u01c3\7^\2\2\u01c3[\3\2\2\2\u01c4"+
"\u01c5\t\17\2\2\u01c5]\3\2\2\2\62`bin\u0083\u008c\u0090\u0097\u009a\u009f"+ "\u01c5\t\17\2\2\u01c5]\3\2\2\2\62`bin\u0083\u008c\u0090\u0097\u009a\u009f"+
"\u00a3\u00a9\u00bb\u00ca\u00dd\u0105\u0107\u010c\u0110\u0116\u011a\u0123"+ "\u00a3\u00a9\u00bb\u00ca\u00dd\u0105\u0107\u010c\u0110\u0116\u011a\u0123"+
"\u0128\u0131\u0139\u0145\u0153\u015c\u0162\u0169\u016f\u0171\u017e\u0185"+ "\u0128\u0131\u0139\u0145\u0153\u015c\u0162\u0169\u016f\u0171\u017e\u0185"+

View File

@ -9,8 +9,7 @@ import java.io.PrintWriter
import java.util.* import java.util.*
import java.util.regex.Pattern import java.util.regex.Pattern
import javax.swing.Timer import javax.swing.Timer
import kotlin.math.max import kotlin.math.*
import kotlin.math.pow
import kotlin.system.exitProcess import kotlin.system.exitProcess
enum class Opcode { enum class Opcode {
@ -34,6 +33,7 @@ enum class Opcode {
SUB, SUB,
MUL, MUL,
DIV, DIV,
REMAINDER,
POW, POW,
NEG, NEG,
SHL, SHL,
@ -308,6 +308,13 @@ class Value(val type: DataType, private val numericvalue: Number?, val stringval
return Value(type, result) return Value(type, result)
} }
fun remainder(other: Value): Value? {
val v1 = numericValue()
val v2 = other.numericValue()
val result = v1.toDouble() % v2.toDouble()
return Value(type, result)
}
fun pow(other: Value): Value { fun pow(other: Value): Value {
val v1 = numericValue() val v1 = numericValue()
val v2 = other.numericValue() val v2 = other.numericValue()
@ -904,6 +911,10 @@ class StackVm(val traceOutputFile: String?) {
val (top, second) = evalstack.pop2() val (top, second) = evalstack.pop2()
evalstack.push(second.div(top)) evalstack.push(second.div(top))
} }
Opcode.REMAINDER -> {
val (top, second) = evalstack.pop2()
evalstack.push(second.remainder(top))
}
Opcode.POW -> { Opcode.POW -> {
val (top, second) = evalstack.pop2() val (top, second) = evalstack.pop2()
evalstack.push(second.pow(top)) evalstack.push(second.pow(top))
@ -1033,6 +1044,9 @@ class StackVm(val traceOutputFile: String?) {
else -> throw VmExecutionException("cannot get length of $value") else -> throw VmExecutionException("cannot get length of $value")
} }
} }
Syscall.FUNC_SIN -> evalstack.push(Value(DataType.FLOAT, sin(evalstack.pop().numericValue().toDouble())))
Syscall.FUNC_COS -> evalstack.push(Value(DataType.FLOAT, cos(evalstack.pop().numericValue().toDouble())))
Syscall.FUNC_ROUND -> evalstack.push(Value(DataType.WORD, evalstack.pop().numericValue().toDouble().roundToInt()))
// todo: implement remaining functions // todo: implement remaining functions
else -> throw VmExecutionException("unimplemented syscall $syscall") else -> throw VmExecutionException("unimplemented syscall $syscall")
} }

View File

@ -316,9 +316,8 @@ address-of: ``#``
Takes the address of the symbol following it: ``word address = #somevar`` Takes the address of the symbol following it: ``word address = #somevar``
arithmetic: ``+`` ``-`` ``*`` ``/`` ``//`` ``**`` ``%`` arithmetic: ``+`` ``-`` ``*`` ``/`` ``**`` ``%``
``+``, ``-``, ``*``, ``/`` are the familiar arithmetic operations. ``+``, ``-``, ``*``, ``/`` are the familiar arithmetic operations.
``//`` means *integer division* even when the operands are floating point values: ``9.5 // 2.5`` is 3 (and not 3.8)
``**`` is the power operator: ``3 ** 5`` is equal to 3*3*3*3*3 and is 243. ``**`` is the power operator: ``3 ** 5`` is equal to 3*3*3*3*3 and is 243.
``%`` is the remainder operator: ``25 % 7`` is 4. ``%`` is the remainder operator: ``25 % 7`` is 4.
@ -329,7 +328,7 @@ bitwise arithmetic: ``&`` ``|`` ``^`` ``~``
assignment: ``=`` assignment: ``=``
Sets the target on the LHS (left hand side) of the operator to the value of the expression on the RHS (right hand side). Sets the target on the LHS (left hand side) of the operator to the value of the expression on the RHS (right hand side).
augmented assignment: ``+=`` ``-=`` ``*=`` ``/=`` ``//=`` ``**=`` ``&=`` ``|=`` ``^=`` augmented assignment: ``+=`` ``-=`` ``*=`` ``/=`` ``**=`` ``&=`` ``|=`` ``^=``
Syntactic sugar; ``A += X`` is equivalent to ``A = A + X`` Syntactic sugar; ``A += X`` is equivalent to ``A = A + X``
postfix increment and decrement: ``++`` ``--`` postfix increment and decrement: ``++`` ``--``