if statement

This commit is contained in:
Irmen de Jong 2018-08-14 14:33:36 +02:00
parent bd6a05df73
commit 397fdc61cd
11 changed files with 1320 additions and 1058 deletions

View File

@ -256,12 +256,11 @@ using a couple of instructions.
Loops
-----
The *for*-loop is used to iterate over a range of values. Iteration steps by 1,
but you can set it to something else as well.
The *for*-loop is used to iterate over a range of values. Iteration is done in steps of 1, but you can change this.
The *while*-loop is used to repeat a piece of code while a certain condition is still true.
The *repeat--until* loop is used to repeat a piece of code until a certain condition is true.
You can also create loops by using the ``goto`` statement, but this should be avoided.
You can also create loops by using the ``goto`` statement, but this should usually be avoided.
Conditional Execution

View File

@ -273,9 +273,9 @@ Reserved names
The following names are reserved, they have a special meaning::
A X Y ; 6502 hardware registers
AX AY XY ; 16-bit pseudo register pairs
SC SI SZ ; bits of the 6502 hardware status register
A X Y ; 6502 hardware registers
AX AY XY ; 16-bit pseudo register pairs
Pc Pi Pz Pn Pv ; bits of the 6502 hardware status register
Operators
@ -414,7 +414,9 @@ Loops
for loop
^^^^^^^^
@todo::
.. todo:: not implemented yet, for now you can use the if statement with gotos to implement a for-loop.
::
for <loopvar> in <range> [ step <amount> ] {
; do something...
@ -425,7 +427,9 @@ for loop
while loop
^^^^^^^^^^
@todo::
.. todo:: not implemented yet, for now you can use the if statement with gotos to implement a while-loop.
::
while <condition> {
; do something...
@ -434,9 +438,12 @@ while loop
}
repeat--until loop
^^^^^^^^^^^^^^^^^^
@todo::
.. todo:: not implemented yet, for now you can use the if statement with gotos to implement a repeat-loop.
::
repeat {
; do something...
@ -465,26 +472,14 @@ to another piece of code that eventually returns).
conditional execution
^^^^^^^^^^^^^^^^^^^^^
@todo::
With the 'if' / 'else' statement you can execute code depending on the value of a condition::
if <condition> goto <location>
if <condition> then <simple_stateument> [else <simple_statement> ]
if ( <expression> ) <statements> [else <statements> ]
if <condition> {
where <statements> can be just a single statement, or a block, such as this::
if ( <expression> ) {
<statements>
}
[ else {
} else {
<alternative statements>
} ]
condition = arithmetic expression
or logical expression
or comparison expression
or status_register_flags
single_statement = goto, assignment, ...
subblock = '{' statements (but no subroutine definition) '}'
if the single_statement or the subblock is just a single goto,
the efficient *conditional branching instructions* of the CPU will be used.
}

View File

@ -46,11 +46,7 @@ module : (modulestatement | EOL)* EOF ;
modulestatement: directive | block ;
block:
'~' identifier integerliteral? '{' EOL
(statement | EOL)*
'}' EOL
;
block: '~' identifier integerliteral? statement_block EOL ;
statement :
directive
@ -63,6 +59,7 @@ statement :
| unconditionaljump
| postincrdecr
| functioncall_stmt
| if_stmt
| subroutine
| inlineasm
| labeldef
@ -155,7 +152,7 @@ identifier : NAME ;
scoped_identifier : NAME ('.' NAME)+ ;
register : 'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' | 'SC' | 'SI' | 'SZ' ;
register : 'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' | 'Pc' | 'Pi' | 'Pz' | 'Pn' | 'Pv' ;
integerliteral : DEC_INTEGER | HEX_INTEGER | BIN_INTEGER ;
@ -179,21 +176,26 @@ inlineasm : '%asm' INLINEASMBLOCK;
subroutine :
'sub' identifier '(' sub_params? ')' '->' '(' sub_returns? ')' (sub_address | sub_body)
'sub' identifier '(' sub_params? ')' '->' '(' sub_returns? ')' (sub_address | (statement_block EOL))
;
sub_body :
statement_block :
'{' EOL
(statement | EOL) *
'}' EOL
'}'
;
sub_address : '=' integerliteral ;
sub_params : sub_param (',' sub_param)* ;
sub_param: identifier ':' register ;
sub_param: identifier ':' register;
sub_returns : '?' | ( sub_return (',' sub_return)* ) ;
sub_return: register '?'? ;
if_stmt : 'if' '(' expression ')' EOL? (statement | statement_block) EOL? else_part? EOL ; // statement is constrained later
else_part : 'else' EOL? (statement | statement_block) ; // statement is constrained later

View File

@ -5,8 +5,8 @@
~ main {
str name = "?" * 80
str guess = "?" * 80
byte secretnumber = 0
byte attempts_left = 10
byte secretnumber = 0
byte attempts_left = 10
memory word freadstr_arg = $22 ; argument for FREADSTR
@ -39,55 +39,37 @@ start:
c64scr.print_string("I am thinking of a number from 1 to 100!You'll have to guess it!\n")
printloop:
ask_guess:
c64scr.print_string("\nYou have ")
c64scr.print_byte_decimal(attempts_left)
c64scr.print_string(" guess")
if(attempts_left>0) c64scr.print_string("es")
; @todo comparison expression so we can do if attempts_left>0 ...
A = attempts_left
A--
; @todo (conditional): if_zero A goto ask_guess
c64scr.print_string("es")
ask_guess:
c64scr.print_string(" left.\nWhat is your next guess? ")
Y = c64scr.input_chars(guess)
c64.CHROUT("\n")
freadstr_arg = guess
c64.FREADSTR(A)
AY = c64flt.GETADRAY()
A -= secretnumber ; @todo condition so we can do if guess > secretnumber....
; @todo (conditional): if_zero goto correct_guess
; @todo (conditional): if_gt goto too_high
if(A==secretnumber) {
c64scr.print_string("\nThat's my number, impressive!\n")
goto goodbye
}
c64scr.print_string("That is too ")
c64scr.print_string("low!\n")
goto continue
if(A > secretnumber)
c64scr.print_string("low!\n")
else
c64scr.print_string("high!\n")
correct_guess:
c64scr.print_string("\nThat's my number, impressive!\n")
goodbye()
return
too_high:
c64scr.print_string("That is too ")
c64scr.print_string("high!\n")
continue:
attempts_left--
; @todo (conditional): if_zero attempts_left goto game_over
goto printloop
if(attempts_left>0) goto ask_guess
game_over:
c64scr.print_string("\nToo bad! It was: ")
c64scr.print_byte_decimal(secretnumber)
c64.CHROUT("\n")
return goodbye()
goodbye() ; @todo fix subroutine usage tracking, it doesn't register this one
return
sub goodbye ()->() {
goodbye:
c64scr.print_string("\nThanks for playing. Bye!\n")
return
}
}

View File

@ -16,10 +16,34 @@
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
XY = hopla*2+hopla1
A = "derp" * %000100
if (1==1) goto hopla
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=99
} else X=33
if(6==6) {
A=99
} else {
X=33
}
main.foo(1,2,3)
mega:

View File

@ -26,9 +26,11 @@ enum class Register {
AX,
AY,
XY,
SI,
SC,
SZ
PC,
PI,
PZ,
PN,
PV
}
@ -91,6 +93,13 @@ interface IAstProcessor {
fun process(jump: Jump): IStatement {
return jump
}
fun process(ifStatement: IfStatement): IStatement {
ifStatement.condition = ifStatement.condition.process(this)
ifStatement.statements = ifStatement.statements.map { it.process(this) }
ifStatement.elsepart = ifStatement.elsepart?.map { it.process(this) }
return ifStatement
}
}
@ -627,6 +636,22 @@ data class SubroutineReturnvalue(val register: Register, val clobbered: Boolean)
}
data class IfStatement(var condition: IExpression,
var statements: List<IStatement>, var
elsepart: List<IStatement>) : IStatement {
override var position: Position? = null
override var parent: Node? = null
override fun linkParents(parent: Node) {
this.parent = parent
condition.linkParents(this)
statements.forEach { it.linkParents(this) }
elsepart.forEach { it.linkParents(this) }
}
override fun process(processor: IAstProcessor): IStatement = processor.process(this)
}
/***************** Antlr Extension methods to create AST ****************/
@ -663,12 +688,16 @@ private fun il65Parser.ModulestatementContext.toAst(withPosition: Boolean) : ISt
private fun il65Parser.BlockContext.toAst(withPosition: Boolean) : IStatement {
val block= Block(identifier().text,
integerliteral()?.toAst(),
statement().map { it.toAst(withPosition) })
statement_block().toAst(withPosition))
block.position = toPosition(withPosition)
return block
}
private fun il65Parser.Statement_blockContext.toAst(withPosition: Boolean): List<IStatement>
= statement().map { it.toAst(withPosition) }
private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatement {
val vardecl = vardecl()
if(vardecl!=null) {
@ -749,6 +778,12 @@ private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatemen
val jump = unconditionaljump()?.toAst(withPosition)
if(jump!=null) return jump
val fcall = functioncall_stmt()?.toAst(withPosition)
if(fcall!=null) return fcall
val ifstmt = if_stmt()?.toAst(withPosition)
if(ifstmt!=null) return ifstmt
val returnstmt = returnstmt()?.toAst(withPosition)
if(returnstmt!=null) return returnstmt
@ -758,13 +793,9 @@ private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatemen
val asm = inlineasm()?.toAst(withPosition)
if(asm!=null) return asm
val fcall = functioncall_stmt()?.toAst(withPosition)
if(fcall!=null) return fcall
throw UnsupportedOperationException(text)
}
private fun il65Parser.Functioncall_stmtContext.toAst(withPosition: Boolean): IStatement {
val location =
if(identifier()!=null) identifier()?.toAst(withPosition)
@ -828,7 +859,7 @@ private fun il65Parser.SubroutineContext.toAst(withPosition: Boolean) : Subrouti
if(sub_params()==null) emptyList() else sub_params().toAst(),
if(sub_returns()==null) emptyList() else sub_returns().toAst(),
sub_address()?.integerliteral()?.toAst(),
if(sub_body()==null) emptyList() else sub_body().statement().map {it.toAst(withPosition)})
if(statement_block()==null) emptyList() else statement_block().toAst(withPosition))
sub.position = toPosition(withPosition)
return sub
}
@ -989,3 +1020,16 @@ private fun il65Parser.BooleanliteralContext.toAst() = when(text) {
private fun il65Parser.ArrayliteralContext.toAst(withPosition: Boolean) =
expression().map { it.toAst(withPosition) }
private fun il65Parser.If_stmtContext.toAst(withPosition: Boolean): IfStatement {
val condition = expression().toAst(withPosition)
val statements = statement_block()?.toAst(withPosition) ?: listOf(statement().toAst(withPosition))
val elsepart = else_part()?.toAst(withPosition) ?: emptyList()
val result = IfStatement(condition, statements, elsepart)
result.position = toPosition(withPosition)
return result
}
private fun il65Parser.Else_partContext.toAst(withPosition: Boolean): List<IStatement> {
return statement_block()?.toAst(withPosition) ?: listOf(statement().toAst(withPosition))
}

View File

@ -81,97 +81,105 @@ T__79=80
T__80=81
T__81=82
T__82=83
LINECOMMENT=84
COMMENT=85
WS=86
EOL=87
NAME=88
DEC_INTEGER=89
HEX_INTEGER=90
BIN_INTEGER=91
FLOAT_NUMBER=92
STRING=93
INLINEASMBLOCK=94
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
BIN_INTEGER=95
FLOAT_NUMBER=96
STRING=97
INLINEASMBLOCK=98
'~'=1
'{'=2
'}'=3
':'=4
'goto'=5
'%output'=6
'%launcher'=7
'%zp'=8
'%address'=9
'%import'=10
'%breakpoint'=11
'%asminclude'=12
'%asmbinary'=13
'%option'=14
','=15
'='=16
'const'=17
'memory'=18
'byte'=19
'word'=20
'float'=21
'str'=22
'str_p'=23
'str_s'=24
'str_ps'=25
'['=26
']'=27
'+='=28
'-='=29
'/='=30
'*='=31
'**='=32
'<<='=33
'>>='=34
'<<@='=35
'>>@='=36
'&='=37
'|='=38
'^='=39
'++'=40
'--'=41
'('=42
')'=43
'+'=44
'-'=45
'**'=46
'*'=47
'/'=48
'<<'=49
'>>'=50
'<<@'=51
'>>@'=52
'<'=53
'>'=54
'<='=55
'>='=56
'=='=57
'!='=58
'&'=59
'^'=60
'|'=61
'and'=62
'or'=63
'xor'=64
'not'=65
'to'=66
'return'=67
'.'=68
'A'=69
'X'=70
'Y'=71
'AX'=72
'AY'=73
'XY'=74
'SC'=75
'SI'=76
'SZ'=77
':'=2
'goto'=3
'%output'=4
'%launcher'=5
'%zp'=6
'%address'=7
'%import'=8
'%breakpoint'=9
'%asminclude'=10
'%asmbinary'=11
'%option'=12
','=13
'='=14
'const'=15
'memory'=16
'byte'=17
'word'=18
'float'=19
'str'=20
'str_p'=21
'str_s'=22
'str_ps'=23
'['=24
']'=25
'+='=26
'-='=27
'/='=28
'*='=29
'**='=30
'<<='=31
'>>='=32
'<<@='=33
'>>@='=34
'&='=35
'|='=36
'^='=37
'++'=38
'--'=39
'('=40
')'=41
'+'=42
'-'=43
'**'=44
'*'=45
'/'=46
'<<'=47
'>>'=48
'<<@'=49
'>>@'=50
'<'=51
'>'=52
'<='=53
'>='=54
'=='=55
'!='=56
'&'=57
'^'=58
'|'=59
'and'=60
'or'=61
'xor'=62
'not'=63
'to'=64
'return'=65
'.'=66
'A'=67
'X'=68
'Y'=69
'AX'=70
'AY'=71
'XY'=72
'Pc'=73
'Pi'=74
'Pz'=75
'Pn'=76
'Pv'=77
'true'=78
'false'=79
'%asm'=80
'sub'=81
'->'=82
'?'=83
'{'=83
'}'=84
'?'=85
'if'=86
'else'=87

View File

@ -28,9 +28,9 @@ public class il65Lexer extends Lexer {
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
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__80=81, T__81=82, T__82=83, LINECOMMENT=84, COMMENT=85, WS=86, EOL=87,
NAME=88, DEC_INTEGER=89, HEX_INTEGER=90, BIN_INTEGER=91, FLOAT_NUMBER=92,
STRING=93, INLINEASMBLOCK=94;
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,
BIN_INTEGER=95, FLOAT_NUMBER=96, STRING=97, INLINEASMBLOCK=98;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@ -50,23 +50,23 @@ public class il65Lexer extends Lexer {
"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__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80",
"T__81", "T__82", "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ",
"STRING", "INLINEASMBLOCK"
"T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "LINECOMMENT", "COMMENT",
"WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK"
};
private static final String[] _LITERAL_NAMES = {
null, "'~'", "'{'", "'}'", "':'", "'goto'", "'%output'", "'%launcher'",
"'%zp'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'",
"'%asmbinary'", "'%option'", "','", "'='", "'const'", "'memory'", "'byte'",
"'word'", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['",
"']'", "'+='", "'-='", "'/='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='",
"'>>@='", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'",
"'-'", "'**'", "'*'", "'/'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'",
"'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'and'", "'or'",
"'xor'", "'not'", "'to'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'",
"'AY'", "'XY'", "'SC'", "'SI'", "'SZ'", "'true'", "'false'", "'%asm'",
"'sub'", "'->'", "'?'"
null, "'~'", "':'", "'goto'", "'%output'", "'%launcher'", "'%zp'", "'%address'",
"'%import'", "'%breakpoint'", "'%asminclude'", "'%asmbinary'", "'%option'",
"','", "'='", "'const'", "'memory'", "'byte'", "'word'", "'float'", "'str'",
"'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", "'-='", "'/='",
"'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'>>@='", "'&='", "'|='",
"'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'",
"'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='", "'>='", "'=='",
"'!='", "'&'", "'^'", "'|'", "'and'", "'or'", "'xor'", "'not'", "'to'",
"'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'",
"'Pi'", "'Pz'", "'Pn'", "'Pv'", "'true'", "'false'", "'%asm'", "'sub'",
"'->'", "'{'", "'}'", "'?'", "'if'", "'else'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
@ -76,8 +76,9 @@ public class il65Lexer 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,
"LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER",
"BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK"
null, null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME",
"DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING",
"INLINEASMBLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -139,10 +140,10 @@ public class il65Lexer extends Lexer {
@Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) {
case 94:
case 98:
STRING_action((RuleContext)_localctx, actionIndex);
break;
case 95:
case 99:
INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex);
break;
}
@ -171,7 +172,7 @@ public class il65Lexer extends Lexer {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2`\u027a\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2d\u0290\b\1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -182,206 +183,213 @@ public class il65Lexer 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"+
"\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"+
"`\t`\4a\ta\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7"+
"\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3"+
"\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13"+
"\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3"+
"\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3"+
"\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3"+
"\20\3\20\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3"+
"\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\26\3"+
"\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3"+
"\30\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+
"\33\3\33\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 "+
"\3 \3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3%\3%\3%\3"+
"%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3*\3*\3+\3+\3,\3,\3-\3"+
"-\3.\3.\3/\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64"+
"\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\66\3\66\3\67\3\67\38\38\38\39\3"+
"9\39\3:\3:\3:\3;\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3?\3?\3@\3@\3@\3A\3A\3"+
"A\3A\3B\3B\3B\3B\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3F\3F\3G\3G\3H\3"+
"H\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3O\3O\3O\3O\3"+
"O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3S\3S\3S\3T\3T\3U\3U\7"+
"U\u0211\nU\fU\16U\u0214\13U\3U\3U\3U\3U\3V\3V\7V\u021c\nV\fV\16V\u021f"+
"\13V\3V\3V\3W\3W\3W\3W\3X\6X\u0228\nX\rX\16X\u0229\3Y\3Y\7Y\u022e\nY\f"+
"Y\16Y\u0231\13Y\3Z\3Z\3Z\6Z\u0236\nZ\rZ\16Z\u0237\5Z\u023a\nZ\3[\3[\6"+
"[\u023e\n[\r[\16[\u023f\3\\\3\\\6\\\u0244\n\\\r\\\16\\\u0245\3]\3]\3]"+
"\5]\u024b\n]\3]\5]\u024e\n]\3^\6^\u0251\n^\r^\16^\u0252\3^\3^\6^\u0257"+
"\n^\r^\16^\u0258\5^\u025b\n^\3_\3_\3_\3_\5_\u0261\n_\3`\3`\3`\7`\u0266"+
"\n`\f`\16`\u0269\13`\3`\3`\3`\3a\3a\3a\3a\6a\u0272\na\ra\16a\u0273\3a"+
"\3a\3a\3a\3a\3\u0273\2b\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f"+
"\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63"+
"\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62"+
"c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087"+
"E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009b"+
"O\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00af"+
"Y\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb\2\u00bd\2\u00bf_\u00c1`\3"+
"\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;CHc"+
"h\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u0288\2\3\3\2\2\2\2\5\3\2\2\2\2"+
"\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2"+
"\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2"+
"\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+
"\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+
"\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+
"\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+
"M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3"+
"\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2"+
"\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2"+
"s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177"+
"\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2"+
"\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091"+
"\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2"+
"\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3"+
"\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2"+
"\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5"+
"\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2"+
"\2\3\u00c3\3\2\2\2\5\u00c5\3\2\2\2\7\u00c7\3\2\2\2\t\u00c9\3\2\2\2\13"+
"\u00cb\3\2\2\2\r\u00d0\3\2\2\2\17\u00d8\3\2\2\2\21\u00e2\3\2\2\2\23\u00e6"+
"\3\2\2\2\25\u00ef\3\2\2\2\27\u00f7\3\2\2\2\31\u0103\3\2\2\2\33\u010f\3"+
"\2\2\2\35\u011a\3\2\2\2\37\u0122\3\2\2\2!\u0124\3\2\2\2#\u0126\3\2\2\2"+
"%\u012c\3\2\2\2\'\u0133\3\2\2\2)\u0138\3\2\2\2+\u013d\3\2\2\2-\u0143\3"+
"\2\2\2/\u0147\3\2\2\2\61\u014d\3\2\2\2\63\u0153\3\2\2\2\65\u015a\3\2\2"+
"\2\67\u015c\3\2\2\29\u015e\3\2\2\2;\u0161\3\2\2\2=\u0164\3\2\2\2?\u0167"+
"\3\2\2\2A\u016a\3\2\2\2C\u016e\3\2\2\2E\u0172\3\2\2\2G\u0176\3\2\2\2I"+
"\u017b\3\2\2\2K\u0180\3\2\2\2M\u0183\3\2\2\2O\u0186\3\2\2\2Q\u0189\3\2"+
"\2\2S\u018c\3\2\2\2U\u018f\3\2\2\2W\u0191\3\2\2\2Y\u0193\3\2\2\2[\u0195"+
"\3\2\2\2]\u0197\3\2\2\2_\u019a\3\2\2\2a\u019c\3\2\2\2c\u019e\3\2\2\2e"+
"\u01a1\3\2\2\2g\u01a4\3\2\2\2i\u01a8\3\2\2\2k\u01ac\3\2\2\2m\u01ae\3\2"+
"\2\2o\u01b0\3\2\2\2q\u01b3\3\2\2\2s\u01b6\3\2\2\2u\u01b9\3\2\2\2w\u01bc"+
"\3\2\2\2y\u01be\3\2\2\2{\u01c0\3\2\2\2}\u01c2\3\2\2\2\177\u01c6\3\2\2"+
"\2\u0081\u01c9\3\2\2\2\u0083\u01cd\3\2\2\2\u0085\u01d1\3\2\2\2\u0087\u01d4"+
"\3\2\2\2\u0089\u01db\3\2\2\2\u008b\u01dd\3\2\2\2\u008d\u01df\3\2\2\2\u008f"+
"\u01e1\3\2\2\2\u0091\u01e3\3\2\2\2\u0093\u01e6\3\2\2\2\u0095\u01e9\3\2"+
"\2\2\u0097\u01ec\3\2\2\2\u0099\u01ef\3\2\2\2\u009b\u01f2\3\2\2\2\u009d"+
"\u01f5\3\2\2\2\u009f\u01fa\3\2\2\2\u00a1\u0200\3\2\2\2\u00a3\u0205\3\2"+
"\2\2\u00a5\u0209\3\2\2\2\u00a7\u020c\3\2\2\2\u00a9\u020e\3\2\2\2\u00ab"+
"\u0219\3\2\2\2\u00ad\u0222\3\2\2\2\u00af\u0227\3\2\2\2\u00b1\u022b\3\2"+
"\2\2\u00b3\u0239\3\2\2\2\u00b5\u023b\3\2\2\2\u00b7\u0241\3\2\2\2\u00b9"+
"\u0247\3\2\2\2\u00bb\u0250\3\2\2\2\u00bd\u0260\3\2\2\2\u00bf\u0262\3\2"+
"\2\2\u00c1\u026d\3\2\2\2\u00c3\u00c4\7\u0080\2\2\u00c4\4\3\2\2\2\u00c5"+
"\u00c6\7}\2\2\u00c6\6\3\2\2\2\u00c7\u00c8\7\177\2\2\u00c8\b\3\2\2\2\u00c9"+
"\u00ca\7<\2\2\u00ca\n\3\2\2\2\u00cb\u00cc\7i\2\2\u00cc\u00cd\7q\2\2\u00cd"+
"\u00ce\7v\2\2\u00ce\u00cf\7q\2\2\u00cf\f\3\2\2\2\u00d0\u00d1\7\'\2\2\u00d1"+
"\u00d2\7q\2\2\u00d2\u00d3\7w\2\2\u00d3\u00d4\7v\2\2\u00d4\u00d5\7r\2\2"+
"\u00d5\u00d6\7w\2\2\u00d6\u00d7\7v\2\2\u00d7\16\3\2\2\2\u00d8\u00d9\7"+
"\'\2\2\u00d9\u00da\7n\2\2\u00da\u00db\7c\2\2\u00db\u00dc\7w\2\2\u00dc"+
"\u00dd\7p\2\2\u00dd\u00de\7e\2\2\u00de\u00df\7j\2\2\u00df\u00e0\7g\2\2"+
"\u00e0\u00e1\7t\2\2\u00e1\20\3\2\2\2\u00e2\u00e3\7\'\2\2\u00e3\u00e4\7"+
"|\2\2\u00e4\u00e5\7r\2\2\u00e5\22\3\2\2\2\u00e6\u00e7\7\'\2\2\u00e7\u00e8"+
"\7c\2\2\u00e8\u00e9\7f\2\2\u00e9\u00ea\7f\2\2\u00ea\u00eb\7t\2\2\u00eb"+
"\u00ec\7g\2\2\u00ec\u00ed\7u\2\2\u00ed\u00ee\7u\2\2\u00ee\24\3\2\2\2\u00ef"+
"\u00f0\7\'\2\2\u00f0\u00f1\7k\2\2\u00f1\u00f2\7o\2\2\u00f2\u00f3\7r\2"+
"\2\u00f3\u00f4\7q\2\2\u00f4\u00f5\7t\2\2\u00f5\u00f6\7v\2\2\u00f6\26\3"+
"\2\2\2\u00f7\u00f8\7\'\2\2\u00f8\u00f9\7d\2\2\u00f9\u00fa\7t\2\2\u00fa"+
"\u00fb\7g\2\2\u00fb\u00fc\7c\2\2\u00fc\u00fd\7m\2\2\u00fd\u00fe\7r\2\2"+
"\u00fe\u00ff\7q\2\2\u00ff\u0100\7k\2\2\u0100\u0101\7p\2\2\u0101\u0102"+
"\7v\2\2\u0102\30\3\2\2\2\u0103\u0104\7\'\2\2\u0104\u0105\7c\2\2\u0105"+
"\u0106\7u\2\2\u0106\u0107\7o\2\2\u0107\u0108\7k\2\2\u0108\u0109\7p\2\2"+
"\u0109\u010a\7e\2\2\u010a\u010b\7n\2\2\u010b\u010c\7w\2\2\u010c\u010d"+
"\7f\2\2\u010d\u010e\7g\2\2\u010e\32\3\2\2\2\u010f\u0110\7\'\2\2\u0110"+
"\u0111\7c\2\2\u0111\u0112\7u\2\2\u0112\u0113\7o\2\2\u0113\u0114\7d\2\2"+
"\u0114\u0115\7k\2\2\u0115\u0116\7p\2\2\u0116\u0117\7c\2\2\u0117\u0118"+
"\7t\2\2\u0118\u0119\7{\2\2\u0119\34\3\2\2\2\u011a\u011b\7\'\2\2\u011b"+
"\u011c\7q\2\2\u011c\u011d\7r\2\2\u011d\u011e\7v\2\2\u011e\u011f\7k\2\2"+
"\u011f\u0120\7q\2\2\u0120\u0121\7p\2\2\u0121\36\3\2\2\2\u0122\u0123\7"+
".\2\2\u0123 \3\2\2\2\u0124\u0125\7?\2\2\u0125\"\3\2\2\2\u0126\u0127\7"+
"e\2\2\u0127\u0128\7q\2\2\u0128\u0129\7p\2\2\u0129\u012a\7u\2\2\u012a\u012b"+
"\7v\2\2\u012b$\3\2\2\2\u012c\u012d\7o\2\2\u012d\u012e\7g\2\2\u012e\u012f"+
"\7o\2\2\u012f\u0130\7q\2\2\u0130\u0131\7t\2\2\u0131\u0132\7{\2\2\u0132"+
"&\3\2\2\2\u0133\u0134\7d\2\2\u0134\u0135\7{\2\2\u0135\u0136\7v\2\2\u0136"+
"\u0137\7g\2\2\u0137(\3\2\2\2\u0138\u0139\7y\2\2\u0139\u013a\7q\2\2\u013a"+
"\u013b\7t\2\2\u013b\u013c\7f\2\2\u013c*\3\2\2\2\u013d\u013e\7h\2\2\u013e"+
"\u013f\7n\2\2\u013f\u0140\7q\2\2\u0140\u0141\7c\2\2\u0141\u0142\7v\2\2"+
"\u0142,\3\2\2\2\u0143\u0144\7u\2\2\u0144\u0145\7v\2\2\u0145\u0146\7t\2"+
"\2\u0146.\3\2\2\2\u0147\u0148\7u\2\2\u0148\u0149\7v\2\2\u0149\u014a\7"+
"t\2\2\u014a\u014b\7a\2\2\u014b\u014c\7r\2\2\u014c\60\3\2\2\2\u014d\u014e"+
"\7u\2\2\u014e\u014f\7v\2\2\u014f\u0150\7t\2\2\u0150\u0151\7a\2\2\u0151"+
"\u0152\7u\2\2\u0152\62\3\2\2\2\u0153\u0154\7u\2\2\u0154\u0155\7v\2\2\u0155"+
"\u0156\7t\2\2\u0156\u0157\7a\2\2\u0157\u0158\7r\2\2\u0158\u0159\7u\2\2"+
"\u0159\64\3\2\2\2\u015a\u015b\7]\2\2\u015b\66\3\2\2\2\u015c\u015d\7_\2"+
"\2\u015d8\3\2\2\2\u015e\u015f\7-\2\2\u015f\u0160\7?\2\2\u0160:\3\2\2\2"+
"\u0161\u0162\7/\2\2\u0162\u0163\7?\2\2\u0163<\3\2\2\2\u0164\u0165\7\61"+
"\2\2\u0165\u0166\7?\2\2\u0166>\3\2\2\2\u0167\u0168\7,\2\2\u0168\u0169"+
"\7?\2\2\u0169@\3\2\2\2\u016a\u016b\7,\2\2\u016b\u016c\7,\2\2\u016c\u016d"+
"\7?\2\2\u016dB\3\2\2\2\u016e\u016f\7>\2\2\u016f\u0170\7>\2\2\u0170\u0171"+
"\7?\2\2\u0171D\3\2\2\2\u0172\u0173\7@\2\2\u0173\u0174\7@\2\2\u0174\u0175"+
"\7?\2\2\u0175F\3\2\2\2\u0176\u0177\7>\2\2\u0177\u0178\7>\2\2\u0178\u0179"+
"\7B\2\2\u0179\u017a\7?\2\2\u017aH\3\2\2\2\u017b\u017c\7@\2\2\u017c\u017d"+
"\7@\2\2\u017d\u017e\7B\2\2\u017e\u017f\7?\2\2\u017fJ\3\2\2\2\u0180\u0181"+
"\7(\2\2\u0181\u0182\7?\2\2\u0182L\3\2\2\2\u0183\u0184\7~\2\2\u0184\u0185"+
"\7?\2\2\u0185N\3\2\2\2\u0186\u0187\7`\2\2\u0187\u0188\7?\2\2\u0188P\3"+
"\2\2\2\u0189\u018a\7-\2\2\u018a\u018b\7-\2\2\u018bR\3\2\2\2\u018c\u018d"+
"\7/\2\2\u018d\u018e\7/\2\2\u018eT\3\2\2\2\u018f\u0190\7*\2\2\u0190V\3"+
"\2\2\2\u0191\u0192\7+\2\2\u0192X\3\2\2\2\u0193\u0194\7-\2\2\u0194Z\3\2"+
"\2\2\u0195\u0196\7/\2\2\u0196\\\3\2\2\2\u0197\u0198\7,\2\2\u0198\u0199"+
"\7,\2\2\u0199^\3\2\2\2\u019a\u019b\7,\2\2\u019b`\3\2\2\2\u019c\u019d\7"+
"\61\2\2\u019db\3\2\2\2\u019e\u019f\7>\2\2\u019f\u01a0\7>\2\2\u01a0d\3"+
"\2\2\2\u01a1\u01a2\7@\2\2\u01a2\u01a3\7@\2\2\u01a3f\3\2\2\2\u01a4\u01a5"+
"\7>\2\2\u01a5\u01a6\7>\2\2\u01a6\u01a7\7B\2\2\u01a7h\3\2\2\2\u01a8\u01a9"+
"\7@\2\2\u01a9\u01aa\7@\2\2\u01aa\u01ab\7B\2\2\u01abj\3\2\2\2\u01ac\u01ad"+
"\7>\2\2\u01adl\3\2\2\2\u01ae\u01af\7@\2\2\u01afn\3\2\2\2\u01b0\u01b1\7"+
">\2\2\u01b1\u01b2\7?\2\2\u01b2p\3\2\2\2\u01b3\u01b4\7@\2\2\u01b4\u01b5"+
"\7?\2\2\u01b5r\3\2\2\2\u01b6\u01b7\7?\2\2\u01b7\u01b8\7?\2\2\u01b8t\3"+
"\2\2\2\u01b9\u01ba\7#\2\2\u01ba\u01bb\7?\2\2\u01bbv\3\2\2\2\u01bc\u01bd"+
"\7(\2\2\u01bdx\3\2\2\2\u01be\u01bf\7`\2\2\u01bfz\3\2\2\2\u01c0\u01c1\7"+
"~\2\2\u01c1|\3\2\2\2\u01c2\u01c3\7c\2\2\u01c3\u01c4\7p\2\2\u01c4\u01c5"+
"\7f\2\2\u01c5~\3\2\2\2\u01c6\u01c7\7q\2\2\u01c7\u01c8\7t\2\2\u01c8\u0080"+
"\3\2\2\2\u01c9\u01ca\7z\2\2\u01ca\u01cb\7q\2\2\u01cb\u01cc\7t\2\2\u01cc"+
"\u0082\3\2\2\2\u01cd\u01ce\7p\2\2\u01ce\u01cf\7q\2\2\u01cf\u01d0\7v\2"+
"\2\u01d0\u0084\3\2\2\2\u01d1\u01d2\7v\2\2\u01d2\u01d3\7q\2\2\u01d3\u0086"+
"\3\2\2\2\u01d4\u01d5\7t\2\2\u01d5\u01d6\7g\2\2\u01d6\u01d7\7v\2\2\u01d7"+
"\u01d8\7w\2\2\u01d8\u01d9\7t\2\2\u01d9\u01da\7p\2\2\u01da\u0088\3\2\2"+
"\2\u01db\u01dc\7\60\2\2\u01dc\u008a\3\2\2\2\u01dd\u01de\7C\2\2\u01de\u008c"+
"\3\2\2\2\u01df\u01e0\7Z\2\2\u01e0\u008e\3\2\2\2\u01e1\u01e2\7[\2\2\u01e2"+
"\u0090\3\2\2\2\u01e3\u01e4\7C\2\2\u01e4\u01e5\7Z\2\2\u01e5\u0092\3\2\2"+
"\2\u01e6\u01e7\7C\2\2\u01e7\u01e8\7[\2\2\u01e8\u0094\3\2\2\2\u01e9\u01ea"+
"\7Z\2\2\u01ea\u01eb\7[\2\2\u01eb\u0096\3\2\2\2\u01ec\u01ed\7U\2\2\u01ed"+
"\u01ee\7E\2\2\u01ee\u0098\3\2\2\2\u01ef\u01f0\7U\2\2\u01f0\u01f1\7K\2"+
"\2\u01f1\u009a\3\2\2\2\u01f2\u01f3\7U\2\2\u01f3\u01f4\7\\\2\2\u01f4\u009c"+
"\3\2\2\2\u01f5\u01f6\7v\2\2\u01f6\u01f7\7t\2\2\u01f7\u01f8\7w\2\2\u01f8"+
"\u01f9\7g\2\2\u01f9\u009e\3\2\2\2\u01fa\u01fb\7h\2\2\u01fb\u01fc\7c\2"+
"\2\u01fc\u01fd\7n\2\2\u01fd\u01fe\7u\2\2\u01fe\u01ff\7g\2\2\u01ff\u00a0"+
"\3\2\2\2\u0200\u0201\7\'\2\2\u0201\u0202\7c\2\2\u0202\u0203\7u\2\2\u0203"+
"\u0204\7o\2\2\u0204\u00a2\3\2\2\2\u0205\u0206\7u\2\2\u0206\u0207\7w\2"+
"\2\u0207\u0208\7d\2\2\u0208\u00a4\3\2\2\2\u0209\u020a\7/\2\2\u020a\u020b"+
"\7@\2\2\u020b\u00a6\3\2\2\2\u020c\u020d\7A\2\2\u020d\u00a8\3\2\2\2\u020e"+
"\u0212\t\2\2\2\u020f\u0211\t\3\2\2\u0210\u020f\3\2\2\2\u0211\u0214\3\2"+
"\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3\2\2\2\u0213\u0215\3\2\2\2\u0214"+
"\u0212\3\2\2\2\u0215\u0216\5\u00abV\2\u0216\u0217\3\2\2\2\u0217\u0218"+
"\bU\2\2\u0218\u00aa\3\2\2\2\u0219\u021d\7=\2\2\u021a\u021c\n\2\2\2\u021b"+
"\u021a\3\2\2\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021d\u021e\3\2"+
"\2\2\u021e\u0220\3\2\2\2\u021f\u021d\3\2\2\2\u0220\u0221\bV\2\2\u0221"+
"\u00ac\3\2\2\2\u0222\u0223\t\3\2\2\u0223\u0224\3\2\2\2\u0224\u0225\bW"+
"\3\2\u0225\u00ae\3\2\2\2\u0226\u0228\t\2\2\2\u0227\u0226\3\2\2\2\u0228"+
"\u0229\3\2\2\2\u0229\u0227\3\2\2\2\u0229\u022a\3\2\2\2\u022a\u00b0\3\2"+
"\2\2\u022b\u022f\t\4\2\2\u022c\u022e\t\5\2\2\u022d\u022c\3\2\2\2\u022e"+
"\u0231\3\2\2\2\u022f\u022d\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u00b2\3\2"+
"\2\2\u0231\u022f\3\2\2\2\u0232\u023a\4\62;\2\u0233\u0235\4\63;\2\u0234"+
"\u0236\4\62;\2\u0235\u0234\3\2\2\2\u0236\u0237\3\2\2\2\u0237\u0235\3\2"+
"\2\2\u0237\u0238\3\2\2\2\u0238\u023a\3\2\2\2\u0239\u0232\3\2\2\2\u0239"+
"\u0233\3\2\2\2\u023a\u00b4\3\2\2\2\u023b\u023d\7&\2\2\u023c\u023e\t\6"+
"\2\2\u023d\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u023d\3\2\2\2\u023f"+
"\u0240\3\2\2\2\u0240\u00b6\3\2\2\2\u0241\u0243\7\'\2\2\u0242\u0244\4\62"+
"\63\2\u0243\u0242\3\2\2\2\u0244\u0245\3\2\2\2\u0245\u0243\3\2\2\2\u0245"+
"\u0246\3\2\2\2\u0246\u00b8\3\2\2\2\u0247\u024d\5\u00bb^\2\u0248\u024a"+
"\t\7\2\2\u0249\u024b\t\b\2\2\u024a\u0249\3\2\2\2\u024a\u024b\3\2\2\2\u024b"+
"\u024c\3\2\2\2\u024c\u024e\5\u00bb^\2\u024d\u0248\3\2\2\2\u024d\u024e"+
"\3\2\2\2\u024e\u00ba\3\2\2\2\u024f\u0251\4\62;\2\u0250\u024f\3\2\2\2\u0251"+
"\u0252\3\2\2\2\u0252\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u025a\3\2"+
"\2\2\u0254\u0256\7\60\2\2\u0255\u0257\4\62;\2\u0256\u0255\3\2\2\2\u0257"+
"\u0258\3\2\2\2\u0258\u0256\3\2\2\2\u0258\u0259\3\2\2\2\u0259\u025b\3\2"+
"\2\2\u025a\u0254\3\2\2\2\u025a\u025b\3\2\2\2\u025b\u00bc\3\2\2\2\u025c"+
"\u025d\7^\2\2\u025d\u0261\13\2\2\2\u025e\u025f\7^\2\2\u025f\u0261\5\u00af"+
"X\2\u0260\u025c\3\2\2\2\u0260\u025e\3\2\2\2\u0261\u00be\3\2\2\2\u0262"+
"\u0267\7$\2\2\u0263\u0266\5\u00bd_\2\u0264\u0266\n\t\2\2\u0265\u0263\3"+
"\2\2\2\u0265\u0264\3\2\2\2\u0266\u0269\3\2\2\2\u0267\u0265\3\2\2\2\u0267"+
"\u0268\3\2\2\2\u0268\u026a\3\2\2\2\u0269\u0267\3\2\2\2\u026a\u026b\7$"+
"\2\2\u026b\u026c\b`\4\2\u026c\u00c0\3\2\2\2\u026d\u026e\7}\2\2\u026e\u026f"+
"\7}\2\2\u026f\u0271\3\2\2\2\u0270\u0272\13\2\2\2\u0271\u0270\3\2\2\2\u0272"+
"\u0273\3\2\2\2\u0273\u0274\3\2\2\2\u0273\u0271\3\2\2\2\u0274\u0275\3\2"+
"\2\2\u0275\u0276\7\177\2\2\u0276\u0277\7\177\2\2\u0277\u0278\3\2\2\2\u0278"+
"\u0279\ba\5\2\u0279\u00c2\3\2\2\2\25\2\u0212\u021d\u0229\u022f\u0237\u0239"+
"\u023d\u023f\u0245\u024a\u024d\u0252\u0258\u025a\u0260\u0265\u0267\u0273"+
"\6\2\3\2\b\2\2\3`\2\3a\3";
"`\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"+
"\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+
"\6\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t"+
"\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13"+
"\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3"+
"\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\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\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\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\3\26\3\26\3\26\3\26\3"+
"\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3"+
"\31\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3"+
"\36\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3"+
"#\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3"+
"*\3*\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3"+
"\62\3\62\3\62\3\62\3\63\3\63\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\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\3B\3B\3B\3B\3C\3C\3D"+
"\3D\3E\3E\3F\3F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L"+
"\3M\3M\3M\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3R"+
"\3R\3R\3R\3S\3S\3S\3T\3T\3U\3U\3V\3V\3W\3W\3W\3X\3X\3X\3X\3X\3Y\3Y\7Y"+
"\u0227\nY\fY\16Y\u022a\13Y\3Y\3Y\3Y\3Y\3Z\3Z\7Z\u0232\nZ\fZ\16Z\u0235"+
"\13Z\3Z\3Z\3[\3[\3[\3[\3\\\6\\\u023e\n\\\r\\\16\\\u023f\3]\3]\7]\u0244"+
"\n]\f]\16]\u0247\13]\3^\3^\3^\6^\u024c\n^\r^\16^\u024d\5^\u0250\n^\3_"+
"\3_\6_\u0254\n_\r_\16_\u0255\3`\3`\6`\u025a\n`\r`\16`\u025b\3a\3a\3a\5"+
"a\u0261\na\3a\5a\u0264\na\3b\6b\u0267\nb\rb\16b\u0268\3b\3b\6b\u026d\n"+
"b\rb\16b\u026e\5b\u0271\nb\3c\3c\3c\3c\5c\u0277\nc\3d\3d\3d\7d\u027c\n"+
"d\fd\16d\u027f\13d\3d\3d\3d\3e\3e\3e\3e\6e\u0288\ne\re\16e\u0289\3e\3"+
"e\3e\3e\3e\3\u0289\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\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33"+
"\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63"+
"e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089"+
"F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d"+
"P\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1"+
"Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3\2\u00c5"+
"\2\u00c7c\u00c9d\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;"+
"C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u029e\2\3\3\2"+
"\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17"+
"\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2"+
"\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3"+
"\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3"+
"\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2"+
"=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3"+
"\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2"+
"\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2"+
"c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3"+
"\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2"+
"\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3"+
"\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2"+
"\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097"+
"\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2"+
"\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9"+
"\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2"+
"\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb"+
"\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c7\3\2\2"+
"\2\2\u00c9\3\2\2\2\3\u00cb\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\r\u00e6\3\2\2\2\17\u00ea\3\2\2\2\21\u00f3\3"+
"\2\2\2\23\u00fb\3\2\2\2\25\u0107\3\2\2\2\27\u0113\3\2\2\2\31\u011e\3\2"+
"\2\2\33\u0126\3\2\2\2\35\u0128\3\2\2\2\37\u012a\3\2\2\2!\u0130\3\2\2\2"+
"#\u0137\3\2\2\2%\u013c\3\2\2\2\'\u0141\3\2\2\2)\u0147\3\2\2\2+\u014b\3"+
"\2\2\2-\u0151\3\2\2\2/\u0157\3\2\2\2\61\u015e\3\2\2\2\63\u0160\3\2\2\2"+
"\65\u0162\3\2\2\2\67\u0165\3\2\2\29\u0168\3\2\2\2;\u016b\3\2\2\2=\u016e"+
"\3\2\2\2?\u0172\3\2\2\2A\u0176\3\2\2\2C\u017a\3\2\2\2E\u017f\3\2\2\2G"+
"\u0184\3\2\2\2I\u0187\3\2\2\2K\u018a\3\2\2\2M\u018d\3\2\2\2O\u0190\3\2"+
"\2\2Q\u0193\3\2\2\2S\u0195\3\2\2\2U\u0197\3\2\2\2W\u0199\3\2\2\2Y\u019b"+
"\3\2\2\2[\u019e\3\2\2\2]\u01a0\3\2\2\2_\u01a2\3\2\2\2a\u01a5\3\2\2\2c"+
"\u01a8\3\2\2\2e\u01ac\3\2\2\2g\u01b0\3\2\2\2i\u01b2\3\2\2\2k\u01b4\3\2"+
"\2\2m\u01b7\3\2\2\2o\u01ba\3\2\2\2q\u01bd\3\2\2\2s\u01c0\3\2\2\2u\u01c2"+
"\3\2\2\2w\u01c4\3\2\2\2y\u01c6\3\2\2\2{\u01ca\3\2\2\2}\u01cd\3\2\2\2\177"+
"\u01d1\3\2\2\2\u0081\u01d5\3\2\2\2\u0083\u01d8\3\2\2\2\u0085\u01df\3\2"+
"\2\2\u0087\u01e1\3\2\2\2\u0089\u01e3\3\2\2\2\u008b\u01e5\3\2\2\2\u008d"+
"\u01e7\3\2\2\2\u008f\u01ea\3\2\2\2\u0091\u01ed\3\2\2\2\u0093\u01f0\3\2"+
"\2\2\u0095\u01f3\3\2\2\2\u0097\u01f6\3\2\2\2\u0099\u01f9\3\2\2\2\u009b"+
"\u01fc\3\2\2\2\u009d\u01ff\3\2\2\2\u009f\u0204\3\2\2\2\u00a1\u020a\3\2"+
"\2\2\u00a3\u020f\3\2\2\2\u00a5\u0213\3\2\2\2\u00a7\u0216\3\2\2\2\u00a9"+
"\u0218\3\2\2\2\u00ab\u021a\3\2\2\2\u00ad\u021c\3\2\2\2\u00af\u021f\3\2"+
"\2\2\u00b1\u0224\3\2\2\2\u00b3\u022f\3\2\2\2\u00b5\u0238\3\2\2\2\u00b7"+
"\u023d\3\2\2\2\u00b9\u0241\3\2\2\2\u00bb\u024f\3\2\2\2\u00bd\u0251\3\2"+
"\2\2\u00bf\u0257\3\2\2\2\u00c1\u025d\3\2\2\2\u00c3\u0266\3\2\2\2\u00c5"+
"\u0276\3\2\2\2\u00c7\u0278\3\2\2\2\u00c9\u0283\3\2\2\2\u00cb\u00cc\7\u0080"+
"\2\2\u00cc\4\3\2\2\2\u00cd\u00ce\7<\2\2\u00ce\6\3\2\2\2\u00cf\u00d0\7"+
"i\2\2\u00d0\u00d1\7q\2\2\u00d1\u00d2\7v\2\2\u00d2\u00d3\7q\2\2\u00d3\b"+
"\3\2\2\2\u00d4\u00d5\7\'\2\2\u00d5\u00d6\7q\2\2\u00d6\u00d7\7w\2\2\u00d7"+
"\u00d8\7v\2\2\u00d8\u00d9\7r\2\2\u00d9\u00da\7w\2\2\u00da\u00db\7v\2\2"+
"\u00db\n\3\2\2\2\u00dc\u00dd\7\'\2\2\u00dd\u00de\7n\2\2\u00de\u00df\7"+
"c\2\2\u00df\u00e0\7w\2\2\u00e0\u00e1\7p\2\2\u00e1\u00e2\7e\2\2\u00e2\u00e3"+
"\7j\2\2\u00e3\u00e4\7g\2\2\u00e4\u00e5\7t\2\2\u00e5\f\3\2\2\2\u00e6\u00e7"+
"\7\'\2\2\u00e7\u00e8\7|\2\2\u00e8\u00e9\7r\2\2\u00e9\16\3\2\2\2\u00ea"+
"\u00eb\7\'\2\2\u00eb\u00ec\7c\2\2\u00ec\u00ed\7f\2\2\u00ed\u00ee\7f\2"+
"\2\u00ee\u00ef\7t\2\2\u00ef\u00f0\7g\2\2\u00f0\u00f1\7u\2\2\u00f1\u00f2"+
"\7u\2\2\u00f2\20\3\2\2\2\u00f3\u00f4\7\'\2\2\u00f4\u00f5\7k\2\2\u00f5"+
"\u00f6\7o\2\2\u00f6\u00f7\7r\2\2\u00f7\u00f8\7q\2\2\u00f8\u00f9\7t\2\2"+
"\u00f9\u00fa\7v\2\2\u00fa\22\3\2\2\2\u00fb\u00fc\7\'\2\2\u00fc\u00fd\7"+
"d\2\2\u00fd\u00fe\7t\2\2\u00fe\u00ff\7g\2\2\u00ff\u0100\7c\2\2\u0100\u0101"+
"\7m\2\2\u0101\u0102\7r\2\2\u0102\u0103\7q\2\2\u0103\u0104\7k\2\2\u0104"+
"\u0105\7p\2\2\u0105\u0106\7v\2\2\u0106\24\3\2\2\2\u0107\u0108\7\'\2\2"+
"\u0108\u0109\7c\2\2\u0109\u010a\7u\2\2\u010a\u010b\7o\2\2\u010b\u010c"+
"\7k\2\2\u010c\u010d\7p\2\2\u010d\u010e\7e\2\2\u010e\u010f\7n\2\2\u010f"+
"\u0110\7w\2\2\u0110\u0111\7f\2\2\u0111\u0112\7g\2\2\u0112\26\3\2\2\2\u0113"+
"\u0114\7\'\2\2\u0114\u0115\7c\2\2\u0115\u0116\7u\2\2\u0116\u0117\7o\2"+
"\2\u0117\u0118\7d\2\2\u0118\u0119\7k\2\2\u0119\u011a\7p\2\2\u011a\u011b"+
"\7c\2\2\u011b\u011c\7t\2\2\u011c\u011d\7{\2\2\u011d\30\3\2\2\2\u011e\u011f"+
"\7\'\2\2\u011f\u0120\7q\2\2\u0120\u0121\7r\2\2\u0121\u0122\7v\2\2\u0122"+
"\u0123\7k\2\2\u0123\u0124\7q\2\2\u0124\u0125\7p\2\2\u0125\32\3\2\2\2\u0126"+
"\u0127\7.\2\2\u0127\34\3\2\2\2\u0128\u0129\7?\2\2\u0129\36\3\2\2\2\u012a"+
"\u012b\7e\2\2\u012b\u012c\7q\2\2\u012c\u012d\7p\2\2\u012d\u012e\7u\2\2"+
"\u012e\u012f\7v\2\2\u012f \3\2\2\2\u0130\u0131\7o\2\2\u0131\u0132\7g\2"+
"\2\u0132\u0133\7o\2\2\u0133\u0134\7q\2\2\u0134\u0135\7t\2\2\u0135\u0136"+
"\7{\2\2\u0136\"\3\2\2\2\u0137\u0138\7d\2\2\u0138\u0139\7{\2\2\u0139\u013a"+
"\7v\2\2\u013a\u013b\7g\2\2\u013b$\3\2\2\2\u013c\u013d\7y\2\2\u013d\u013e"+
"\7q\2\2\u013e\u013f\7t\2\2\u013f\u0140\7f\2\2\u0140&\3\2\2\2\u0141\u0142"+
"\7h\2\2\u0142\u0143\7n\2\2\u0143\u0144\7q\2\2\u0144\u0145\7c\2\2\u0145"+
"\u0146\7v\2\2\u0146(\3\2\2\2\u0147\u0148\7u\2\2\u0148\u0149\7v\2\2\u0149"+
"\u014a\7t\2\2\u014a*\3\2\2\2\u014b\u014c\7u\2\2\u014c\u014d\7v\2\2\u014d"+
"\u014e\7t\2\2\u014e\u014f\7a\2\2\u014f\u0150\7r\2\2\u0150,\3\2\2\2\u0151"+
"\u0152\7u\2\2\u0152\u0153\7v\2\2\u0153\u0154\7t\2\2\u0154\u0155\7a\2\2"+
"\u0155\u0156\7u\2\2\u0156.\3\2\2\2\u0157\u0158\7u\2\2\u0158\u0159\7v\2"+
"\2\u0159\u015a\7t\2\2\u015a\u015b\7a\2\2\u015b\u015c\7r\2\2\u015c\u015d"+
"\7u\2\2\u015d\60\3\2\2\2\u015e\u015f\7]\2\2\u015f\62\3\2\2\2\u0160\u0161"+
"\7_\2\2\u0161\64\3\2\2\2\u0162\u0163\7-\2\2\u0163\u0164\7?\2\2\u0164\66"+
"\3\2\2\2\u0165\u0166\7/\2\2\u0166\u0167\7?\2\2\u01678\3\2\2\2\u0168\u0169"+
"\7\61\2\2\u0169\u016a\7?\2\2\u016a:\3\2\2\2\u016b\u016c\7,\2\2\u016c\u016d"+
"\7?\2\2\u016d<\3\2\2\2\u016e\u016f\7,\2\2\u016f\u0170\7,\2\2\u0170\u0171"+
"\7?\2\2\u0171>\3\2\2\2\u0172\u0173\7>\2\2\u0173\u0174\7>\2\2\u0174\u0175"+
"\7?\2\2\u0175@\3\2\2\2\u0176\u0177\7@\2\2\u0177\u0178\7@\2\2\u0178\u0179"+
"\7?\2\2\u0179B\3\2\2\2\u017a\u017b\7>\2\2\u017b\u017c\7>\2\2\u017c\u017d"+
"\7B\2\2\u017d\u017e\7?\2\2\u017eD\3\2\2\2\u017f\u0180\7@\2\2\u0180\u0181"+
"\7@\2\2\u0181\u0182\7B\2\2\u0182\u0183\7?\2\2\u0183F\3\2\2\2\u0184\u0185"+
"\7(\2\2\u0185\u0186\7?\2\2\u0186H\3\2\2\2\u0187\u0188\7~\2\2\u0188\u0189"+
"\7?\2\2\u0189J\3\2\2\2\u018a\u018b\7`\2\2\u018b\u018c\7?\2\2\u018cL\3"+
"\2\2\2\u018d\u018e\7-\2\2\u018e\u018f\7-\2\2\u018fN\3\2\2\2\u0190\u0191"+
"\7/\2\2\u0191\u0192\7/\2\2\u0192P\3\2\2\2\u0193\u0194\7*\2\2\u0194R\3"+
"\2\2\2\u0195\u0196\7+\2\2\u0196T\3\2\2\2\u0197\u0198\7-\2\2\u0198V\3\2"+
"\2\2\u0199\u019a\7/\2\2\u019aX\3\2\2\2\u019b\u019c\7,\2\2\u019c\u019d"+
"\7,\2\2\u019dZ\3\2\2\2\u019e\u019f\7,\2\2\u019f\\\3\2\2\2\u01a0\u01a1"+
"\7\61\2\2\u01a1^\3\2\2\2\u01a2\u01a3\7>\2\2\u01a3\u01a4\7>\2\2\u01a4`"+
"\3\2\2\2\u01a5\u01a6\7@\2\2\u01a6\u01a7\7@\2\2\u01a7b\3\2\2\2\u01a8\u01a9"+
"\7>\2\2\u01a9\u01aa\7>\2\2\u01aa\u01ab\7B\2\2\u01abd\3\2\2\2\u01ac\u01ad"+
"\7@\2\2\u01ad\u01ae\7@\2\2\u01ae\u01af\7B\2\2\u01aff\3\2\2\2\u01b0\u01b1"+
"\7>\2\2\u01b1h\3\2\2\2\u01b2\u01b3\7@\2\2\u01b3j\3\2\2\2\u01b4\u01b5\7"+
">\2\2\u01b5\u01b6\7?\2\2\u01b6l\3\2\2\2\u01b7\u01b8\7@\2\2\u01b8\u01b9"+
"\7?\2\2\u01b9n\3\2\2\2\u01ba\u01bb\7?\2\2\u01bb\u01bc\7?\2\2\u01bcp\3"+
"\2\2\2\u01bd\u01be\7#\2\2\u01be\u01bf\7?\2\2\u01bfr\3\2\2\2\u01c0\u01c1"+
"\7(\2\2\u01c1t\3\2\2\2\u01c2\u01c3\7`\2\2\u01c3v\3\2\2\2\u01c4\u01c5\7"+
"~\2\2\u01c5x\3\2\2\2\u01c6\u01c7\7c\2\2\u01c7\u01c8\7p\2\2\u01c8\u01c9"+
"\7f\2\2\u01c9z\3\2\2\2\u01ca\u01cb\7q\2\2\u01cb\u01cc\7t\2\2\u01cc|\3"+
"\2\2\2\u01cd\u01ce\7z\2\2\u01ce\u01cf\7q\2\2\u01cf\u01d0\7t\2\2\u01d0"+
"~\3\2\2\2\u01d1\u01d2\7p\2\2\u01d2\u01d3\7q\2\2\u01d3\u01d4\7v\2\2\u01d4"+
"\u0080\3\2\2\2\u01d5\u01d6\7v\2\2\u01d6\u01d7\7q\2\2\u01d7\u0082\3\2\2"+
"\2\u01d8\u01d9\7t\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7v\2\2\u01db\u01dc"+
"\7w\2\2\u01dc\u01dd\7t\2\2\u01dd\u01de\7p\2\2\u01de\u0084\3\2\2\2\u01df"+
"\u01e0\7\60\2\2\u01e0\u0086\3\2\2\2\u01e1\u01e2\7C\2\2\u01e2\u0088\3\2"+
"\2\2\u01e3\u01e4\7Z\2\2\u01e4\u008a\3\2\2\2\u01e5\u01e6\7[\2\2\u01e6\u008c"+
"\3\2\2\2\u01e7\u01e8\7C\2\2\u01e8\u01e9\7Z\2\2\u01e9\u008e\3\2\2\2\u01ea"+
"\u01eb\7C\2\2\u01eb\u01ec\7[\2\2\u01ec\u0090\3\2\2\2\u01ed\u01ee\7Z\2"+
"\2\u01ee\u01ef\7[\2\2\u01ef\u0092\3\2\2\2\u01f0\u01f1\7R\2\2\u01f1\u01f2"+
"\7e\2\2\u01f2\u0094\3\2\2\2\u01f3\u01f4\7R\2\2\u01f4\u01f5\7k\2\2\u01f5"+
"\u0096\3\2\2\2\u01f6\u01f7\7R\2\2\u01f7\u01f8\7|\2\2\u01f8\u0098\3\2\2"+
"\2\u01f9\u01fa\7R\2\2\u01fa\u01fb\7p\2\2\u01fb\u009a\3\2\2\2\u01fc\u01fd"+
"\7R\2\2\u01fd\u01fe\7x\2\2\u01fe\u009c\3\2\2\2\u01ff\u0200\7v\2\2\u0200"+
"\u0201\7t\2\2\u0201\u0202\7w\2\2\u0202\u0203\7g\2\2\u0203\u009e\3\2\2"+
"\2\u0204\u0205\7h\2\2\u0205\u0206\7c\2\2\u0206\u0207\7n\2\2\u0207\u0208"+
"\7u\2\2\u0208\u0209\7g\2\2\u0209\u00a0\3\2\2\2\u020a\u020b\7\'\2\2\u020b"+
"\u020c\7c\2\2\u020c\u020d\7u\2\2\u020d\u020e\7o\2\2\u020e\u00a2\3\2\2"+
"\2\u020f\u0210\7u\2\2\u0210\u0211\7w\2\2\u0211\u0212\7d\2\2\u0212\u00a4"+
"\3\2\2\2\u0213\u0214\7/\2\2\u0214\u0215\7@\2\2\u0215\u00a6\3\2\2\2\u0216"+
"\u0217\7}\2\2\u0217\u00a8\3\2\2\2\u0218\u0219\7\177\2\2\u0219\u00aa\3"+
"\2\2\2\u021a\u021b\7A\2\2\u021b\u00ac\3\2\2\2\u021c\u021d\7k\2\2\u021d"+
"\u021e\7h\2\2\u021e\u00ae\3\2\2\2\u021f\u0220\7g\2\2\u0220\u0221\7n\2"+
"\2\u0221\u0222\7u\2\2\u0222\u0223\7g\2\2\u0223\u00b0\3\2\2\2\u0224\u0228"+
"\t\2\2\2\u0225\u0227\t\3\2\2\u0226\u0225\3\2\2\2\u0227\u022a\3\2\2\2\u0228"+
"\u0226\3\2\2\2\u0228\u0229\3\2\2\2\u0229\u022b\3\2\2\2\u022a\u0228\3\2"+
"\2\2\u022b\u022c\5\u00b3Z\2\u022c\u022d\3\2\2\2\u022d\u022e\bY\2\2\u022e"+
"\u00b2\3\2\2\2\u022f\u0233\7=\2\2\u0230\u0232\n\2\2\2\u0231\u0230\3\2"+
"\2\2\u0232\u0235\3\2\2\2\u0233\u0231\3\2\2\2\u0233\u0234\3\2\2\2\u0234"+
"\u0236\3\2\2\2\u0235\u0233\3\2\2\2\u0236\u0237\bZ\2\2\u0237\u00b4\3\2"+
"\2\2\u0238\u0239\t\3\2\2\u0239\u023a\3\2\2\2\u023a\u023b\b[\3\2\u023b"+
"\u00b6\3\2\2\2\u023c\u023e\t\2\2\2\u023d\u023c\3\2\2\2\u023e\u023f\3\2"+
"\2\2\u023f\u023d\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u00b8\3\2\2\2\u0241"+
"\u0245\t\4\2\2\u0242\u0244\t\5\2\2\u0243\u0242\3\2\2\2\u0244\u0247\3\2"+
"\2\2\u0245\u0243\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u00ba\3\2\2\2\u0247"+
"\u0245\3\2\2\2\u0248\u0250\4\62;\2\u0249\u024b\4\63;\2\u024a\u024c\4\62"+
";\2\u024b\u024a\3\2\2\2\u024c\u024d\3\2\2\2\u024d\u024b\3\2\2\2\u024d"+
"\u024e\3\2\2\2\u024e\u0250\3\2\2\2\u024f\u0248\3\2\2\2\u024f\u0249\3\2"+
"\2\2\u0250\u00bc\3\2\2\2\u0251\u0253\7&\2\2\u0252\u0254\t\6\2\2\u0253"+
"\u0252\3\2\2\2\u0254\u0255\3\2\2\2\u0255\u0253\3\2\2\2\u0255\u0256\3\2"+
"\2\2\u0256\u00be\3\2\2\2\u0257\u0259\7\'\2\2\u0258\u025a\4\62\63\2\u0259"+
"\u0258\3\2\2\2\u025a\u025b\3\2\2\2\u025b\u0259\3\2\2\2\u025b\u025c\3\2"+
"\2\2\u025c\u00c0\3\2\2\2\u025d\u0263\5\u00c3b\2\u025e\u0260\t\7\2\2\u025f"+
"\u0261\t\b\2\2\u0260\u025f\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0262\3\2"+
"\2\2\u0262\u0264\5\u00c3b\2\u0263\u025e\3\2\2\2\u0263\u0264\3\2\2\2\u0264"+
"\u00c2\3\2\2\2\u0265\u0267\4\62;\2\u0266\u0265\3\2\2\2\u0267\u0268\3\2"+
"\2\2\u0268\u0266\3\2\2\2\u0268\u0269\3\2\2\2\u0269\u0270\3\2\2\2\u026a"+
"\u026c\7\60\2\2\u026b\u026d\4\62;\2\u026c\u026b\3\2\2\2\u026d\u026e\3"+
"\2\2\2\u026e\u026c\3\2\2\2\u026e\u026f\3\2\2\2\u026f\u0271\3\2\2\2\u0270"+
"\u026a\3\2\2\2\u0270\u0271\3\2\2\2\u0271\u00c4\3\2\2\2\u0272\u0273\7^"+
"\2\2\u0273\u0277\13\2\2\2\u0274\u0275\7^\2\2\u0275\u0277\5\u00b7\\\2\u0276"+
"\u0272\3\2\2\2\u0276\u0274\3\2\2\2\u0277\u00c6\3\2\2\2\u0278\u027d\7$"+
"\2\2\u0279\u027c\5\u00c5c\2\u027a\u027c\n\t\2\2\u027b\u0279\3\2\2\2\u027b"+
"\u027a\3\2\2\2\u027c\u027f\3\2\2\2\u027d\u027b\3\2\2\2\u027d\u027e\3\2"+
"\2\2\u027e\u0280\3\2\2\2\u027f\u027d\3\2\2\2\u0280\u0281\7$\2\2\u0281"+
"\u0282\bd\4\2\u0282\u00c8\3\2\2\2\u0283\u0284\7}\2\2\u0284\u0285\7}\2"+
"\2\u0285\u0287\3\2\2\2\u0286\u0288\13\2\2\2\u0287\u0286\3\2\2\2\u0288"+
"\u0289\3\2\2\2\u0289\u028a\3\2\2\2\u0289\u0287\3\2\2\2\u028a\u028b\3\2"+
"\2\2\u028b\u028c\7\177\2\2\u028c\u028d\7\177\2\2\u028d\u028e\3\2\2\2\u028e"+
"\u028f\be\5\2\u028f\u00ca\3\2\2\2\25\2\u0228\u0233\u023f\u0245\u024d\u024f"+
"\u0253\u0255\u025b\u0260\u0263\u0268\u026e\u0270\u0276\u027b\u027d\u0289"+
"\6\2\3\2\b\2\2\3d\2\3e\3";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -81,97 +81,105 @@ T__79=80
T__80=81
T__81=82
T__82=83
LINECOMMENT=84
COMMENT=85
WS=86
EOL=87
NAME=88
DEC_INTEGER=89
HEX_INTEGER=90
BIN_INTEGER=91
FLOAT_NUMBER=92
STRING=93
INLINEASMBLOCK=94
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
BIN_INTEGER=95
FLOAT_NUMBER=96
STRING=97
INLINEASMBLOCK=98
'~'=1
'{'=2
'}'=3
':'=4
'goto'=5
'%output'=6
'%launcher'=7
'%zp'=8
'%address'=9
'%import'=10
'%breakpoint'=11
'%asminclude'=12
'%asmbinary'=13
'%option'=14
','=15
'='=16
'const'=17
'memory'=18
'byte'=19
'word'=20
'float'=21
'str'=22
'str_p'=23
'str_s'=24
'str_ps'=25
'['=26
']'=27
'+='=28
'-='=29
'/='=30
'*='=31
'**='=32
'<<='=33
'>>='=34
'<<@='=35
'>>@='=36
'&='=37
'|='=38
'^='=39
'++'=40
'--'=41
'('=42
')'=43
'+'=44
'-'=45
'**'=46
'*'=47
'/'=48
'<<'=49
'>>'=50
'<<@'=51
'>>@'=52
'<'=53
'>'=54
'<='=55
'>='=56
'=='=57
'!='=58
'&'=59
'^'=60
'|'=61
'and'=62
'or'=63
'xor'=64
'not'=65
'to'=66
'return'=67
'.'=68
'A'=69
'X'=70
'Y'=71
'AX'=72
'AY'=73
'XY'=74
'SC'=75
'SI'=76
'SZ'=77
':'=2
'goto'=3
'%output'=4
'%launcher'=5
'%zp'=6
'%address'=7
'%import'=8
'%breakpoint'=9
'%asminclude'=10
'%asmbinary'=11
'%option'=12
','=13
'='=14
'const'=15
'memory'=16
'byte'=17
'word'=18
'float'=19
'str'=20
'str_p'=21
'str_s'=22
'str_ps'=23
'['=24
']'=25
'+='=26
'-='=27
'/='=28
'*='=29
'**='=30
'<<='=31
'>>='=32
'<<@='=33
'>>@='=34
'&='=35
'|='=36
'^='=37
'++'=38
'--'=39
'('=40
')'=41
'+'=42
'-'=43
'**'=44
'*'=45
'/'=46
'<<'=47
'>>'=48
'<<@'=49
'>>@'=50
'<'=51
'>'=52
'<='=53
'>='=54
'=='=55
'!='=56
'&'=57
'^'=58
'|'=59
'and'=60
'or'=61
'xor'=62
'not'=63
'to'=64
'return'=65
'.'=66
'A'=67
'X'=68
'Y'=69
'AX'=70
'AY'=71
'XY'=72
'Pc'=73
'Pi'=74
'Pz'=75
'Pn'=76
'Pv'=77
'true'=78
'false'=79
'%asm'=80
'sub'=81
'->'=82
'?'=83
'{'=83
'}'=84
'?'=85
'if'=86
'else'=87

File diff suppressed because it is too large Load Diff

View File

@ -197,12 +197,12 @@ sub CINT () -> (?) = $FF81 ; (alias: SCINIT) initialize screen editor and
sub IOINIT () -> (A?, X?) = $FF84 ; initialize I/O devices (CIA, SID, IRQ)
sub RAMTAS () -> (?) = $FF87 ; initialize RAM, tape buffer, screen
sub RESTOR () -> (?) = $FF8A ; restore default I/O vectors
sub VECTOR (dir: SC, userptr: XY) -> (A?, Y?) = $FF8D ; read/set I/O vector table
sub VECTOR (dir: Pc, userptr: XY) -> (A?, Y?) = $FF8D ; read/set I/O vector table
sub SETMSG (value: A) -> () = $FF90 ; set Kernal message control flag
sub SECOND (address: A) -> (A?) = $FF93 ; (alias: LSTNSA) send secondary address after LISTEN
sub TKSA (address: A) -> (A?) = $FF96 ; (alias: TALKSA) send secondary address after TALK
sub MEMTOP (dir: SC, address: XY) -> (XY) = $FF99 ; read/set top of memory pointer
sub MEMBOT (dir: SC, address: XY) -> (XY) = $FF9C ; read/set bottom of memory pointer
sub MEMTOP (dir: Pc, address: XY) -> (XY) = $FF99 ; read/set top of memory pointer
sub MEMBOT (dir: Pc, address: XY) -> (XY) = $FF9C ; read/set bottom of memory pointer
sub SCNKEY () -> (?) = $FF9F ; scan the keyboard
sub SETTMO (timeout: A) -> () = $FFA2 ; set time-out flag for IEEE bus
sub ACPTR () -> (A) = $FFA5 ; (alias: IECIN) input byte from serial bus
@ -221,16 +221,16 @@ sub CHKOUT (logical: X) -> (A?, X?) = $FFC9 ; (via 800 ($320)) define an outp
sub CLRCHN () -> (A?, X?) = $FFCC ; (via 802 ($322)) restore default devices
sub CHRIN () -> (A, Y?) = $FFCF ; (via 804 ($324)) input a character (for keyboard, read a whole line from the screen) A=byte read.
sub CHROUT (char: A) -> () = $FFD2 ; (via 806 ($326)) output a character
sub LOAD (verify: A, address: XY) -> (SC, A, X, Y) = $FFD5 ; (via 816 ($330)) load from device
sub SAVE (zp_startaddr: A, endaddr: XY) -> (SC, A) = $FFD8 ; (via 818 ($332)) save to a device
sub LOAD (verify: A, address: XY) -> (Pc, A, X, Y) = $FFD5 ; (via 816 ($330)) load from device
sub SAVE (zp_startaddr: A, endaddr: XY) -> (Pc, A) = $FFD8 ; (via 818 ($332)) save to a device
sub SETTIM (low: A, middle: X, high: Y) -> () = $FFDB ; set the software clock
sub RDTIM () -> (A, X, Y) = $FFDE ; read the software clock
sub STOP () -> (SZ, SC, A?, X?) = $FFE1 ; (via 808 ($328)) check the STOP key
sub STOP () -> (Pz, Pc, A?, X?) = $FFE1 ; (via 808 ($328)) check the STOP key
sub GETIN () -> (A, X?, Y?) = $FFE4 ; (via 810 ($32A)) get a character
sub CLALL () -> (A?, X?) = $FFE7 ; (via 812 ($32C)) close all files
sub UDTIM () -> (A?, X?) = $FFEA ; update the software clock
sub SCREEN () -> (X, Y) = $FFED ; read number of screen rows and columns
sub PLOT (dir: SC, col: Y, row: X) -> (X, Y) = $FFF0 ; read/set position of cursor on screen
sub PLOT (dir: Pc, col: Y, row: X) -> (X, Y) = $FFF0 ; read/set position of cursor on screen
sub IOBASE () -> (X, Y) = $FFF3 ; read base address of I/O devices
; ---- end of C64 kernal routines ----
@ -489,7 +489,7 @@ _loop lda #0
}
sub scroll_left_full (alsocolors: SC) -> (A?, X?, Y?) {
sub scroll_left_full (alsocolors: Pc) -> (A?, X?, Y?) {
; ---- scroll the whole screen 1 character to the left
; contents of the rightmost column are unchanged, you should clear/refill this yourself
; Carry flag determines if screen color data must be scrolled too
@ -548,7 +548,7 @@ _scroll_screen ; scroll the screen memory
}
sub scroll_right_full (alsocolors: SC) -> (A?, X?) {
sub scroll_right_full (alsocolors: Pc) -> (A?, X?) {
; ---- scroll the whole screen 1 character to the right
; contents of the leftmost column are unchanged, you should clear/refill this yourself
; Carry flag determines if screen color data must be scrolled too
@ -599,7 +599,7 @@ _scroll_screen ; scroll the screen memory
}
sub scroll_up_full (alsocolors: SC) -> (A?, X?) {
sub scroll_up_full (alsocolors: Pc) -> (A?, X?) {
; ---- scroll the whole screen 1 character up
; contents of the bottom row are unchanged, you should refill/clear this yourself
; Carry flag determines if screen color data must be scrolled too
@ -650,7 +650,7 @@ _scroll_screen ; scroll the screen memory
}
sub scroll_down_full (alsocolors: SC) -> (A?, X?) {
sub scroll_down_full (alsocolors: Pc) -> (A?, X?) {
; ---- scroll the whole screen 1 character down
; contents of the top row are unchanged, you should refill/clear this yourself
; Carry flag determines if screen color data must be scrolled too
@ -934,7 +934,7 @@ _print_tens txa
}
sub print_byte_hex (prefix: SC, ubyte: A) -> (?) {
sub print_byte_hex (prefix: Pc, ubyte: A) -> (?) {
; ---- print the byte in A in hex form (if Carry is set, a radix prefix '$' is printed as well)
%asm {{
bcc +
@ -951,7 +951,7 @@ sub print_byte_hex (prefix: SC, ubyte: A) -> (?) {
}
sub print_word_hex (prefix: SC, dataword: XY) -> (?) {
sub print_word_hex (prefix: Pc, dataword: XY) -> (?) {
; ---- print the (unsigned) word in X/Y in hexadecimal form (4 digits)
; (if Carry is set, a radix prefix '$' is printed as well)
%asm {{