implemented while and repeat loops

This commit is contained in:
Irmen de Jong 2018-09-23 02:04:45 +02:00
parent cfd63dc42a
commit 68037e4425
10 changed files with 1236 additions and 849 deletions

View File

@ -65,10 +65,11 @@ statement :
| inlineasm
| returnstmt
| forloop
| whileloop
| repeatloop
| breakstmt
| continuestmt
| labeldef
// @todo whileloop, repeatloop
;
@ -207,7 +208,7 @@ sub_returns : '?' | ( sub_return (',' sub_return)* ) ;
sub_return: (register | statusflag) '?'? ;
if_stmt : 'if' '(' expression ')' EOL? (statement | statement_block) EOL? else_part? EOL ; // statement is constrained later
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
@ -217,6 +218,8 @@ branch_stmt : branchcondition EOL? (statement | statement_block) EOL? else_part?
branchcondition: 'if_cs' | 'if_cc' | 'if_eq' | 'if_z' | 'if_ne' | 'if_nz' | 'if_pl' | 'if_pos' | 'if_mi' | 'if_neg' | 'if_vs' | 'if_vc' ;
forloop :
'for' (register | identifier) 'in' expression EOL? statement_block EOL
;
forloop : 'for' (register | identifier) 'in' expression EOL? statement_block ;
whileloop: 'while' expression EOL? (statement | statement_block) ;
repeatloop: 'repeat' (statement | statement_block) EOL? 'until' expression ;

View File

@ -3,67 +3,22 @@
sub start() -> () {
byte i
byte i=2
byte from = 0
byte last = 5
word iw
word fromw = 0
word lastw = 5
for i in 10 to 1 step -1 {
while i<10 {
_vm_write_num(i)
_vm_write_char($8d)
i++
}
_vm_write_char($8d)
_vm_write_char($8d)
for i in 10 to 0 step -1 {
i=2
repeat {
_vm_write_num(i)
_vm_write_char($8d)
}
_vm_write_char($8d)
_vm_write_char($8d)
i++
} until i>10
for i in from to last {
_vm_write_num(i)
_vm_write_char($8d)
}
_vm_write_char($8d)
_vm_write_char($8d)
from=250
last=255
for i in from to last {
_vm_write_num(i)
_vm_write_char($8d)
}
_vm_write_char($8d)
_vm_write_char($8d)
fromw=65530
lastw=65535
for iw in fromw to lastw {
_vm_write_num(iw)
_vm_write_char($8d)
}
_vm_write_char($8d)
_vm_write_char($8d)
from = 5
last = 1
fromw = 1
lastw = 5
for iw in fromw to lastw step 1 { ;@todo last 0
_vm_write_num(iw)
_vm_write_char($8d)
}
_vm_write_char($8d)
_vm_write_char($8d)
}
}

View File

@ -190,6 +190,18 @@ interface IAstProcessor {
forLoop.body = forLoop.body.asSequence().map {it.process(this)}.toMutableList()
return forLoop
}
fun process(whileLoop: WhileLoop): IStatement {
whileLoop.condition = whileLoop.condition.process(this)
whileLoop.statements = whileLoop.statements.map { it.process(this) }
return whileLoop
}
fun process(repeatLoop: RepeatLoop): IStatement {
repeatLoop.untilCondition = repeatLoop.untilCondition.process(this)
repeatLoop.statements = repeatLoop.statements.map { it.process(this) }
return repeatLoop
}
}
@ -1314,6 +1326,58 @@ class BranchStatement(var condition: BranchCondition,
}
class ForLoop(val loopRegister: Register?,
val loopVar: IdentifierReference?,
var iterable: IExpression,
var body: MutableList<IStatement>,
override val position: Position) : IStatement {
override lateinit var parent: Node
override fun linkParents(parent: Node) {
this.parent=parent
loopVar?.linkParents(this)
iterable.linkParents(this)
body.forEach { it.linkParents(this) }
}
override fun process(processor: IAstProcessor) = processor.process(this)
override fun toString(): String {
return "ForLoop(loopVar: $loopVar, loopReg: $loopRegister, iterable: $iterable, pos=$position)"
}
}
class WhileLoop(var condition: IExpression,
var statements: List<IStatement>,
override val position: Position) : IStatement {
override lateinit var parent: Node
override fun linkParents(parent: Node) {
this.parent = parent
condition.linkParents(this)
statements.forEach { it.linkParents(this) }
}
override fun process(processor: IAstProcessor): IStatement = processor.process(this)
}
class RepeatLoop(var statements: List<IStatement>,
var untilCondition: IExpression,
override val position: Position) : IStatement {
override lateinit var parent: Node
override fun linkParents(parent: Node) {
this.parent = parent
untilCondition.linkParents(this)
statements.forEach { it.linkParents(this) }
}
override fun process(processor: IAstProcessor): IStatement = processor.process(this)
}
/***************** Antlr Extension methods to create AST ****************/
fun prog8Parser.ModuleContext.toAst(name: String) : Module =
@ -1432,6 +1496,12 @@ private fun prog8Parser.StatementContext.toAst() : IStatement {
val forloop = forloop()?.toAst()
if(forloop!=null) return forloop
val repeatloop = repeatloop()?.toAst()
if(repeatloop!=null) return repeatloop
val whileloop = whileloop()?.toAst()
if(whileloop!=null) return whileloop
val breakstmt = breakstmt()?.toAst()
if(breakstmt!=null) return breakstmt
@ -1687,28 +1757,20 @@ private fun prog8Parser.ForloopContext.toAst(): ForLoop {
}
class ForLoop(val loopRegister: Register?,
val loopVar: IdentifierReference?,
var iterable: IExpression,
var body: MutableList<IStatement>,
override val position: Position) : IStatement {
override lateinit var parent: Node
override fun linkParents(parent: Node) {
this.parent=parent
loopVar?.linkParents(this)
iterable.linkParents(this)
body.forEach { it.linkParents(this) }
}
override fun process(processor: IAstProcessor) = processor.process(this)
override fun toString(): String {
return "ForLoop(loopVar: $loopVar, loopReg: $loopRegister, iterable: $iterable, pos=$position)"
}
}
private fun prog8Parser.ContinuestmtContext.toAst() = Continue(toPosition())
private fun prog8Parser.BreakstmtContext.toAst() = Break(toPosition())
private fun prog8Parser.WhileloopContext.toAst(): WhileLoop {
val condition = expression().toAst()
val statements = statement_block()?.toAst() ?: listOf(statement().toAst())
return WhileLoop(condition, statements, toPosition())
}
private fun prog8Parser.RepeatloopContext.toAst(): RepeatLoop {
val untilCondition = expression().toAst()
val statements = statement_block()?.toAst() ?: listOf(statement().toAst())
return RepeatLoop(statements, untilCondition, toPosition())
}

View File

@ -428,15 +428,12 @@ class AstChecker(private val namespace: INameScope, private val compilerOptions:
super.process(range)
val from = range.from.constValue(namespace)
val to = range.to.constValue(namespace)
var step = 1
if(range.step!=null) {
val stepLv = range.step.constValue(namespace) ?: LiteralValue(DataType.BYTE, 1, position = range.position)
if (stepLv.asIntegerValue == null || stepLv.asIntegerValue == 0) {
err("range step must be an integer != 0")
return range
}
step = stepLv.asIntegerValue
val stepLv = range.step.constValue(namespace) ?: LiteralValue(DataType.BYTE, 1, position = range.position)
if (stepLv.asIntegerValue == null || stepLv.asIntegerValue == 0) {
err("range step must be an integer != 0")
return range
}
val step = stepLv.asIntegerValue
if(from!=null && to != null) {
when {
from.asIntegerValue!=null && to.asIntegerValue!=null -> {

View File

@ -177,6 +177,8 @@ private class StatementTranslator(private val stackvmProg: StackVmProgram, priva
is Break -> translate(stmt)
is Continue -> translate(stmt)
is ForLoop -> translate(stmt)
is WhileLoop -> translate(stmt)
is RepeatLoop -> translate(stmt)
is Directive, is VarDecl, is Subroutine -> {} // skip this, already processed these.
is InlineAssembly -> throw CompilerException("inline assembly is not supported by the StackVM")
else -> TODO("translate statement $stmt to stackvm")
@ -647,7 +649,7 @@ private class StatementTranslator(private val stackvmProg: StackVmProgram, priva
}
private fun translateForOverVariableRange(varname: List<String>?, register: Register?, varDt: DataType, range: RangeExpr, body: MutableList<IStatement>) {
/**
/*
* for LV in start..last { body }
* (where at least one of the start, last, step values is not a constant)
* (so we can't make any static assumptions about them)
@ -772,4 +774,69 @@ private class StatementTranslator(private val stackvmProg: StackVmProgram, priva
breakStmtLabelStack.pop()
continueStmtLabelStack.pop()
}
private fun translate(stmt: WhileLoop)
{
/*
* while condition { statements... } ->
*
* goto continue
* loop:
* statements
* break -> goto break
* continue -> goto condition
* continue:
* <evaluate condition>
* bnz loop
* break:
* nop
*/
val loopLabel = makeLabel("loop")
val breakLabel = makeLabel("break")
val continueLabel = makeLabel("continue")
breakStmtLabelStack.push(breakLabel)
continueStmtLabelStack.push(continueLabel)
stackvmProg.instr(Opcode.JUMP, callLabel = continueLabel)
stackvmProg.label(loopLabel)
translate(stmt.statements)
stackvmProg.label(continueLabel)
translate(stmt.condition)
stackvmProg.instr(Opcode.BNZ, callLabel = loopLabel)
stackvmProg.label(breakLabel)
stackvmProg.instr(Opcode.NOP)
breakStmtLabelStack.pop()
continueStmtLabelStack.pop()
}
private fun translate(stmt: RepeatLoop)
{
/*
* repeat { statements... } until condition ->
*
* loop:
* statements
* break -> goto break
* continue -> goto condition
* condition:
* <evaluate untilCondition>
* bz goto loop
* break:
* nop
*/
val loopLabel = makeLabel("loop")
val continueLabel = makeLabel("continue")
val breakLabel = makeLabel("break")
breakStmtLabelStack.push(breakLabel)
continueStmtLabelStack.push(continueLabel)
stackvmProg.label(loopLabel)
translate(stmt.statements)
stackvmProg.label(continueLabel)
translate(stmt.untilCondition)
stackvmProg.instr(Opcode.BZ, callLabel = loopLabel)
stackvmProg.label(breakLabel)
stackvmProg.instr(Opcode.NOP)
breakStmtLabelStack.pop()
continueStmtLabelStack.pop()
}
}

View File

@ -75,6 +75,40 @@ class StatementOptimizer(private val globalNamespace: INameScope) : IAstProcesso
return ifStatement
}
override fun process(whileLoop: WhileLoop): IStatement {
super.process(whileLoop)
val constvalue = whileLoop.condition.constValue(globalNamespace)
if(constvalue!=null) {
return if(constvalue.asBooleanValue){
// always true
printWarning("condition is always true", whileLoop.position)
whileLoop
} else {
// always false -> ditch whole statement
printWarning("condition is always false", whileLoop.position)
AnonymousStatementList(whileLoop.parent, emptyList(), whileLoop.position)
}
}
return whileLoop
}
override fun process(repeatLoop: RepeatLoop): IStatement {
super.process(repeatLoop)
val constvalue = repeatLoop.untilCondition.constValue(globalNamespace)
if(constvalue!=null) {
return if(constvalue.asBooleanValue){
// always true -> keep only the statement block
printWarning("condition is always true", repeatLoop.position)
AnonymousStatementList(repeatLoop.parent, repeatLoop.statements, repeatLoop.position)
} else {
// always false
printWarning("condition is always false", repeatLoop.position)
repeatLoop
}
}
return repeatLoop
}
private fun used(stmt: IStatement) {
val scopedName = when (stmt) {
is Label -> stmt.scopedname

View File

@ -30,9 +30,9 @@ public class prog8Lexer extends Lexer {
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__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94,
T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, LINECOMMENT=100, COMMENT=101,
WS=102, EOL=103, NAME=104, DEC_INTEGER=105, HEX_INTEGER=106, BIN_INTEGER=107,
FLOAT_NUMBER=108, STRING=109, INLINEASMBLOCK=110;
T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101,
T__101=102, LINECOMMENT=103, COMMENT=104, WS=105, EOL=106, NAME=107, DEC_INTEGER=108,
HEX_INTEGER=109, BIN_INTEGER=110, FLOAT_NUMBER=111, STRING=112, INLINEASMBLOCK=113;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@ -54,9 +54,9 @@ public class prog8Lexer extends Lexer {
"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", "T__87", "T__88",
"T__89", "T__90", "T__91", "T__92", "T__93", "T__94", "T__95", "T__96",
"T__97", "T__98", "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ",
"STRING", "INLINEASMBLOCK"
"T__97", "T__98", "T__99", "T__100", "T__101", "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 = {
@ -72,7 +72,7 @@ public class prog8Lexer extends Lexer {
"'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'sub'", "'->'", "'{'",
"'}'", "'?'", "'if'", "'else'", "'if_cs'", "'if_cc'", "'if_eq'", "'if_z'",
"'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'", "'if_mi'", "'if_neg'", "'if_vs'",
"'if_vc'", "'for'", "'in'"
"'if_vc'", "'for'", "'in'", "'while'", "'repeat'", "'until'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
@ -83,9 +83,9 @@ 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, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME",
"DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING",
"INLINEASMBLOCK"
null, null, null, 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);
@ -147,10 +147,10 @@ public class prog8Lexer extends Lexer {
@Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) {
case 110:
case 113:
STRING_action((RuleContext)_localctx, actionIndex);
break;
case 111:
case 114:
INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex);
break;
}
@ -179,7 +179,7 @@ public class prog8Lexer extends Lexer {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2p\u02fb\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2s\u0314\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"+
@ -191,246 +191,255 @@ public class prog8Lexer extends Lexer {
"\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\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+
"k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4"+
"\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+
"\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b"+
"\3\b\3\b\3\b\3\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\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\60\3\60\3\61\3\61\3\61\3\62"+
"\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\66\3\66\3\67\3\67"+
"\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3="+
"\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A"+
"\3A\3B\3B\3C\3C\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3J"+
"\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O"+
"\3O\3P\3P\3P\3P\3Q\3Q\3Q\3R\3R\3S\3S\3T\3T\3U\3U\3U\3V\3V\3V\3V\3V\3W"+
"\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3["+
"\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3]\3^\3^\3^\3^"+
"\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3b"+
"\3b\3b\3b\3b\3b\3c\3c\3c\3c\3d\3d\3d\3e\3e\7e\u0292\ne\fe\16e\u0295\13"+
"e\3e\3e\3e\3e\3f\3f\7f\u029d\nf\ff\16f\u02a0\13f\3f\3f\3g\3g\3g\3g\3h"+
"\6h\u02a9\nh\rh\16h\u02aa\3i\3i\7i\u02af\ni\fi\16i\u02b2\13i\3j\3j\3j"+
"\6j\u02b7\nj\rj\16j\u02b8\5j\u02bb\nj\3k\3k\6k\u02bf\nk\rk\16k\u02c0\3"+
"l\3l\6l\u02c5\nl\rl\16l\u02c6\3m\3m\3m\5m\u02cc\nm\3m\5m\u02cf\nm\3n\6"+
"n\u02d2\nn\rn\16n\u02d3\3n\3n\6n\u02d8\nn\rn\16n\u02d9\5n\u02dc\nn\3o"+
"\3o\3o\3o\5o\u02e2\no\3p\3p\3p\7p\u02e7\np\fp\16p\u02ea\13p\3p\3p\3p\3"+
"q\3q\3q\3q\6q\u02f3\nq\rq\16q\u02f4\3q\3q\3q\3q\3q\3\u02f4\2r\3\3\5\4"+
"\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22"+
"#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C"+
"#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w"+
"=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091"+
"J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5"+
"T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9"+
"^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cd"+
"h\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00db\2\u00dd\2\u00dfo\u00e1"+
"p\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\u0309\2\3\3\2\2\2\2\5\3\2\2\2"+
"\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3"+
"\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2"+
"\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2"+
"\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2"+
"\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2"+
"\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2"+
"\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y"+
"\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2"+
"\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2"+
"\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177"+
"\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2"+
"\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091"+
"\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2"+
"\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3"+
"\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2"+
"\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5"+
"\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2"+
"\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7"+
"\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2"+
"\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9"+
"\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\3\u00e3\3\2\2\2\5\u00e5\3\2\2"+
"\2\7\u00e7\3\2\2\2\t\u00ec\3\2\2\2\13\u00f4\3\2\2\2\r\u00fe\3\2\2\2\17"+
"\u0108\3\2\2\2\21\u0111\3\2\2\2\23\u0119\3\2\2\2\25\u0125\3\2\2\2\27\u0131"+
"\3\2\2\2\31\u013c\3\2\2\2\33\u0144\3\2\2\2\35\u0146\3\2\2\2\37\u0148\3"+
"\2\2\2!\u014e\3\2\2\2#\u0155\3\2\2\2%\u015a\3\2\2\2\'\u015f\3\2\2\2)\u0165"+
"\3\2\2\2+\u0169\3\2\2\2-\u016f\3\2\2\2/\u0175\3\2\2\2\61\u017c\3\2\2\2"+
"\63\u017e\3\2\2\2\65\u0180\3\2\2\2\67\u0183\3\2\2\29\u0186\3\2\2\2;\u0189"+
"\3\2\2\2=\u018d\3\2\2\2?\u0190\3\2\2\2A\u0194\3\2\2\2C\u0197\3\2\2\2E"+
"\u019a\3\2\2\2G\u019d\3\2\2\2I\u01a0\3\2\2\2K\u01a3\3\2\2\2M\u01a5\3\2"+
"\2\2O\u01a7\3\2\2\2Q\u01a9\3\2\2\2S\u01ab\3\2\2\2U\u01ae\3\2\2\2W\u01b0"+
"\3\2\2\2Y\u01b2\3\2\2\2[\u01b5\3\2\2\2]\u01b7\3\2\2\2_\u01b9\3\2\2\2a"+
"\u01bb\3\2\2\2c\u01be\3\2\2\2e\u01c1\3\2\2\2g\u01c4\3\2\2\2i\u01c7\3\2"+
"\2\2k\u01c9\3\2\2\2m\u01cb\3\2\2\2o\u01cd\3\2\2\2q\u01d0\3\2\2\2s\u01d5"+
"\3\2\2\2u\u01d9\3\2\2\2w\u01dc\3\2\2\2y\u01e0\3\2\2\2{\u01e4\3\2\2\2}"+
"\u01eb\3\2\2\2\177\u01f1\3\2\2\2\u0081\u01fa\3\2\2\2\u0083\u01fc\3\2\2"+
"\2\u0085\u01fe\3\2\2\2\u0087\u0200\3\2\2\2\u0089\u0202\3\2\2\2\u008b\u0205"+
"\3\2\2\2\u008d\u0208\3\2\2\2\u008f\u020b\3\2\2\2\u0091\u020e\3\2\2\2\u0093"+
"\u0211\3\2\2\2\u0095\u0214\3\2\2\2\u0097\u0217\3\2\2\2\u0099\u021a\3\2"+
"\2\2\u009b\u021f\3\2\2\2\u009d\u0225\3\2\2\2\u009f\u022a\3\2\2\2\u00a1"+
"\u022e\3\2\2\2\u00a3\u0231\3\2\2\2\u00a5\u0233\3\2\2\2\u00a7\u0235\3\2"+
"\2\2\u00a9\u0237\3\2\2\2\u00ab\u023a\3\2\2\2\u00ad\u023f\3\2\2\2\u00af"+
"\u0245\3\2\2\2\u00b1\u024b\3\2\2\2\u00b3\u0251\3\2\2\2\u00b5\u0256\3\2"+
"\2\2\u00b7\u025c\3\2\2\2\u00b9\u0262\3\2\2\2\u00bb\u0268\3\2\2\2\u00bd"+
"\u026f\3\2\2\2\u00bf\u0275\3\2\2\2\u00c1\u027c\3\2\2\2\u00c3\u0282\3\2"+
"\2\2\u00c5\u0288\3\2\2\2\u00c7\u028c\3\2\2\2\u00c9\u028f\3\2\2\2\u00cb"+
"\u029a\3\2\2\2\u00cd\u02a3\3\2\2\2\u00cf\u02a8\3\2\2\2\u00d1\u02ac\3\2"+
"\2\2\u00d3\u02ba\3\2\2\2\u00d5\u02bc\3\2\2\2\u00d7\u02c2\3\2\2\2\u00d9"+
"\u02c8\3\2\2\2\u00db\u02d1\3\2\2\2\u00dd\u02e1\3\2\2\2\u00df\u02e3\3\2"+
"\2\2\u00e1\u02ee\3\2\2\2\u00e3\u00e4\7\u0080\2\2\u00e4\4\3\2\2\2\u00e5"+
"\u00e6\7<\2\2\u00e6\6\3\2\2\2\u00e7\u00e8\7i\2\2\u00e8\u00e9\7q\2\2\u00e9"+
"\u00ea\7v\2\2\u00ea\u00eb\7q\2\2\u00eb\b\3\2\2\2\u00ec\u00ed\7\'\2\2\u00ed"+
"\u00ee\7q\2\2\u00ee\u00ef\7w\2\2\u00ef\u00f0\7v\2\2\u00f0\u00f1\7r\2\2"+
"\u00f1\u00f2\7w\2\2\u00f2\u00f3\7v\2\2\u00f3\n\3\2\2\2\u00f4\u00f5\7\'"+
"\2\2\u00f5\u00f6\7n\2\2\u00f6\u00f7\7c\2\2\u00f7\u00f8\7w\2\2\u00f8\u00f9"+
"\7p\2\2\u00f9\u00fa\7e\2\2\u00fa\u00fb\7j\2\2\u00fb\u00fc\7g\2\2\u00fc"+
"\u00fd\7t\2\2\u00fd\f\3\2\2\2\u00fe\u00ff\7\'\2\2\u00ff\u0100\7|\2\2\u0100"+
"\u0101\7g\2\2\u0101\u0102\7t\2\2\u0102\u0103\7q\2\2\u0103\u0104\7r\2\2"+
"\u0104\u0105\7c\2\2\u0105\u0106\7i\2\2\u0106\u0107\7g\2\2\u0107\16\3\2"+
"\2\2\u0108\u0109\7\'\2\2\u0109\u010a\7c\2\2\u010a\u010b\7f\2\2\u010b\u010c"+
"\7f\2\2\u010c\u010d\7t\2\2\u010d\u010e\7g\2\2\u010e\u010f\7u\2\2\u010f"+
"\u0110\7u\2\2\u0110\20\3\2\2\2\u0111\u0112\7\'\2\2\u0112\u0113\7k\2\2"+
"\u0113\u0114\7o\2\2\u0114\u0115\7r\2\2\u0115\u0116\7q\2\2\u0116\u0117"+
"\7t\2\2\u0117\u0118\7v\2\2\u0118\22\3\2\2\2\u0119\u011a\7\'\2\2\u011a"+
"\u011b\7d\2\2\u011b\u011c\7t\2\2\u011c\u011d\7g\2\2\u011d\u011e\7c\2\2"+
"\u011e\u011f\7m\2\2\u011f\u0120\7r\2\2\u0120\u0121\7q\2\2\u0121\u0122"+
"\7k\2\2\u0122\u0123\7p\2\2\u0123\u0124\7v\2\2\u0124\24\3\2\2\2\u0125\u0126"+
"\7\'\2\2\u0126\u0127\7c\2\2\u0127\u0128\7u\2\2\u0128\u0129\7o\2\2\u0129"+
"\u012a\7k\2\2\u012a\u012b\7p\2\2\u012b\u012c\7e\2\2\u012c\u012d\7n\2\2"+
"\u012d\u012e\7w\2\2\u012e\u012f\7f\2\2\u012f\u0130\7g\2\2\u0130\26\3\2"+
"\2\2\u0131\u0132\7\'\2\2\u0132\u0133\7c\2\2\u0133\u0134\7u\2\2\u0134\u0135"+
"\7o\2\2\u0135\u0136\7d\2\2\u0136\u0137\7k\2\2\u0137\u0138\7p\2\2\u0138"+
"\u0139\7c\2\2\u0139\u013a\7t\2\2\u013a\u013b\7{\2\2\u013b\30\3\2\2\2\u013c"+
"\u013d\7\'\2\2\u013d\u013e\7q\2\2\u013e\u013f\7r\2\2\u013f\u0140\7v\2"+
"\2\u0140\u0141\7k\2\2\u0141\u0142\7q\2\2\u0142\u0143\7p\2\2\u0143\32\3"+
"\2\2\2\u0144\u0145\7.\2\2\u0145\34\3\2\2\2\u0146\u0147\7?\2\2\u0147\36"+
"\3\2\2\2\u0148\u0149\7e\2\2\u0149\u014a\7q\2\2\u014a\u014b\7p\2\2\u014b"+
"\u014c\7u\2\2\u014c\u014d\7v\2\2\u014d \3\2\2\2\u014e\u014f\7o\2\2\u014f"+
"\u0150\7g\2\2\u0150\u0151\7o\2\2\u0151\u0152\7q\2\2\u0152\u0153\7t\2\2"+
"\u0153\u0154\7{\2\2\u0154\"\3\2\2\2\u0155\u0156\7d\2\2\u0156\u0157\7{"+
"\2\2\u0157\u0158\7v\2\2\u0158\u0159\7g\2\2\u0159$\3\2\2\2\u015a\u015b"+
"\7y\2\2\u015b\u015c\7q\2\2\u015c\u015d\7t\2\2\u015d\u015e\7f\2\2\u015e"+
"&\3\2\2\2\u015f\u0160\7h\2\2\u0160\u0161\7n\2\2\u0161\u0162\7q\2\2\u0162"+
"\u0163\7c\2\2\u0163\u0164\7v\2\2\u0164(\3\2\2\2\u0165\u0166\7u\2\2\u0166"+
"\u0167\7v\2\2\u0167\u0168\7t\2\2\u0168*\3\2\2\2\u0169\u016a\7u\2\2\u016a"+
"\u016b\7v\2\2\u016b\u016c\7t\2\2\u016c\u016d\7a\2\2\u016d\u016e\7r\2\2"+
"\u016e,\3\2\2\2\u016f\u0170\7u\2\2\u0170\u0171\7v\2\2\u0171\u0172\7t\2"+
"\2\u0172\u0173\7a\2\2\u0173\u0174\7u\2\2\u0174.\3\2\2\2\u0175\u0176\7"+
"u\2\2\u0176\u0177\7v\2\2\u0177\u0178\7t\2\2\u0178\u0179\7a\2\2\u0179\u017a"+
"\7r\2\2\u017a\u017b\7u\2\2\u017b\60\3\2\2\2\u017c\u017d\7]\2\2\u017d\62"+
"\3\2\2\2\u017e\u017f\7_\2\2\u017f\64\3\2\2\2\u0180\u0181\7-\2\2\u0181"+
"\u0182\7?\2\2\u0182\66\3\2\2\2\u0183\u0184\7/\2\2\u0184\u0185\7?\2\2\u0185"+
"8\3\2\2\2\u0186\u0187\7\61\2\2\u0187\u0188\7?\2\2\u0188:\3\2\2\2\u0189"+
"\u018a\7\61\2\2\u018a\u018b\7\61\2\2\u018b\u018c\7?\2\2\u018c<\3\2\2\2"+
"\u018d\u018e\7,\2\2\u018e\u018f\7?\2\2\u018f>\3\2\2\2\u0190\u0191\7,\2"+
"\2\u0191\u0192\7,\2\2\u0192\u0193\7?\2\2\u0193@\3\2\2\2\u0194\u0195\7"+
"(\2\2\u0195\u0196\7?\2\2\u0196B\3\2\2\2\u0197\u0198\7~\2\2\u0198\u0199"+
"\7?\2\2\u0199D\3\2\2\2\u019a\u019b\7`\2\2\u019b\u019c\7?\2\2\u019cF\3"+
"\2\2\2\u019d\u019e\7-\2\2\u019e\u019f\7-\2\2\u019fH\3\2\2\2\u01a0\u01a1"+
"\7/\2\2\u01a1\u01a2\7/\2\2\u01a2J\3\2\2\2\u01a3\u01a4\7*\2\2\u01a4L\3"+
"\2\2\2\u01a5\u01a6\7+\2\2\u01a6N\3\2\2\2\u01a7\u01a8\7-\2\2\u01a8P\3\2"+
"\2\2\u01a9\u01aa\7/\2\2\u01aaR\3\2\2\2\u01ab\u01ac\7,\2\2\u01ac\u01ad"+
"\7,\2\2\u01adT\3\2\2\2\u01ae\u01af\7,\2\2\u01afV\3\2\2\2\u01b0\u01b1\7"+
"\61\2\2\u01b1X\3\2\2\2\u01b2\u01b3\7\61\2\2\u01b3\u01b4\7\61\2\2\u01b4"+
"Z\3\2\2\2\u01b5\u01b6\7\'\2\2\u01b6\\\3\2\2\2\u01b7\u01b8\7>\2\2\u01b8"+
"^\3\2\2\2\u01b9\u01ba\7@\2\2\u01ba`\3\2\2\2\u01bb\u01bc\7>\2\2\u01bc\u01bd"+
"\7?\2\2\u01bdb\3\2\2\2\u01be\u01bf\7@\2\2\u01bf\u01c0\7?\2\2\u01c0d\3"+
"\2\2\2\u01c1\u01c2\7?\2\2\u01c2\u01c3\7?\2\2\u01c3f\3\2\2\2\u01c4\u01c5"+
"\7#\2\2\u01c5\u01c6\7?\2\2\u01c6h\3\2\2\2\u01c7\u01c8\7(\2\2\u01c8j\3"+
"\2\2\2\u01c9\u01ca\7`\2\2\u01cal\3\2\2\2\u01cb\u01cc\7~\2\2\u01ccn\3\2"+
"\2\2\u01cd\u01ce\7v\2\2\u01ce\u01cf\7q\2\2\u01cfp\3\2\2\2\u01d0\u01d1"+
"\7u\2\2\u01d1\u01d2\7v\2\2\u01d2\u01d3\7g\2\2\u01d3\u01d4\7r\2\2\u01d4"+
"r\3\2\2\2\u01d5\u01d6\7c\2\2\u01d6\u01d7\7p\2\2\u01d7\u01d8\7f\2\2\u01d8"+
"t\3\2\2\2\u01d9\u01da\7q\2\2\u01da\u01db\7t\2\2\u01dbv\3\2\2\2\u01dc\u01dd"+
"\7z\2\2\u01dd\u01de\7q\2\2\u01de\u01df\7t\2\2\u01dfx\3\2\2\2\u01e0\u01e1"+
"\7p\2\2\u01e1\u01e2\7q\2\2\u01e2\u01e3\7v\2\2\u01e3z\3\2\2\2\u01e4\u01e5"+
"\7t\2\2\u01e5\u01e6\7g\2\2\u01e6\u01e7\7v\2\2\u01e7\u01e8\7w\2\2\u01e8"+
"\u01e9\7t\2\2\u01e9\u01ea\7p\2\2\u01ea|\3\2\2\2\u01eb\u01ec\7d\2\2\u01ec"+
"\u01ed\7t\2\2\u01ed\u01ee\7g\2\2\u01ee\u01ef\7c\2\2\u01ef\u01f0\7m\2\2"+
"\u01f0~\3\2\2\2\u01f1\u01f2\7e\2\2\u01f2\u01f3\7q\2\2\u01f3\u01f4\7p\2"+
"\2\u01f4\u01f5\7v\2\2\u01f5\u01f6\7k\2\2\u01f6\u01f7\7p\2\2\u01f7\u01f8"+
"\7w\2\2\u01f8\u01f9\7g\2\2\u01f9\u0080\3\2\2\2\u01fa\u01fb\7\60\2\2\u01fb"+
"\u0082\3\2\2\2\u01fc\u01fd\7C\2\2\u01fd\u0084\3\2\2\2\u01fe\u01ff\7Z\2"+
"\2\u01ff\u0086\3\2\2\2\u0200\u0201\7[\2\2\u0201\u0088\3\2\2\2\u0202\u0203"+
"\7C\2\2\u0203\u0204\7Z\2\2\u0204\u008a\3\2\2\2\u0205\u0206\7C\2\2\u0206"+
"\u0207\7[\2\2\u0207\u008c\3\2\2\2\u0208\u0209\7Z\2\2\u0209\u020a\7[\2"+
"\2\u020a\u008e\3\2\2\2\u020b\u020c\7R\2\2\u020c\u020d\7e\2\2\u020d\u0090"+
"\3\2\2\2\u020e\u020f\7R\2\2\u020f\u0210\7|\2\2\u0210\u0092\3\2\2\2\u0211"+
"\u0212\7R\2\2\u0212\u0213\7p\2\2\u0213\u0094\3\2\2\2\u0214\u0215\7R\2"+
"\2\u0215\u0216\7x\2\2\u0216\u0096\3\2\2\2\u0217\u0218\7\60\2\2\u0218\u0219"+
"\7y\2\2\u0219\u0098\3\2\2\2\u021a\u021b\7v\2\2\u021b\u021c\7t\2\2\u021c"+
"\u021d\7w\2\2\u021d\u021e\7g\2\2\u021e\u009a\3\2\2\2\u021f\u0220\7h\2"+
"\2\u0220\u0221\7c\2\2\u0221\u0222\7n\2\2\u0222\u0223\7u\2\2\u0223\u0224"+
"\7g\2\2\u0224\u009c\3\2\2\2\u0225\u0226\7\'\2\2\u0226\u0227\7c\2\2\u0227"+
"\u0228\7u\2\2\u0228\u0229\7o\2\2\u0229\u009e\3\2\2\2\u022a\u022b\7u\2"+
"\2\u022b\u022c\7w\2\2\u022c\u022d\7d\2\2\u022d\u00a0\3\2\2\2\u022e\u022f"+
"\7/\2\2\u022f\u0230\7@\2\2\u0230\u00a2\3\2\2\2\u0231\u0232\7}\2\2\u0232"+
"\u00a4\3\2\2\2\u0233\u0234\7\177\2\2\u0234\u00a6\3\2\2\2\u0235\u0236\7"+
"A\2\2\u0236\u00a8\3\2\2\2\u0237\u0238\7k\2\2\u0238\u0239\7h\2\2\u0239"+
"\u00aa\3\2\2\2\u023a\u023b\7g\2\2\u023b\u023c\7n\2\2\u023c\u023d\7u\2"+
"\2\u023d\u023e\7g\2\2\u023e\u00ac\3\2\2\2\u023f\u0240\7k\2\2\u0240\u0241"+
"\7h\2\2\u0241\u0242\7a\2\2\u0242\u0243\7e\2\2\u0243\u0244\7u\2\2\u0244"+
"\u00ae\3\2\2\2\u0245\u0246\7k\2\2\u0246\u0247\7h\2\2\u0247\u0248\7a\2"+
"\2\u0248\u0249\7e\2\2\u0249\u024a\7e\2\2\u024a\u00b0\3\2\2\2\u024b\u024c"+
"\7k\2\2\u024c\u024d\7h\2\2\u024d\u024e\7a\2\2\u024e\u024f\7g\2\2\u024f"+
"\u0250\7s\2\2\u0250\u00b2\3\2\2\2\u0251\u0252\7k\2\2\u0252\u0253\7h\2"+
"\2\u0253\u0254\7a\2\2\u0254\u0255\7|\2\2\u0255\u00b4\3\2\2\2\u0256\u0257"+
"\7k\2\2\u0257\u0258\7h\2\2\u0258\u0259\7a\2\2\u0259\u025a\7p\2\2\u025a"+
"\u025b\7g\2\2\u025b\u00b6\3\2\2\2\u025c\u025d\7k\2\2\u025d\u025e\7h\2"+
"\2\u025e\u025f\7a\2\2\u025f\u0260\7p\2\2\u0260\u0261\7|\2\2\u0261\u00b8"+
"\3\2\2\2\u0262\u0263\7k\2\2\u0263\u0264\7h\2\2\u0264\u0265\7a\2\2\u0265"+
"\u0266\7r\2\2\u0266\u0267\7n\2\2\u0267\u00ba\3\2\2\2\u0268\u0269\7k\2"+
"\2\u0269\u026a\7h\2\2\u026a\u026b\7a\2\2\u026b\u026c\7r\2\2\u026c\u026d"+
"\7q\2\2\u026d\u026e\7u\2\2\u026e\u00bc\3\2\2\2\u026f\u0270\7k\2\2\u0270"+
"\u0271\7h\2\2\u0271\u0272\7a\2\2\u0272\u0273\7o\2\2\u0273\u0274\7k\2\2"+
"\u0274\u00be\3\2\2\2\u0275\u0276\7k\2\2\u0276\u0277\7h\2\2\u0277\u0278"+
"\7a\2\2\u0278\u0279\7p\2\2\u0279\u027a\7g\2\2\u027a\u027b\7i\2\2\u027b"+
"\u00c0\3\2\2\2\u027c\u027d\7k\2\2\u027d\u027e\7h\2\2\u027e\u027f\7a\2"+
"\2\u027f\u0280\7x\2\2\u0280\u0281\7u\2\2\u0281\u00c2\3\2\2\2\u0282\u0283"+
"\7k\2\2\u0283\u0284\7h\2\2\u0284\u0285\7a\2\2\u0285\u0286\7x\2\2\u0286"+
"\u0287\7e\2\2\u0287\u00c4\3\2\2\2\u0288\u0289\7h\2\2\u0289\u028a\7q\2"+
"\2\u028a\u028b\7t\2\2\u028b\u00c6\3\2\2\2\u028c\u028d\7k\2\2\u028d\u028e"+
"\7p\2\2\u028e\u00c8\3\2\2\2\u028f\u0293\t\2\2\2\u0290\u0292\t\3\2\2\u0291"+
"\u0290\3\2\2\2\u0292\u0295\3\2\2\2\u0293\u0291\3\2\2\2\u0293\u0294\3\2"+
"\2\2\u0294\u0296\3\2\2\2\u0295\u0293\3\2\2\2\u0296\u0297\5\u00cbf\2\u0297"+
"\u0298\3\2\2\2\u0298\u0299\be\2\2\u0299\u00ca\3\2\2\2\u029a\u029e\7=\2"+
"\2\u029b\u029d\n\2\2\2\u029c\u029b\3\2\2\2\u029d\u02a0\3\2\2\2\u029e\u029c"+
"\3\2\2\2\u029e\u029f\3\2\2\2\u029f\u02a1\3\2\2\2\u02a0\u029e\3\2\2\2\u02a1"+
"\u02a2\bf\2\2\u02a2\u00cc\3\2\2\2\u02a3\u02a4\t\3\2\2\u02a4\u02a5\3\2"+
"\2\2\u02a5\u02a6\bg\3\2\u02a6\u00ce\3\2\2\2\u02a7\u02a9\t\2\2\2\u02a8"+
"\u02a7\3\2\2\2\u02a9\u02aa\3\2\2\2\u02aa\u02a8\3\2\2\2\u02aa\u02ab\3\2"+
"\2\2\u02ab\u00d0\3\2\2\2\u02ac\u02b0\t\4\2\2\u02ad\u02af\t\5\2\2\u02ae"+
"\u02ad\3\2\2\2\u02af\u02b2\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b0\u02b1\3\2"+
"\2\2\u02b1\u00d2\3\2\2\2\u02b2\u02b0\3\2\2\2\u02b3\u02bb\4\62;\2\u02b4"+
"\u02b6\4\63;\2\u02b5\u02b7\4\62;\2\u02b6\u02b5\3\2\2\2\u02b7\u02b8\3\2"+
"\2\2\u02b8\u02b6\3\2\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02bb\3\2\2\2\u02ba"+
"\u02b3\3\2\2\2\u02ba\u02b4\3\2\2\2\u02bb\u00d4\3\2\2\2\u02bc\u02be\7&"+
"\2\2\u02bd\u02bf\t\6\2\2\u02be\u02bd\3\2\2\2\u02bf\u02c0\3\2\2\2\u02c0"+
"\u02be\3\2\2\2\u02c0\u02c1\3\2\2\2\u02c1\u00d6\3\2\2\2\u02c2\u02c4\7\'"+
"\2\2\u02c3\u02c5\4\62\63\2\u02c4\u02c3\3\2\2\2\u02c5\u02c6\3\2\2\2\u02c6"+
"\u02c4\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u00d8\3\2\2\2\u02c8\u02ce\5\u00db"+
"n\2\u02c9\u02cb\t\7\2\2\u02ca\u02cc\t\b\2\2\u02cb\u02ca\3\2\2\2\u02cb"+
"\u02cc\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cd\u02cf\5\u00dbn\2\u02ce\u02c9"+
"\3\2\2\2\u02ce\u02cf\3\2\2\2\u02cf\u00da\3\2\2\2\u02d0\u02d2\4\62;\2\u02d1"+
"\u02d0\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d1\3\2\2\2\u02d3\u02d4\3\2"+
"\2\2\u02d4\u02db\3\2\2\2\u02d5\u02d7\7\60\2\2\u02d6\u02d8\4\62;\2\u02d7"+
"\u02d6\3\2\2\2\u02d8\u02d9\3\2\2\2\u02d9\u02d7\3\2\2\2\u02d9\u02da\3\2"+
"\2\2\u02da\u02dc\3\2\2\2\u02db\u02d5\3\2\2\2\u02db\u02dc\3\2\2\2\u02dc"+
"\u00dc\3\2\2\2\u02dd\u02de\7^\2\2\u02de\u02e2\13\2\2\2\u02df\u02e0\7^"+
"\2\2\u02e0\u02e2\5\u00cfh\2\u02e1\u02dd\3\2\2\2\u02e1\u02df\3\2\2\2\u02e2"+
"\u00de\3\2\2\2\u02e3\u02e8\7$\2\2\u02e4\u02e7\5\u00ddo\2\u02e5\u02e7\n"+
"\t\2\2\u02e6\u02e4\3\2\2\2\u02e6\u02e5\3\2\2\2\u02e7\u02ea\3\2\2\2\u02e8"+
"\u02e6\3\2\2\2\u02e8\u02e9\3\2\2\2\u02e9\u02eb\3\2\2\2\u02ea\u02e8\3\2"+
"\2\2\u02eb\u02ec\7$\2\2\u02ec\u02ed\bp\4\2\u02ed\u00e0\3\2\2\2\u02ee\u02ef"+
"\7}\2\2\u02ef\u02f0\7}\2\2\u02f0\u02f2\3\2\2\2\u02f1\u02f3\13\2\2\2\u02f2"+
"\u02f1\3\2\2\2\u02f3\u02f4\3\2\2\2\u02f4\u02f5\3\2\2\2\u02f4\u02f2\3\2"+
"\2\2\u02f5\u02f6\3\2\2\2\u02f6\u02f7\7\177\2\2\u02f7\u02f8\7\177\2\2\u02f8"+
"\u02f9\3\2\2\2\u02f9\u02fa\bq\5\2\u02fa\u00e2\3\2\2\2\25\2\u0293\u029e"+
"\u02aa\u02b0\u02b8\u02ba\u02be\u02c0\u02c6\u02cb\u02ce\u02d3\u02d9\u02db"+
"\u02e1\u02e6\u02e8\u02f4\6\2\3\2\b\2\2\3p\2\3q\3";
"k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\3\2\3\2\3\3\3"+
"\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6"+
"\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3"+
"\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\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\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\60\3\60\3\61"+
"\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\66"+
"\3\66\3\67\3\67\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3;\3;\3;\3<\3<\3<"+
"\3<\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@"+
"\3@\3@\3@\3@\3A\3A\3B\3B\3C\3C\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H"+
"\3H\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N"+
"\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3Q\3Q\3Q\3R\3R\3S\3S\3T\3T\3U\3U\3U\3V"+
"\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Z"+
"\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]"+
"\3]\3^\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3`\3a\3a"+
"\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3d\3d\3d\3e\3e\3e\3e\3e\3e"+
"\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3h\3h\7h\u02ab\nh\fh\16h\u02ae"+
"\13h\3h\3h\3h\3h\3i\3i\7i\u02b6\ni\fi\16i\u02b9\13i\3i\3i\3j\3j\3j\3j"+
"\3k\6k\u02c2\nk\rk\16k\u02c3\3l\3l\7l\u02c8\nl\fl\16l\u02cb\13l\3m\3m"+
"\3m\6m\u02d0\nm\rm\16m\u02d1\5m\u02d4\nm\3n\3n\6n\u02d8\nn\rn\16n\u02d9"+
"\3o\3o\6o\u02de\no\ro\16o\u02df\3p\3p\3p\5p\u02e5\np\3p\5p\u02e8\np\3"+
"q\6q\u02eb\nq\rq\16q\u02ec\3q\3q\6q\u02f1\nq\rq\16q\u02f2\5q\u02f5\nq"+
"\3r\3r\3r\3r\5r\u02fb\nr\3s\3s\3s\7s\u0300\ns\fs\16s\u0303\13s\3s\3s\3"+
"s\3t\3t\3t\3t\6t\u030c\nt\rt\16t\u030d\3t\3t\3t\3t\3t\3\u030d\2u\3\3\5"+
"\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21"+
"!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!"+
"A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s"+
";u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008f"+
"I\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3"+
"S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7"+
"]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cb"+
"g\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00df"+
"q\u00e1\2\u00e3\2\u00e5r\u00e7s\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2"+
"C\\aac|\6\2\62;C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2"+
"\u0322\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2"+
"\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3"+
"\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2"+
"\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2"+
"/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2"+
"\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2"+
"G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3"+
"\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2"+
"\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2"+
"m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3"+
"\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2"+
"\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2"+
"\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095"+
"\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2"+
"\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7"+
"\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2"+
"\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9"+
"\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2"+
"\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb"+
"\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2"+
"\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd"+
"\3\2\2\2\2\u00df\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\3\u00e9\3\2\2"+
"\2\5\u00eb\3\2\2\2\7\u00ed\3\2\2\2\t\u00f2\3\2\2\2\13\u00fa\3\2\2\2\r"+
"\u0104\3\2\2\2\17\u010e\3\2\2\2\21\u0117\3\2\2\2\23\u011f\3\2\2\2\25\u012b"+
"\3\2\2\2\27\u0137\3\2\2\2\31\u0142\3\2\2\2\33\u014a\3\2\2\2\35\u014c\3"+
"\2\2\2\37\u014e\3\2\2\2!\u0154\3\2\2\2#\u015b\3\2\2\2%\u0160\3\2\2\2\'"+
"\u0165\3\2\2\2)\u016b\3\2\2\2+\u016f\3\2\2\2-\u0175\3\2\2\2/\u017b\3\2"+
"\2\2\61\u0182\3\2\2\2\63\u0184\3\2\2\2\65\u0186\3\2\2\2\67\u0189\3\2\2"+
"\29\u018c\3\2\2\2;\u018f\3\2\2\2=\u0193\3\2\2\2?\u0196\3\2\2\2A\u019a"+
"\3\2\2\2C\u019d\3\2\2\2E\u01a0\3\2\2\2G\u01a3\3\2\2\2I\u01a6\3\2\2\2K"+
"\u01a9\3\2\2\2M\u01ab\3\2\2\2O\u01ad\3\2\2\2Q\u01af\3\2\2\2S\u01b1\3\2"+
"\2\2U\u01b4\3\2\2\2W\u01b6\3\2\2\2Y\u01b8\3\2\2\2[\u01bb\3\2\2\2]\u01bd"+
"\3\2\2\2_\u01bf\3\2\2\2a\u01c1\3\2\2\2c\u01c4\3\2\2\2e\u01c7\3\2\2\2g"+
"\u01ca\3\2\2\2i\u01cd\3\2\2\2k\u01cf\3\2\2\2m\u01d1\3\2\2\2o\u01d3\3\2"+
"\2\2q\u01d6\3\2\2\2s\u01db\3\2\2\2u\u01df\3\2\2\2w\u01e2\3\2\2\2y\u01e6"+
"\3\2\2\2{\u01ea\3\2\2\2}\u01f1\3\2\2\2\177\u01f7\3\2\2\2\u0081\u0200\3"+
"\2\2\2\u0083\u0202\3\2\2\2\u0085\u0204\3\2\2\2\u0087\u0206\3\2\2\2\u0089"+
"\u0208\3\2\2\2\u008b\u020b\3\2\2\2\u008d\u020e\3\2\2\2\u008f\u0211\3\2"+
"\2\2\u0091\u0214\3\2\2\2\u0093\u0217\3\2\2\2\u0095\u021a\3\2\2\2\u0097"+
"\u021d\3\2\2\2\u0099\u0220\3\2\2\2\u009b\u0225\3\2\2\2\u009d\u022b\3\2"+
"\2\2\u009f\u0230\3\2\2\2\u00a1\u0234\3\2\2\2\u00a3\u0237\3\2\2\2\u00a5"+
"\u0239\3\2\2\2\u00a7\u023b\3\2\2\2\u00a9\u023d\3\2\2\2\u00ab\u0240\3\2"+
"\2\2\u00ad\u0245\3\2\2\2\u00af\u024b\3\2\2\2\u00b1\u0251\3\2\2\2\u00b3"+
"\u0257\3\2\2\2\u00b5\u025c\3\2\2\2\u00b7\u0262\3\2\2\2\u00b9\u0268\3\2"+
"\2\2\u00bb\u026e\3\2\2\2\u00bd\u0275\3\2\2\2\u00bf\u027b\3\2\2\2\u00c1"+
"\u0282\3\2\2\2\u00c3\u0288\3\2\2\2\u00c5\u028e\3\2\2\2\u00c7\u0292\3\2"+
"\2\2\u00c9\u0295\3\2\2\2\u00cb\u029b\3\2\2\2\u00cd\u02a2\3\2\2\2\u00cf"+
"\u02a8\3\2\2\2\u00d1\u02b3\3\2\2\2\u00d3\u02bc\3\2\2\2\u00d5\u02c1\3\2"+
"\2\2\u00d7\u02c5\3\2\2\2\u00d9\u02d3\3\2\2\2\u00db\u02d5\3\2\2\2\u00dd"+
"\u02db\3\2\2\2\u00df\u02e1\3\2\2\2\u00e1\u02ea\3\2\2\2\u00e3\u02fa\3\2"+
"\2\2\u00e5\u02fc\3\2\2\2\u00e7\u0307\3\2\2\2\u00e9\u00ea\7\u0080\2\2\u00ea"+
"\4\3\2\2\2\u00eb\u00ec\7<\2\2\u00ec\6\3\2\2\2\u00ed\u00ee\7i\2\2\u00ee"+
"\u00ef\7q\2\2\u00ef\u00f0\7v\2\2\u00f0\u00f1\7q\2\2\u00f1\b\3\2\2\2\u00f2"+
"\u00f3\7\'\2\2\u00f3\u00f4\7q\2\2\u00f4\u00f5\7w\2\2\u00f5\u00f6\7v\2"+
"\2\u00f6\u00f7\7r\2\2\u00f7\u00f8\7w\2\2\u00f8\u00f9\7v\2\2\u00f9\n\3"+
"\2\2\2\u00fa\u00fb\7\'\2\2\u00fb\u00fc\7n\2\2\u00fc\u00fd\7c\2\2\u00fd"+
"\u00fe\7w\2\2\u00fe\u00ff\7p\2\2\u00ff\u0100\7e\2\2\u0100\u0101\7j\2\2"+
"\u0101\u0102\7g\2\2\u0102\u0103\7t\2\2\u0103\f\3\2\2\2\u0104\u0105\7\'"+
"\2\2\u0105\u0106\7|\2\2\u0106\u0107\7g\2\2\u0107\u0108\7t\2\2\u0108\u0109"+
"\7q\2\2\u0109\u010a\7r\2\2\u010a\u010b\7c\2\2\u010b\u010c\7i\2\2\u010c"+
"\u010d\7g\2\2\u010d\16\3\2\2\2\u010e\u010f\7\'\2\2\u010f\u0110\7c\2\2"+
"\u0110\u0111\7f\2\2\u0111\u0112\7f\2\2\u0112\u0113\7t\2\2\u0113\u0114"+
"\7g\2\2\u0114\u0115\7u\2\2\u0115\u0116\7u\2\2\u0116\20\3\2\2\2\u0117\u0118"+
"\7\'\2\2\u0118\u0119\7k\2\2\u0119\u011a\7o\2\2\u011a\u011b\7r\2\2\u011b"+
"\u011c\7q\2\2\u011c\u011d\7t\2\2\u011d\u011e\7v\2\2\u011e\22\3\2\2\2\u011f"+
"\u0120\7\'\2\2\u0120\u0121\7d\2\2\u0121\u0122\7t\2\2\u0122\u0123\7g\2"+
"\2\u0123\u0124\7c\2\2\u0124\u0125\7m\2\2\u0125\u0126\7r\2\2\u0126\u0127"+
"\7q\2\2\u0127\u0128\7k\2\2\u0128\u0129\7p\2\2\u0129\u012a\7v\2\2\u012a"+
"\24\3\2\2\2\u012b\u012c\7\'\2\2\u012c\u012d\7c\2\2\u012d\u012e\7u\2\2"+
"\u012e\u012f\7o\2\2\u012f\u0130\7k\2\2\u0130\u0131\7p\2\2\u0131\u0132"+
"\7e\2\2\u0132\u0133\7n\2\2\u0133\u0134\7w\2\2\u0134\u0135\7f\2\2\u0135"+
"\u0136\7g\2\2\u0136\26\3\2\2\2\u0137\u0138\7\'\2\2\u0138\u0139\7c\2\2"+
"\u0139\u013a\7u\2\2\u013a\u013b\7o\2\2\u013b\u013c\7d\2\2\u013c\u013d"+
"\7k\2\2\u013d\u013e\7p\2\2\u013e\u013f\7c\2\2\u013f\u0140\7t\2\2\u0140"+
"\u0141\7{\2\2\u0141\30\3\2\2\2\u0142\u0143\7\'\2\2\u0143\u0144\7q\2\2"+
"\u0144\u0145\7r\2\2\u0145\u0146\7v\2\2\u0146\u0147\7k\2\2\u0147\u0148"+
"\7q\2\2\u0148\u0149\7p\2\2\u0149\32\3\2\2\2\u014a\u014b\7.\2\2\u014b\34"+
"\3\2\2\2\u014c\u014d\7?\2\2\u014d\36\3\2\2\2\u014e\u014f\7e\2\2\u014f"+
"\u0150\7q\2\2\u0150\u0151\7p\2\2\u0151\u0152\7u\2\2\u0152\u0153\7v\2\2"+
"\u0153 \3\2\2\2\u0154\u0155\7o\2\2\u0155\u0156\7g\2\2\u0156\u0157\7o\2"+
"\2\u0157\u0158\7q\2\2\u0158\u0159\7t\2\2\u0159\u015a\7{\2\2\u015a\"\3"+
"\2\2\2\u015b\u015c\7d\2\2\u015c\u015d\7{\2\2\u015d\u015e\7v\2\2\u015e"+
"\u015f\7g\2\2\u015f$\3\2\2\2\u0160\u0161\7y\2\2\u0161\u0162\7q\2\2\u0162"+
"\u0163\7t\2\2\u0163\u0164\7f\2\2\u0164&\3\2\2\2\u0165\u0166\7h\2\2\u0166"+
"\u0167\7n\2\2\u0167\u0168\7q\2\2\u0168\u0169\7c\2\2\u0169\u016a\7v\2\2"+
"\u016a(\3\2\2\2\u016b\u016c\7u\2\2\u016c\u016d\7v\2\2\u016d\u016e\7t\2"+
"\2\u016e*\3\2\2\2\u016f\u0170\7u\2\2\u0170\u0171\7v\2\2\u0171\u0172\7"+
"t\2\2\u0172\u0173\7a\2\2\u0173\u0174\7r\2\2\u0174,\3\2\2\2\u0175\u0176"+
"\7u\2\2\u0176\u0177\7v\2\2\u0177\u0178\7t\2\2\u0178\u0179\7a\2\2\u0179"+
"\u017a\7u\2\2\u017a.\3\2\2\2\u017b\u017c\7u\2\2\u017c\u017d\7v\2\2\u017d"+
"\u017e\7t\2\2\u017e\u017f\7a\2\2\u017f\u0180\7r\2\2\u0180\u0181\7u\2\2"+
"\u0181\60\3\2\2\2\u0182\u0183\7]\2\2\u0183\62\3\2\2\2\u0184\u0185\7_\2"+
"\2\u0185\64\3\2\2\2\u0186\u0187\7-\2\2\u0187\u0188\7?\2\2\u0188\66\3\2"+
"\2\2\u0189\u018a\7/\2\2\u018a\u018b\7?\2\2\u018b8\3\2\2\2\u018c\u018d"+
"\7\61\2\2\u018d\u018e\7?\2\2\u018e:\3\2\2\2\u018f\u0190\7\61\2\2\u0190"+
"\u0191\7\61\2\2\u0191\u0192\7?\2\2\u0192<\3\2\2\2\u0193\u0194\7,\2\2\u0194"+
"\u0195\7?\2\2\u0195>\3\2\2\2\u0196\u0197\7,\2\2\u0197\u0198\7,\2\2\u0198"+
"\u0199\7?\2\2\u0199@\3\2\2\2\u019a\u019b\7(\2\2\u019b\u019c\7?\2\2\u019c"+
"B\3\2\2\2\u019d\u019e\7~\2\2\u019e\u019f\7?\2\2\u019fD\3\2\2\2\u01a0\u01a1"+
"\7`\2\2\u01a1\u01a2\7?\2\2\u01a2F\3\2\2\2\u01a3\u01a4\7-\2\2\u01a4\u01a5"+
"\7-\2\2\u01a5H\3\2\2\2\u01a6\u01a7\7/\2\2\u01a7\u01a8\7/\2\2\u01a8J\3"+
"\2\2\2\u01a9\u01aa\7*\2\2\u01aaL\3\2\2\2\u01ab\u01ac\7+\2\2\u01acN\3\2"+
"\2\2\u01ad\u01ae\7-\2\2\u01aeP\3\2\2\2\u01af\u01b0\7/\2\2\u01b0R\3\2\2"+
"\2\u01b1\u01b2\7,\2\2\u01b2\u01b3\7,\2\2\u01b3T\3\2\2\2\u01b4\u01b5\7"+
",\2\2\u01b5V\3\2\2\2\u01b6\u01b7\7\61\2\2\u01b7X\3\2\2\2\u01b8\u01b9\7"+
"\61\2\2\u01b9\u01ba\7\61\2\2\u01baZ\3\2\2\2\u01bb\u01bc\7\'\2\2\u01bc"+
"\\\3\2\2\2\u01bd\u01be\7>\2\2\u01be^\3\2\2\2\u01bf\u01c0\7@\2\2\u01c0"+
"`\3\2\2\2\u01c1\u01c2\7>\2\2\u01c2\u01c3\7?\2\2\u01c3b\3\2\2\2\u01c4\u01c5"+
"\7@\2\2\u01c5\u01c6\7?\2\2\u01c6d\3\2\2\2\u01c7\u01c8\7?\2\2\u01c8\u01c9"+
"\7?\2\2\u01c9f\3\2\2\2\u01ca\u01cb\7#\2\2\u01cb\u01cc\7?\2\2\u01cch\3"+
"\2\2\2\u01cd\u01ce\7(\2\2\u01cej\3\2\2\2\u01cf\u01d0\7`\2\2\u01d0l\3\2"+
"\2\2\u01d1\u01d2\7~\2\2\u01d2n\3\2\2\2\u01d3\u01d4\7v\2\2\u01d4\u01d5"+
"\7q\2\2\u01d5p\3\2\2\2\u01d6\u01d7\7u\2\2\u01d7\u01d8\7v\2\2\u01d8\u01d9"+
"\7g\2\2\u01d9\u01da\7r\2\2\u01dar\3\2\2\2\u01db\u01dc\7c\2\2\u01dc\u01dd"+
"\7p\2\2\u01dd\u01de\7f\2\2\u01det\3\2\2\2\u01df\u01e0\7q\2\2\u01e0\u01e1"+
"\7t\2\2\u01e1v\3\2\2\2\u01e2\u01e3\7z\2\2\u01e3\u01e4\7q\2\2\u01e4\u01e5"+
"\7t\2\2\u01e5x\3\2\2\2\u01e6\u01e7\7p\2\2\u01e7\u01e8\7q\2\2\u01e8\u01e9"+
"\7v\2\2\u01e9z\3\2\2\2\u01ea\u01eb\7t\2\2\u01eb\u01ec\7g\2\2\u01ec\u01ed"+
"\7v\2\2\u01ed\u01ee\7w\2\2\u01ee\u01ef\7t\2\2\u01ef\u01f0\7p\2\2\u01f0"+
"|\3\2\2\2\u01f1\u01f2\7d\2\2\u01f2\u01f3\7t\2\2\u01f3\u01f4\7g\2\2\u01f4"+
"\u01f5\7c\2\2\u01f5\u01f6\7m\2\2\u01f6~\3\2\2\2\u01f7\u01f8\7e\2\2\u01f8"+
"\u01f9\7q\2\2\u01f9\u01fa\7p\2\2\u01fa\u01fb\7v\2\2\u01fb\u01fc\7k\2\2"+
"\u01fc\u01fd\7p\2\2\u01fd\u01fe\7w\2\2\u01fe\u01ff\7g\2\2\u01ff\u0080"+
"\3\2\2\2\u0200\u0201\7\60\2\2\u0201\u0082\3\2\2\2\u0202\u0203\7C\2\2\u0203"+
"\u0084\3\2\2\2\u0204\u0205\7Z\2\2\u0205\u0086\3\2\2\2\u0206\u0207\7[\2"+
"\2\u0207\u0088\3\2\2\2\u0208\u0209\7C\2\2\u0209\u020a\7Z\2\2\u020a\u008a"+
"\3\2\2\2\u020b\u020c\7C\2\2\u020c\u020d\7[\2\2\u020d\u008c\3\2\2\2\u020e"+
"\u020f\7Z\2\2\u020f\u0210\7[\2\2\u0210\u008e\3\2\2\2\u0211\u0212\7R\2"+
"\2\u0212\u0213\7e\2\2\u0213\u0090\3\2\2\2\u0214\u0215\7R\2\2\u0215\u0216"+
"\7|\2\2\u0216\u0092\3\2\2\2\u0217\u0218\7R\2\2\u0218\u0219\7p\2\2\u0219"+
"\u0094\3\2\2\2\u021a\u021b\7R\2\2\u021b\u021c\7x\2\2\u021c\u0096\3\2\2"+
"\2\u021d\u021e\7\60\2\2\u021e\u021f\7y\2\2\u021f\u0098\3\2\2\2\u0220\u0221"+
"\7v\2\2\u0221\u0222\7t\2\2\u0222\u0223\7w\2\2\u0223\u0224\7g\2\2\u0224"+
"\u009a\3\2\2\2\u0225\u0226\7h\2\2\u0226\u0227\7c\2\2\u0227\u0228\7n\2"+
"\2\u0228\u0229\7u\2\2\u0229\u022a\7g\2\2\u022a\u009c\3\2\2\2\u022b\u022c"+
"\7\'\2\2\u022c\u022d\7c\2\2\u022d\u022e\7u\2\2\u022e\u022f\7o\2\2\u022f"+
"\u009e\3\2\2\2\u0230\u0231\7u\2\2\u0231\u0232\7w\2\2\u0232\u0233\7d\2"+
"\2\u0233\u00a0\3\2\2\2\u0234\u0235\7/\2\2\u0235\u0236\7@\2\2\u0236\u00a2"+
"\3\2\2\2\u0237\u0238\7}\2\2\u0238\u00a4\3\2\2\2\u0239\u023a\7\177\2\2"+
"\u023a\u00a6\3\2\2\2\u023b\u023c\7A\2\2\u023c\u00a8\3\2\2\2\u023d\u023e"+
"\7k\2\2\u023e\u023f\7h\2\2\u023f\u00aa\3\2\2\2\u0240\u0241\7g\2\2\u0241"+
"\u0242\7n\2\2\u0242\u0243\7u\2\2\u0243\u0244\7g\2\2\u0244\u00ac\3\2\2"+
"\2\u0245\u0246\7k\2\2\u0246\u0247\7h\2\2\u0247\u0248\7a\2\2\u0248\u0249"+
"\7e\2\2\u0249\u024a\7u\2\2\u024a\u00ae\3\2\2\2\u024b\u024c\7k\2\2\u024c"+
"\u024d\7h\2\2\u024d\u024e\7a\2\2\u024e\u024f\7e\2\2\u024f\u0250\7e\2\2"+
"\u0250\u00b0\3\2\2\2\u0251\u0252\7k\2\2\u0252\u0253\7h\2\2\u0253\u0254"+
"\7a\2\2\u0254\u0255\7g\2\2\u0255\u0256\7s\2\2\u0256\u00b2\3\2\2\2\u0257"+
"\u0258\7k\2\2\u0258\u0259\7h\2\2\u0259\u025a\7a\2\2\u025a\u025b\7|\2\2"+
"\u025b\u00b4\3\2\2\2\u025c\u025d\7k\2\2\u025d\u025e\7h\2\2\u025e\u025f"+
"\7a\2\2\u025f\u0260\7p\2\2\u0260\u0261\7g\2\2\u0261\u00b6\3\2\2\2\u0262"+
"\u0263\7k\2\2\u0263\u0264\7h\2\2\u0264\u0265\7a\2\2\u0265\u0266\7p\2\2"+
"\u0266\u0267\7|\2\2\u0267\u00b8\3\2\2\2\u0268\u0269\7k\2\2\u0269\u026a"+
"\7h\2\2\u026a\u026b\7a\2\2\u026b\u026c\7r\2\2\u026c\u026d\7n\2\2\u026d"+
"\u00ba\3\2\2\2\u026e\u026f\7k\2\2\u026f\u0270\7h\2\2\u0270\u0271\7a\2"+
"\2\u0271\u0272\7r\2\2\u0272\u0273\7q\2\2\u0273\u0274\7u\2\2\u0274\u00bc"+
"\3\2\2\2\u0275\u0276\7k\2\2\u0276\u0277\7h\2\2\u0277\u0278\7a\2\2\u0278"+
"\u0279\7o\2\2\u0279\u027a\7k\2\2\u027a\u00be\3\2\2\2\u027b\u027c\7k\2"+
"\2\u027c\u027d\7h\2\2\u027d\u027e\7a\2\2\u027e\u027f\7p\2\2\u027f\u0280"+
"\7g\2\2\u0280\u0281\7i\2\2\u0281\u00c0\3\2\2\2\u0282\u0283\7k\2\2\u0283"+
"\u0284\7h\2\2\u0284\u0285\7a\2\2\u0285\u0286\7x\2\2\u0286\u0287\7u\2\2"+
"\u0287\u00c2\3\2\2\2\u0288\u0289\7k\2\2\u0289\u028a\7h\2\2\u028a\u028b"+
"\7a\2\2\u028b\u028c\7x\2\2\u028c\u028d\7e\2\2\u028d\u00c4\3\2\2\2\u028e"+
"\u028f\7h\2\2\u028f\u0290\7q\2\2\u0290\u0291\7t\2\2\u0291\u00c6\3\2\2"+
"\2\u0292\u0293\7k\2\2\u0293\u0294\7p\2\2\u0294\u00c8\3\2\2\2\u0295\u0296"+
"\7y\2\2\u0296\u0297\7j\2\2\u0297\u0298\7k\2\2\u0298\u0299\7n\2\2\u0299"+
"\u029a\7g\2\2\u029a\u00ca\3\2\2\2\u029b\u029c\7t\2\2\u029c\u029d\7g\2"+
"\2\u029d\u029e\7r\2\2\u029e\u029f\7g\2\2\u029f\u02a0\7c\2\2\u02a0\u02a1"+
"\7v\2\2\u02a1\u00cc\3\2\2\2\u02a2\u02a3\7w\2\2\u02a3\u02a4\7p\2\2\u02a4"+
"\u02a5\7v\2\2\u02a5\u02a6\7k\2\2\u02a6\u02a7\7n\2\2\u02a7\u00ce\3\2\2"+
"\2\u02a8\u02ac\t\2\2\2\u02a9\u02ab\t\3\2\2\u02aa\u02a9\3\2\2\2\u02ab\u02ae"+
"\3\2\2\2\u02ac\u02aa\3\2\2\2\u02ac\u02ad\3\2\2\2\u02ad\u02af\3\2\2\2\u02ae"+
"\u02ac\3\2\2\2\u02af\u02b0\5\u00d1i\2\u02b0\u02b1\3\2\2\2\u02b1\u02b2"+
"\bh\2\2\u02b2\u00d0\3\2\2\2\u02b3\u02b7\7=\2\2\u02b4\u02b6\n\2\2\2\u02b5"+
"\u02b4\3\2\2\2\u02b6\u02b9\3\2\2\2\u02b7\u02b5\3\2\2\2\u02b7\u02b8\3\2"+
"\2\2\u02b8\u02ba\3\2\2\2\u02b9\u02b7\3\2\2\2\u02ba\u02bb\bi\2\2\u02bb"+
"\u00d2\3\2\2\2\u02bc\u02bd\t\3\2\2\u02bd\u02be\3\2\2\2\u02be\u02bf\bj"+
"\3\2\u02bf\u00d4\3\2\2\2\u02c0\u02c2\t\2\2\2\u02c1\u02c0\3\2\2\2\u02c2"+
"\u02c3\3\2\2\2\u02c3\u02c1\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4\u00d6\3\2"+
"\2\2\u02c5\u02c9\t\4\2\2\u02c6\u02c8\t\5\2\2\u02c7\u02c6\3\2\2\2\u02c8"+
"\u02cb\3\2\2\2\u02c9\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u00d8\3\2"+
"\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02d4\4\62;\2\u02cd\u02cf\4\63;\2\u02ce"+
"\u02d0\4\62;\2\u02cf\u02ce\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02cf\3\2"+
"\2\2\u02d1\u02d2\3\2\2\2\u02d2\u02d4\3\2\2\2\u02d3\u02cc\3\2\2\2\u02d3"+
"\u02cd\3\2\2\2\u02d4\u00da\3\2\2\2\u02d5\u02d7\7&\2\2\u02d6\u02d8\t\6"+
"\2\2\u02d7\u02d6\3\2\2\2\u02d8\u02d9\3\2\2\2\u02d9\u02d7\3\2\2\2\u02d9"+
"\u02da\3\2\2\2\u02da\u00dc\3\2\2\2\u02db\u02dd\7\'\2\2\u02dc\u02de\4\62"+
"\63\2\u02dd\u02dc\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02dd\3\2\2\2\u02df"+
"\u02e0\3\2\2\2\u02e0\u00de\3\2\2\2\u02e1\u02e7\5\u00e1q\2\u02e2\u02e4"+
"\t\7\2\2\u02e3\u02e5\t\b\2\2\u02e4\u02e3\3\2\2\2\u02e4\u02e5\3\2\2\2\u02e5"+
"\u02e6\3\2\2\2\u02e6\u02e8\5\u00e1q\2\u02e7\u02e2\3\2\2\2\u02e7\u02e8"+
"\3\2\2\2\u02e8\u00e0\3\2\2\2\u02e9\u02eb\4\62;\2\u02ea\u02e9\3\2\2\2\u02eb"+
"\u02ec\3\2\2\2\u02ec\u02ea\3\2\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02f4\3\2"+
"\2\2\u02ee\u02f0\7\60\2\2\u02ef\u02f1\4\62;\2\u02f0\u02ef\3\2\2\2\u02f1"+
"\u02f2\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3\u02f5\3\2"+
"\2\2\u02f4\u02ee\3\2\2\2\u02f4\u02f5\3\2\2\2\u02f5\u00e2\3\2\2\2\u02f6"+
"\u02f7\7^\2\2\u02f7\u02fb\13\2\2\2\u02f8\u02f9\7^\2\2\u02f9\u02fb\5\u00d5"+
"k\2\u02fa\u02f6\3\2\2\2\u02fa\u02f8\3\2\2\2\u02fb\u00e4\3\2\2\2\u02fc"+
"\u0301\7$\2\2\u02fd\u0300\5\u00e3r\2\u02fe\u0300\n\t\2\2\u02ff\u02fd\3"+
"\2\2\2\u02ff\u02fe\3\2\2\2\u0300\u0303\3\2\2\2\u0301\u02ff\3\2\2\2\u0301"+
"\u0302\3\2\2\2\u0302\u0304\3\2\2\2\u0303\u0301\3\2\2\2\u0304\u0305\7$"+
"\2\2\u0305\u0306\bs\4\2\u0306\u00e6\3\2\2\2\u0307\u0308\7}\2\2\u0308\u0309"+
"\7}\2\2\u0309\u030b\3\2\2\2\u030a\u030c\13\2\2\2\u030b\u030a\3\2\2\2\u030c"+
"\u030d\3\2\2\2\u030d\u030e\3\2\2\2\u030d\u030b\3\2\2\2\u030e\u030f\3\2"+
"\2\2\u030f\u0310\7\177\2\2\u0310\u0311\7\177\2\2\u0311\u0312\3\2\2\2\u0312"+
"\u0313\bt\5\2\u0313\u00e8\3\2\2\2\25\2\u02ac\u02b7\u02c3\u02c9\u02d1\u02d3"+
"\u02d7\u02d9\u02df\u02e4\u02e7\u02ec\u02f2\u02f4\u02fa\u02ff\u0301\u030d"+
"\6\2\3\2\b\2\2\3s\2\3t\3";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

File diff suppressed because it is too large Load Diff

View File

@ -312,19 +312,19 @@ Conditional Execution
Conditional execution means that the flow of execution changes based on certiain conditions,
rather than having fixed gotos or subroutine calls::
if (A > 4) goto overflow
if A>4 goto overflow
if (X == 3) Y = 4
if (X == 3) Y = 4 else A = 2
if X==3 Y = 4
if X==3 Y = 4 else A = 2
if (X == 5) {
if X==5 {
Y = 99
} else {
A = 3
}
Conditional jumps (``if (condition) goto label``) are compiled using 6502's branching instructions (such as ``bne`` and ``bcc``) so
Conditional jumps (``if condition goto label``) are compiled using 6502's branching instructions (such as ``bne`` and ``bcc``) so
the rather strict limit on how *far* it can jump applies. The compiler itself can't figure this
out unfortunately, so it is entirely possible to create code that cannot be assembled successfully.
You'll have to restructure your gotos in the code (place target labels closer to the branch)

View File

@ -457,7 +457,7 @@ The loop variable must be a register or a variable defined in the local scope.
The expression that you loop over can be anything that supports iteration (such as ranges like ``0 to 100``,
array variables and strings).
::
You can use a single statement, or a statement block like in the example below::
for <loopvar> in <expression> [ step <amount> ] {
; do something...
@ -468,9 +468,9 @@ array variables and strings).
while loop
^^^^^^^^^^
.. todo:: not implemented yet, for now you can use the if statement with gotos to implement a while-loop.
::
As long as the condition is true (1), repeat the given statement(s).
You can use a single statement, or a statement block like in the example below::
while <condition> {
; do something...
@ -479,12 +479,11 @@ while loop
}
repeat--until loop
^^^^^^^^^^^^^^^^^^
.. todo:: not implemented yet, for now you can use the if statement with gotos to implement a repeat-loop.
::
Until the given condition is true (1), repeat the given statement(s).
You can use a single statement, or a statement block like in the example below::
repeat {
; do something...
@ -515,11 +514,11 @@ Conditional execution
With the 'if' / 'else' statement you can execute code depending on the value of a condition::
if ( <expression> ) <statements> [else <statements> ]
if <expression> <statements> [else <statements> ]
where <statements> can be just a single statement for instance just a ``goto``, or it can be a block such as this::
if ( <expression> ) {
if <expression> {
<statements>
} else {
<alternative statements>