From 68037e44256bf9a599cf45c14aa98c3d87b4d296 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sun, 23 Sep 2018 02:04:45 +0200 Subject: [PATCH] implemented while and repeat loops --- compiler/antlr/prog8.g4 | 13 +- compiler/examples/test.p8 | 61 +- compiler/src/prog8/ast/AST.kt | 106 +- compiler/src/prog8/ast/AstChecker.kt | 13 +- compiler/src/prog8/compiler/Compiler.kt | 69 +- .../prog8/optimizing/StatementOptimizer.kt | 34 + compiler/src/prog8/parser/prog8Lexer.java | 515 +++---- compiler/src/prog8/parser/prog8Parser.java | 1249 ++++++++++------- docs/source/programming.rst | 10 +- docs/source/syntaxreference.rst | 15 +- 10 files changed, 1236 insertions(+), 849 deletions(-) diff --git a/compiler/antlr/prog8.g4 b/compiler/antlr/prog8.g4 index 4cd24d42f..ae6499cda 100644 --- a/compiler/antlr/prog8.g4 +++ b/compiler/antlr/prog8.g4 @@ -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 ; diff --git a/compiler/examples/test.p8 b/compiler/examples/test.p8 index 644e27890..30933a99a 100644 --- a/compiler/examples/test.p8 +++ b/compiler/examples/test.p8 @@ -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) } } diff --git a/compiler/src/prog8/ast/AST.kt b/compiler/src/prog8/ast/AST.kt index 57bb0e8a5..5eb018c56 100644 --- a/compiler/src/prog8/ast/AST.kt +++ b/compiler/src/prog8/ast/AST.kt @@ -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, + 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, + 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, + 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, - 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()) +} diff --git a/compiler/src/prog8/ast/AstChecker.kt b/compiler/src/prog8/ast/AstChecker.kt index b5c9cba40..41c55e0f3 100644 --- a/compiler/src/prog8/ast/AstChecker.kt +++ b/compiler/src/prog8/ast/AstChecker.kt @@ -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 -> { diff --git a/compiler/src/prog8/compiler/Compiler.kt b/compiler/src/prog8/compiler/Compiler.kt index 2847b2148..08a6f64b5 100644 --- a/compiler/src/prog8/compiler/Compiler.kt +++ b/compiler/src/prog8/compiler/Compiler.kt @@ -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?, register: Register?, varDt: DataType, range: RangeExpr, body: MutableList) { - /** + /* * 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: + * + * 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: + * + * 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() + } } diff --git a/compiler/src/prog8/optimizing/StatementOptimizer.kt b/compiler/src/prog8/optimizing/StatementOptimizer.kt index ecadaa23b..d37ab52d0 100644 --- a/compiler/src/prog8/optimizing/StatementOptimizer.kt +++ b/compiler/src/prog8/optimizing/StatementOptimizer.kt @@ -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 diff --git a/compiler/src/prog8/parser/prog8Lexer.java b/compiler/src/prog8/parser/prog8Lexer.java index e179b08e3..1e22cce95 100644 --- a/compiler/src/prog8/parser/prog8Lexer.java +++ b/compiler/src/prog8/parser/prog8Lexer.java @@ -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{?}@\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{?}@\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 { diff --git a/compiler/src/prog8/parser/prog8Parser.java b/compiler/src/prog8/parser/prog8Parser.java index e9f1c35b7..3d82f60da 100644 --- a/compiler/src/prog8/parser/prog8Parser.java +++ b/compiler/src/prog8/parser/prog8Parser.java @@ -30,9 +30,9 @@ public class prog8Parser extends Parser { 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 final int RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3, RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7, @@ -47,7 +47,7 @@ public class prog8Parser extends Parser { RULE_literalvalue = 35, RULE_inlineasm = 36, RULE_subroutine = 37, RULE_statement_block = 38, RULE_sub_address = 39, RULE_sub_params = 40, RULE_sub_param = 41, RULE_sub_returns = 42, RULE_sub_return = 43, RULE_if_stmt = 44, RULE_else_part = 45, RULE_branch_stmt = 46, - RULE_branchcondition = 47, RULE_forloop = 48; + RULE_branchcondition = 47, RULE_forloop = 48, RULE_whileloop = 49, RULE_repeatloop = 50; public static final String[] ruleNames = { "module", "modulestatement", "block", "statement", "labeldef", "unconditionaljump", "directive", "directivearg", "vardecl", "varinitializer", "constdecl", @@ -58,7 +58,7 @@ public class prog8Parser extends Parser { "booleanliteral", "arrayliteral", "stringliteral", "floatliteral", "literalvalue", "inlineasm", "subroutine", "statement_block", "sub_address", "sub_params", "sub_param", "sub_returns", "sub_return", "if_stmt", "else_part", "branch_stmt", - "branchcondition", "forloop" + "branchcondition", "forloop", "whileloop", "repeatloop" }; private static final String[] _LITERAL_NAMES = { @@ -74,7 +74,7 @@ public class prog8Parser extends Parser { "'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, @@ -85,9 +85,9 @@ public class prog8Parser extends Parser { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, "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); @@ -163,12 +163,12 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(102); + setState(106); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11))) != 0) || _la==EOL) { { - setState(100); + setState(104); _errHandler.sync(this); switch (_input.LA(1)) { case T__0: @@ -182,13 +182,13 @@ public class prog8Parser extends Parser { case T__10: case T__11: { - setState(98); + setState(102); modulestatement(); } break; case EOL: { - setState(99); + setState(103); match(EOL); } break; @@ -196,11 +196,11 @@ public class prog8Parser extends Parser { throw new NoViableAltException(this); } } - setState(104); + setState(108); _errHandler.sync(this); _la = _input.LA(1); } - setState(105); + setState(109); match(EOF); } } @@ -232,7 +232,7 @@ public class prog8Parser extends Parser { ModulestatementContext _localctx = new ModulestatementContext(_ctx, getState()); enterRule(_localctx, 2, RULE_modulestatement); try { - setState(109); + setState(113); _errHandler.sync(this); switch (_input.LA(1)) { case T__3: @@ -246,14 +246,14 @@ public class prog8Parser extends Parser { case T__11: enterOuterAlt(_localctx, 1); { - setState(107); + setState(111); directive(); } break; case T__0: enterOuterAlt(_localctx, 2); { - setState(108); + setState(112); block(); } break; @@ -296,23 +296,23 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(111); + setState(115); match(T__0); - setState(112); + setState(116); identifier(); - setState(114); + setState(118); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 105)) & ~0x3f) == 0 && ((1L << (_la - 105)) & ((1L << (DEC_INTEGER - 105)) | (1L << (HEX_INTEGER - 105)) | (1L << (BIN_INTEGER - 105)))) != 0)) { + if (((((_la - 108)) & ~0x3f) == 0 && ((1L << (_la - 108)) & ((1L << (DEC_INTEGER - 108)) | (1L << (HEX_INTEGER - 108)) | (1L << (BIN_INTEGER - 108)))) != 0)) { { - setState(113); + setState(117); integerliteral(); } } - setState(116); + setState(120); statement_block(); - setState(117); + setState(121); match(EOL); } } @@ -376,6 +376,12 @@ public class prog8Parser extends Parser { public ForloopContext forloop() { return getRuleContext(ForloopContext.class,0); } + public WhileloopContext whileloop() { + return getRuleContext(WhileloopContext.class,0); + } + public RepeatloopContext repeatloop() { + return getRuleContext(RepeatloopContext.class,0); + } public BreakstmtContext breakstmt() { return getRuleContext(BreakstmtContext.class,0); } @@ -395,139 +401,153 @@ public class prog8Parser extends Parser { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 6, RULE_statement); try { - setState(138); + setState(144); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(119); + setState(123); directive(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(120); + setState(124); varinitializer(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(121); + setState(125); vardecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(122); + setState(126); constdecl(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(123); + setState(127); memoryvardecl(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(124); + setState(128); assignment(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(125); + setState(129); augassignment(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(126); + setState(130); unconditionaljump(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(127); + setState(131); postincrdecr(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(128); + setState(132); functioncall_stmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(129); + setState(133); if_stmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(130); + setState(134); branch_stmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(131); + setState(135); subroutine(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(132); + setState(136); inlineasm(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(133); + setState(137); returnstmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(134); + setState(138); forloop(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(135); - breakstmt(); + setState(139); + whileloop(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(136); - continuestmt(); + setState(140); + repeatloop(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(137); + setState(141); + breakstmt(); + } + break; + case 20: + enterOuterAlt(_localctx, 20); + { + setState(142); + continuestmt(); + } + break; + case 21: + enterOuterAlt(_localctx, 21); + { + setState(143); labeldef(); } break; @@ -560,9 +580,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(140); + setState(146); identifier(); - setState(141); + setState(147); match(T__1); } } @@ -599,26 +619,26 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(143); + setState(149); match(T__2); - setState(147); + setState(153); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { case 1: { - setState(144); + setState(150); integerliteral(); } break; case 2: { - setState(145); + setState(151); identifier(); } break; case 3: { - setState(146); + setState(152); scoped_identifier(); } break; @@ -657,7 +677,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(149); + setState(155); ((DirectiveContext)_localctx).directivename = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11))) != 0)) ) { @@ -668,17 +688,17 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(161); + setState(167); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { case 1: { - setState(151); + setState(157); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: { - setState(150); + setState(156); directivearg(); } break; @@ -687,21 +707,21 @@ public class prog8Parser extends Parser { break; case 2: { - setState(153); + setState(159); directivearg(); - setState(158); + setState(164); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(154); + setState(160); match(T__12); - setState(155); + setState(161); directivearg(); } } - setState(160); + setState(166); _errHandler.sync(this); _la = _input.LA(1); } @@ -741,20 +761,20 @@ public class prog8Parser extends Parser { DirectiveargContext _localctx = new DirectiveargContext(_ctx, getState()); enterRule(_localctx, 14, RULE_directivearg); try { - setState(166); + setState(172); _errHandler.sync(this); switch (_input.LA(1)) { case STRING: enterOuterAlt(_localctx, 1); { - setState(163); + setState(169); stringliteral(); } break; case NAME: enterOuterAlt(_localctx, 2); { - setState(164); + setState(170); identifier(); } break; @@ -763,7 +783,7 @@ public class prog8Parser extends Parser { case BIN_INTEGER: enterOuterAlt(_localctx, 3); { - setState(165); + setState(171); integerliteral(); } break; @@ -805,19 +825,19 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(168); + setState(174); datatype(); - setState(170); + setState(176); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__23) { { - setState(169); + setState(175); arrayspec(); } } - setState(172); + setState(178); identifier(); } } @@ -858,23 +878,23 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(174); + setState(180); datatype(); - setState(176); + setState(182); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__23) { { - setState(175); + setState(181); arrayspec(); } } - setState(178); + setState(184); identifier(); - setState(179); + setState(185); match(T__13); - setState(180); + setState(186); expression(0); } } @@ -905,9 +925,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(182); + setState(188); match(T__14); - setState(183); + setState(189); varinitializer(); } } @@ -938,9 +958,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(185); + setState(191); match(T__15); - setState(186); + setState(192); varinitializer(); } } @@ -969,7 +989,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(188); + setState(194); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0)) ) { _errHandler.recoverInline(this); @@ -1012,23 +1032,23 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(190); + setState(196); match(T__23); - setState(191); + setState(197); expression(0); - setState(194); + setState(200); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(192); + setState(198); match(T__12); - setState(193); + setState(199); expression(0); } } - setState(196); + setState(202); match(T__24); } } @@ -1062,11 +1082,11 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(198); + setState(204); assign_target(); - setState(199); + setState(205); match(T__13); - setState(200); + setState(206); expression(0); } } @@ -1102,9 +1122,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(202); + setState(208); assign_target(); - setState(203); + setState(209); ((AugassignmentContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33))) != 0)) ) { @@ -1115,7 +1135,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(204); + setState(210); expression(0); } } @@ -1150,27 +1170,27 @@ public class prog8Parser extends Parser { Assign_targetContext _localctx = new Assign_targetContext(_ctx, getState()); enterRule(_localctx, 32, RULE_assign_target); try { - setState(209); + setState(215); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(206); + setState(212); register(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(207); + setState(213); identifier(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(208); + setState(214); scoped_identifier(); } break; @@ -1205,9 +1225,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(211); + setState(217); assign_target(); - setState(212); + setState(218); ((PostincrdecrContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__34 || _la==T__35) ) { @@ -1285,28 +1305,28 @@ public class prog8Parser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(228); + setState(234); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: { - setState(215); + setState(221); match(T__36); - setState(216); + setState(222); expression(0); - setState(217); + setState(223); match(T__37); } break; case 2: { - setState(219); + setState(225); functioncall(); } break; case 3: { - setState(220); + setState(226); ((ExpressionContext)_localctx).prefix = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__38) | (1L << T__39))) != 0)) ) { @@ -1317,45 +1337,45 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(221); + setState(227); expression(18); } break; case 4: { - setState(222); + setState(228); ((ExpressionContext)_localctx).prefix = match(T__59); - setState(223); + setState(229); expression(5); } break; case 5: { - setState(224); + setState(230); literalvalue(); } break; case 6: { - setState(225); + setState(231); register(); } break; case 7: { - setState(226); + setState(232); identifier(); } break; case 8: { - setState(227); + setState(233); scoped_identifier(); } break; } _ctx.stop = _input.LT(-1); - setState(274); + setState(280); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1363,7 +1383,7 @@ public class prog8Parser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(272); + setState(278); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: @@ -1372,11 +1392,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(230); + setState(236); if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); - setState(231); + setState(237); ((ExpressionContext)_localctx).bop = match(T__40); - setState(232); + setState(238); ((ExpressionContext)_localctx).right = expression(18); } break; @@ -1386,9 +1406,9 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(233); + setState(239); if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); - setState(234); + setState(240); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44))) != 0)) ) { @@ -1399,7 +1419,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(235); + setState(241); ((ExpressionContext)_localctx).right = expression(17); } break; @@ -1409,9 +1429,9 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(236); + setState(242); if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); - setState(237); + setState(243); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__38 || _la==T__39) ) { @@ -1422,7 +1442,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(238); + setState(244); ((ExpressionContext)_localctx).right = expression(16); } break; @@ -1432,9 +1452,9 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(239); + setState(245); if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); - setState(240); + setState(246); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { @@ -1445,7 +1465,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(241); + setState(247); ((ExpressionContext)_localctx).right = expression(15); } break; @@ -1455,9 +1475,9 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(242); + setState(248); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(243); + setState(249); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__49 || _la==T__50) ) { @@ -1468,7 +1488,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(244); + setState(250); ((ExpressionContext)_localctx).right = expression(14); } break; @@ -1478,11 +1498,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(245); + setState(251); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(246); + setState(252); ((ExpressionContext)_localctx).bop = match(T__51); - setState(247); + setState(253); ((ExpressionContext)_localctx).right = expression(13); } break; @@ -1492,11 +1512,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(248); + setState(254); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(249); + setState(255); ((ExpressionContext)_localctx).bop = match(T__52); - setState(250); + setState(256); ((ExpressionContext)_localctx).right = expression(12); } break; @@ -1506,11 +1526,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(251); + setState(257); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(252); + setState(258); ((ExpressionContext)_localctx).bop = match(T__53); - setState(253); + setState(259); ((ExpressionContext)_localctx).right = expression(11); } break; @@ -1520,11 +1540,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(254); + setState(260); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(255); + setState(261); ((ExpressionContext)_localctx).bop = match(T__56); - setState(256); + setState(262); ((ExpressionContext)_localctx).right = expression(9); } break; @@ -1534,11 +1554,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(257); + setState(263); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(258); + setState(264); ((ExpressionContext)_localctx).bop = match(T__57); - setState(259); + setState(265); ((ExpressionContext)_localctx).right = expression(8); } break; @@ -1548,11 +1568,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(260); + setState(266); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(261); + setState(267); ((ExpressionContext)_localctx).bop = match(T__58); - setState(262); + setState(268); ((ExpressionContext)_localctx).right = expression(7); } break; @@ -1560,9 +1580,9 @@ public class prog8Parser extends Parser { { _localctx = new ExpressionContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(263); + setState(269); if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)"); - setState(264); + setState(270); arrayspec(); } break; @@ -1572,20 +1592,20 @@ public class prog8Parser extends Parser { _localctx.rangefrom = _prevctx; _localctx.rangefrom = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(265); + setState(271); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(266); + setState(272); match(T__54); - setState(267); + setState(273); ((ExpressionContext)_localctx).rangeto = expression(0); - setState(270); + setState(276); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(268); + setState(274); match(T__55); - setState(269); + setState(275); ((ExpressionContext)_localctx).rangestep = expression(0); } break; @@ -1595,7 +1615,7 @@ public class prog8Parser extends Parser { } } } - setState(276); + setState(282); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } @@ -1635,35 +1655,35 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(279); + setState(285); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { case 1: { - setState(277); + setState(283); identifier(); } break; case 2: { - setState(278); + setState(284); scoped_identifier(); } break; } - setState(281); + setState(287); match(T__36); - setState(283); + setState(289); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__36) | (1L << T__38) | (1L << T__39) | (1L << T__59))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__75 - 65)) | (1L << (T__76 - 65)) | (1L << (NAME - 65)) | (1L << (DEC_INTEGER - 65)) | (1L << (HEX_INTEGER - 65)) | (1L << (BIN_INTEGER - 65)) | (1L << (FLOAT_NUMBER - 65)) | (1L << (STRING - 65)))) != 0)) { { - setState(282); + setState(288); expression_list(); } } - setState(285); + setState(291); match(T__37); } } @@ -1701,35 +1721,35 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(289); + setState(295); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { case 1: { - setState(287); + setState(293); identifier(); } break; case 2: { - setState(288); + setState(294); scoped_identifier(); } break; } - setState(291); + setState(297); match(T__36); - setState(293); + setState(299); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__36) | (1L << T__38) | (1L << T__39) | (1L << T__59))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__75 - 65)) | (1L << (T__76 - 65)) | (1L << (NAME - 65)) | (1L << (DEC_INTEGER - 65)) | (1L << (HEX_INTEGER - 65)) | (1L << (BIN_INTEGER - 65)) | (1L << (FLOAT_NUMBER - 65)) | (1L << (STRING - 65)))) != 0)) { { - setState(292); + setState(298); expression_list(); } } - setState(295); + setState(301); match(T__37); } } @@ -1764,21 +1784,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(297); + setState(303); expression(0); - setState(302); + setState(308); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(298); + setState(304); match(T__12); - setState(299); + setState(305); expression(0); } } - setState(304); + setState(310); _errHandler.sync(this); _la = _input.LA(1); } @@ -1811,14 +1831,14 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(305); + setState(311); match(T__60); - setState(307); + setState(313); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { case 1: { - setState(306); + setState(312); expression_list(); } break; @@ -1849,7 +1869,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(309); + setState(315); match(T__61); } } @@ -1877,7 +1897,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(311); + setState(317); match(T__62); } } @@ -1906,7 +1926,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(313); + setState(319); match(NAME); } } @@ -1939,9 +1959,9 @@ public class prog8Parser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(315); + setState(321); match(NAME); - setState(318); + setState(324); _errHandler.sync(this); _alt = 1; do { @@ -1949,9 +1969,9 @@ public class prog8Parser extends Parser { case 1: { { - setState(316); + setState(322); match(T__63); - setState(317); + setState(323); match(NAME); } } @@ -1959,7 +1979,7 @@ public class prog8Parser extends Parser { default: throw new NoViableAltException(this); } - setState(320); + setState(326); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,24,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -1990,7 +2010,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(322); + setState(328); _la = _input.LA(1); if ( !(((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)))) != 0)) ) { _errHandler.recoverInline(this); @@ -2027,7 +2047,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(324); + setState(330); _la = _input.LA(1); if ( !(((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (T__70 - 71)) | (1L << (T__71 - 71)) | (1L << (T__72 - 71)) | (1L << (T__73 - 71)))) != 0)) ) { _errHandler.recoverInline(this); @@ -2071,10 +2091,10 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(326); + setState(332); ((IntegerliteralContext)_localctx).intpart = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 105)) & ~0x3f) == 0 && ((1L << (_la - 105)) & ((1L << (DEC_INTEGER - 105)) | (1L << (HEX_INTEGER - 105)) | (1L << (BIN_INTEGER - 105)))) != 0)) ) { + if ( !(((((_la - 108)) & ~0x3f) == 0 && ((1L << (_la - 108)) & ((1L << (DEC_INTEGER - 108)) | (1L << (HEX_INTEGER - 108)) | (1L << (BIN_INTEGER - 108)))) != 0)) ) { ((IntegerliteralContext)_localctx).intpart = (Token)_errHandler.recoverInline(this); } else { @@ -2082,12 +2102,12 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(328); + setState(334); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { case 1: { - setState(327); + setState(333); wordsuffix(); } break; @@ -2118,7 +2138,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(330); + setState(336); match(T__74); } } @@ -2147,7 +2167,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(332); + setState(338); _la = _input.LA(1); if ( !(_la==T__75 || _la==T__76) ) { _errHandler.recoverInline(this); @@ -2190,27 +2210,27 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(334); - match(T__23); - setState(335); - expression(0); setState(340); + match(T__23); + setState(341); + expression(0); + setState(346); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(336); + setState(342); match(T__12); - setState(337); + setState(343); expression(0); } } - setState(342); + setState(348); _errHandler.sync(this); _la = _input.LA(1); } - setState(343); + setState(349); match(T__24); } } @@ -2239,7 +2259,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(345); + setState(351); match(STRING); } } @@ -2268,7 +2288,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(347); + setState(353); match(FLOAT_NUMBER); } } @@ -2309,7 +2329,7 @@ public class prog8Parser extends Parser { LiteralvalueContext _localctx = new LiteralvalueContext(_ctx, getState()); enterRule(_localctx, 70, RULE_literalvalue); try { - setState(354); + setState(360); _errHandler.sync(this); switch (_input.LA(1)) { case DEC_INTEGER: @@ -2317,7 +2337,7 @@ public class prog8Parser extends Parser { case BIN_INTEGER: enterOuterAlt(_localctx, 1); { - setState(349); + setState(355); integerliteral(); } break; @@ -2325,28 +2345,28 @@ public class prog8Parser extends Parser { case T__76: enterOuterAlt(_localctx, 2); { - setState(350); + setState(356); booleanliteral(); } break; case T__23: enterOuterAlt(_localctx, 3); { - setState(351); + setState(357); arrayliteral(); } break; case STRING: enterOuterAlt(_localctx, 4); { - setState(352); + setState(358); stringliteral(); } break; case FLOAT_NUMBER: enterOuterAlt(_localctx, 5); { - setState(353); + setState(359); floatliteral(); } break; @@ -2379,9 +2399,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(356); + setState(362); match(T__77); - setState(357); + setState(363); match(INLINEASMBLOCK); } } @@ -2426,55 +2446,55 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(359); - match(T__78); - setState(360); - identifier(); - setState(361); - match(T__36); - setState(363); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==NAME) { - { - setState(362); - sub_params(); - } - } - setState(365); - match(T__37); + match(T__78); setState(366); - match(T__79); + identifier(); setState(367); match(T__36); setState(369); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__70 - 65)) | (1L << (T__71 - 65)) | (1L << (T__72 - 65)) | (1L << (T__73 - 65)) | (1L << (T__82 - 65)))) != 0)) { + if (_la==NAME) { { setState(368); - sub_returns(); + sub_params(); } } setState(371); match(T__37); - setState(376); + setState(372); + match(T__79); + setState(373); + match(T__36); + setState(375); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__70 - 65)) | (1L << (T__71 - 65)) | (1L << (T__72 - 65)) | (1L << (T__73 - 65)) | (1L << (T__82 - 65)))) != 0)) { + { + setState(374); + sub_returns(); + } + } + + setState(377); + match(T__37); + setState(382); _errHandler.sync(this); switch (_input.LA(1)) { case T__13: { - setState(372); + setState(378); sub_address(); } break; case T__80: { { - setState(373); + setState(379); statement_block(); - setState(374); + setState(380); match(EOL); } } @@ -2519,16 +2539,16 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(378); - match(T__80); - setState(379); - match(EOL); setState(384); + match(T__80); + setState(385); + match(EOL); + setState(390); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__77 - 65)) | (1L << (T__78 - 65)) | (1L << (T__83 - 65)) | (1L << (T__85 - 65)) | (1L << (T__86 - 65)) | (1L << (T__87 - 65)) | (1L << (T__88 - 65)) | (1L << (T__89 - 65)) | (1L << (T__90 - 65)) | (1L << (T__91 - 65)) | (1L << (T__92 - 65)) | (1L << (T__93 - 65)) | (1L << (T__94 - 65)) | (1L << (T__95 - 65)) | (1L << (T__96 - 65)) | (1L << (T__97 - 65)) | (1L << (EOL - 65)) | (1L << (NAME - 65)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__77 - 65)) | (1L << (T__78 - 65)) | (1L << (T__83 - 65)) | (1L << (T__85 - 65)) | (1L << (T__86 - 65)) | (1L << (T__87 - 65)) | (1L << (T__88 - 65)) | (1L << (T__89 - 65)) | (1L << (T__90 - 65)) | (1L << (T__91 - 65)) | (1L << (T__92 - 65)) | (1L << (T__93 - 65)) | (1L << (T__94 - 65)) | (1L << (T__95 - 65)) | (1L << (T__96 - 65)) | (1L << (T__97 - 65)) | (1L << (T__99 - 65)) | (1L << (T__100 - 65)) | (1L << (EOL - 65)) | (1L << (NAME - 65)))) != 0)) { { - setState(382); + setState(388); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -2575,15 +2595,17 @@ public class prog8Parser extends Parser { case T__95: case T__96: case T__97: + case T__99: + case T__100: case NAME: { - setState(380); + setState(386); statement(); } break; case EOL: { - setState(381); + setState(387); match(EOL); } break; @@ -2591,11 +2613,11 @@ public class prog8Parser extends Parser { throw new NoViableAltException(this); } } - setState(386); + setState(392); _errHandler.sync(this); _la = _input.LA(1); } - setState(387); + setState(393); match(T__81); } } @@ -2626,9 +2648,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(389); + setState(395); match(T__13); - setState(390); + setState(396); integerliteral(); } } @@ -2663,21 +2685,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(392); + setState(398); sub_param(); - setState(397); + setState(403); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(393); + setState(399); match(T__12); - setState(394); + setState(400); sub_param(); } } - setState(399); + setState(405); _errHandler.sync(this); _la = _input.LA(1); } @@ -2716,11 +2738,11 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(400); + setState(406); identifier(); - setState(401); + setState(407); match(T__1); - setState(404); + setState(410); _errHandler.sync(this); switch (_input.LA(1)) { case T__64: @@ -2730,7 +2752,7 @@ public class prog8Parser extends Parser { case T__68: case T__69: { - setState(402); + setState(408); register(); } break; @@ -2739,7 +2761,7 @@ public class prog8Parser extends Parser { case T__72: case T__73: { - setState(403); + setState(409); statusflag(); } break; @@ -2777,13 +2799,13 @@ public class prog8Parser extends Parser { enterRule(_localctx, 84, RULE_sub_returns); int _la; try { - setState(415); + setState(421); _errHandler.sync(this); switch (_input.LA(1)) { case T__82: enterOuterAlt(_localctx, 1); { - setState(406); + setState(412); match(T__82); } break; @@ -2800,21 +2822,21 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 2); { { - setState(407); + setState(413); sub_return(); - setState(412); + setState(418); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(408); + setState(414); match(T__12); - setState(409); + setState(415); sub_return(); } } - setState(414); + setState(420); _errHandler.sync(this); _la = _input.LA(1); } @@ -2856,7 +2878,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(419); + setState(425); _errHandler.sync(this); switch (_input.LA(1)) { case T__64: @@ -2866,7 +2888,7 @@ public class prog8Parser extends Parser { case T__68: case T__69: { - setState(417); + setState(423); register(); } break; @@ -2875,19 +2897,19 @@ public class prog8Parser extends Parser { case T__72: case T__73: { - setState(418); + setState(424); statusflag(); } break; default: throw new NoViableAltException(this); } - setState(422); + setState(428); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__82) { { - setState(421); + setState(427); match(T__82); } } @@ -2935,25 +2957,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(424); + setState(430); match(T__83); - setState(425); - match(T__36); - setState(426); + setState(431); expression(0); - setState(427); - match(T__37); - setState(429); + setState(433); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(428); + setState(432); match(EOL); } } - setState(433); + setState(437); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3000,42 +3018,44 @@ public class prog8Parser extends Parser { case T__95: case T__96: case T__97: + case T__99: + case T__100: case NAME: { - setState(431); + setState(435); statement(); } break; case T__80: { - setState(432); + setState(436); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(436); + setState(440); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { case 1: { - setState(435); + setState(439); match(EOL); } break; } - setState(439); + setState(443); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__84) { { - setState(438); + setState(442); else_part(); } } - setState(441); + setState(445); match(EOL); } } @@ -3071,19 +3091,19 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(443); + setState(447); match(T__84); - setState(445); + setState(449); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(444); + setState(448); match(EOL); } } - setState(449); + setState(453); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3130,15 +3150,17 @@ public class prog8Parser extends Parser { case T__95: case T__96: case T__97: + case T__99: + case T__100: case NAME: { - setState(447); + setState(451); statement(); } break; case T__80: { - setState(448); + setState(452); statement_block(); } break; @@ -3188,19 +3210,19 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(451); + setState(455); branchcondition(); - setState(453); + setState(457); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(452); + setState(456); match(EOL); } } - setState(457); + setState(461); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3247,42 +3269,44 @@ public class prog8Parser extends Parser { case T__95: case T__96: case T__97: + case T__99: + case T__100: case NAME: { - setState(455); + setState(459); statement(); } break; case T__80: { - setState(456); + setState(460); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(460); + setState(464); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(459); + setState(463); match(EOL); } break; } - setState(463); + setState(467); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__84) { { - setState(462); + setState(466); else_part(); } } - setState(465); + setState(469); match(EOL); } } @@ -3311,7 +3335,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(467); + setState(471); _la = _input.LA(1); if ( !(((((_la - 86)) & ~0x3f) == 0 && ((1L << (_la - 86)) & ((1L << (T__85 - 86)) | (1L << (T__86 - 86)) | (1L << (T__87 - 86)) | (1L << (T__88 - 86)) | (1L << (T__89 - 86)) | (1L << (T__90 - 86)) | (1L << (T__91 - 86)) | (1L << (T__92 - 86)) | (1L << (T__93 - 86)) | (1L << (T__94 - 86)) | (1L << (T__95 - 86)) | (1L << (T__96 - 86)))) != 0)) ) { _errHandler.recoverInline(this); @@ -3341,16 +3365,13 @@ public class prog8Parser extends Parser { public Statement_blockContext statement_block() { return getRuleContext(Statement_blockContext.class,0); } - public List EOL() { return getTokens(prog8Parser.EOL); } - public TerminalNode EOL(int i) { - return getToken(prog8Parser.EOL, i); - } public RegisterContext register() { return getRuleContext(RegisterContext.class,0); } public IdentifierContext identifier() { return getRuleContext(IdentifierContext.class,0); } + public TerminalNode EOL() { return getToken(prog8Parser.EOL, 0); } public ForloopContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -3364,9 +3385,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(469); + setState(473); match(T__97); - setState(472); + setState(476); _errHandler.sync(this); switch (_input.LA(1)) { case T__64: @@ -3376,37 +3397,267 @@ public class prog8Parser extends Parser { case T__68: case T__69: { - setState(470); + setState(474); register(); } break; case NAME: { - setState(471); + setState(475); identifier(); } break; default: throw new NoViableAltException(this); } - setState(474); + setState(478); match(T__98); - setState(475); + setState(479); expression(0); - setState(477); + setState(481); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(476); + setState(480); match(EOL); } } - setState(479); + setState(483); statement_block(); - setState(480); - match(EOL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class WhileloopContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public Statement_blockContext statement_block() { + return getRuleContext(Statement_blockContext.class,0); + } + public TerminalNode EOL() { return getToken(prog8Parser.EOL, 0); } + public WhileloopContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_whileloop; } + } + + public final WhileloopContext whileloop() throws RecognitionException { + WhileloopContext _localctx = new WhileloopContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_whileloop); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(485); + match(T__99); + setState(486); + expression(0); + setState(488); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOL) { + { + setState(487); + match(EOL); + } + } + + setState(492); + _errHandler.sync(this); + switch (_input.LA(1)) { + case T__2: + case T__3: + case T__4: + case T__5: + case T__6: + case T__7: + case T__8: + case T__9: + case T__10: + case T__11: + case T__14: + case T__15: + case T__16: + case T__17: + case T__18: + case T__19: + case T__20: + case T__21: + case T__22: + case T__60: + case T__61: + case T__62: + case T__64: + case T__65: + case T__66: + case T__67: + case T__68: + case T__69: + case T__77: + case T__78: + case T__83: + case T__85: + case T__86: + case T__87: + case T__88: + case T__89: + case T__90: + case T__91: + case T__92: + case T__93: + case T__94: + case T__95: + case T__96: + case T__97: + case T__99: + case T__100: + case NAME: + { + setState(490); + statement(); + } + break; + case T__80: + { + setState(491); + statement_block(); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RepeatloopContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public Statement_blockContext statement_block() { + return getRuleContext(Statement_blockContext.class,0); + } + public TerminalNode EOL() { return getToken(prog8Parser.EOL, 0); } + public RepeatloopContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_repeatloop; } + } + + public final RepeatloopContext repeatloop() throws RecognitionException { + RepeatloopContext _localctx = new RepeatloopContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_repeatloop); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(494); + match(T__100); + setState(497); + _errHandler.sync(this); + switch (_input.LA(1)) { + case T__2: + case T__3: + case T__4: + case T__5: + case T__6: + case T__7: + case T__8: + case T__9: + case T__10: + case T__11: + case T__14: + case T__15: + case T__16: + case T__17: + case T__18: + case T__19: + case T__20: + case T__21: + case T__22: + case T__60: + case T__61: + case T__62: + case T__64: + case T__65: + case T__66: + case T__67: + case T__68: + case T__69: + case T__77: + case T__78: + case T__83: + case T__85: + case T__86: + case T__87: + case T__88: + case T__89: + case T__90: + case T__91: + case T__92: + case T__93: + case T__94: + case T__95: + case T__96: + case T__97: + case T__99: + case T__100: + case NAME: + { + setState(495); + statement(); + } + break; + case T__80: + { + setState(496); + statement_block(); + } + break; + default: + throw new NoViableAltException(this); + } + setState(500); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EOL) { + { + setState(499); + match(EOL); + } + } + + setState(502); + match(T__101); + setState(503); + expression(0); } } catch (RecognitionException re) { @@ -3460,186 +3711,196 @@ public class prog8Parser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3p\u01e5\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3s\u01fc\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"+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ - ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\3\2\3\2\7\2g\n\2"+ - "\f\2\16\2j\13\2\3\2\3\2\3\3\3\3\5\3p\n\3\3\4\3\4\3\4\5\4u\n\4\3\4\3\4"+ - "\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+ - "\5\3\5\3\5\5\5\u008d\n\5\3\6\3\6\3\6\3\7\3\7\3\7\3\7\5\7\u0096\n\7\3\b"+ - "\3\b\5\b\u009a\n\b\3\b\3\b\3\b\7\b\u009f\n\b\f\b\16\b\u00a2\13\b\5\b\u00a4"+ - "\n\b\3\t\3\t\3\t\5\t\u00a9\n\t\3\n\3\n\5\n\u00ad\n\n\3\n\3\n\3\13\3\13"+ - "\5\13\u00b3\n\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\16\3\16"+ - "\3\17\3\17\3\17\3\17\5\17\u00c5\n\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21"+ - "\3\21\3\21\3\21\3\22\3\22\3\22\5\22\u00d4\n\22\3\23\3\23\3\23\3\24\3\24"+ - "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\5\24\u00e7"+ - "\n\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ + ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ + "\64\3\2\3\2\7\2k\n\2\f\2\16\2n\13\2\3\2\3\2\3\3\3\3\5\3t\n\3\3\4\3\4\3"+ + "\4\5\4y\n\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+ + "\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u0093\n\5\3\6\3\6\3\6\3\7\3"+ + "\7\3\7\3\7\5\7\u009c\n\7\3\b\3\b\5\b\u00a0\n\b\3\b\3\b\3\b\7\b\u00a5\n"+ + "\b\f\b\16\b\u00a8\13\b\5\b\u00aa\n\b\3\t\3\t\3\t\5\t\u00af\n\t\3\n\3\n"+ + "\5\n\u00b3\n\n\3\n\3\n\3\13\3\13\5\13\u00b9\n\13\3\13\3\13\3\13\3\13\3"+ + "\f\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\17\3\17\5\17\u00cb\n\17\3"+ + "\17\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\5\22\u00da"+ + "\n\22\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ + "\3\24\3\24\3\24\3\24\5\24\u00ed\n\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ - "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\5\24"+ - "\u0111\n\24\7\24\u0113\n\24\f\24\16\24\u0116\13\24\3\25\3\25\5\25\u011a"+ - "\n\25\3\25\3\25\5\25\u011e\n\25\3\25\3\25\3\26\3\26\5\26\u0124\n\26\3"+ - "\26\3\26\5\26\u0128\n\26\3\26\3\26\3\27\3\27\3\27\7\27\u012f\n\27\f\27"+ - "\16\27\u0132\13\27\3\30\3\30\5\30\u0136\n\30\3\31\3\31\3\32\3\32\3\33"+ - "\3\33\3\34\3\34\3\34\6\34\u0141\n\34\r\34\16\34\u0142\3\35\3\35\3\36\3"+ - "\36\3\37\3\37\5\37\u014b\n\37\3 \3 \3!\3!\3\"\3\"\3\"\3\"\7\"\u0155\n"+ - "\"\f\"\16\"\u0158\13\"\3\"\3\"\3#\3#\3$\3$\3%\3%\3%\3%\3%\5%\u0165\n%"+ - "\3&\3&\3&\3\'\3\'\3\'\3\'\5\'\u016e\n\'\3\'\3\'\3\'\3\'\5\'\u0174\n\'"+ - "\3\'\3\'\3\'\3\'\3\'\5\'\u017b\n\'\3(\3(\3(\3(\7(\u0181\n(\f(\16(\u0184"+ - "\13(\3(\3(\3)\3)\3)\3*\3*\3*\7*\u018e\n*\f*\16*\u0191\13*\3+\3+\3+\3+"+ - "\5+\u0197\n+\3,\3,\3,\3,\7,\u019d\n,\f,\16,\u01a0\13,\5,\u01a2\n,\3-\3"+ - "-\5-\u01a6\n-\3-\5-\u01a9\n-\3.\3.\3.\3.\3.\5.\u01b0\n.\3.\3.\5.\u01b4"+ - "\n.\3.\5.\u01b7\n.\3.\5.\u01ba\n.\3.\3.\3/\3/\5/\u01c0\n/\3/\3/\5/\u01c4"+ - "\n/\3\60\3\60\5\60\u01c8\n\60\3\60\3\60\5\60\u01cc\n\60\3\60\5\60\u01cf"+ - "\n\60\3\60\5\60\u01d2\n\60\3\60\3\60\3\61\3\61\3\62\3\62\3\62\5\62\u01db"+ - "\n\62\3\62\3\62\3\62\5\62\u01e0\n\62\3\62\3\62\3\62\3\62\2\3&\63\2\4\6"+ - "\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRT"+ - "VXZ\\^`b\2\20\3\2\6\16\3\2\23\31\3\2\34$\3\2%&\4\2\3\3)*\3\2,/\3\2)*\3"+ - "\2\60\63\3\2\64\65\3\2CH\3\2IL\3\2km\3\2NO\3\2Xc\2\u020e\2h\3\2\2\2\4"+ - "o\3\2\2\2\6q\3\2\2\2\b\u008c\3\2\2\2\n\u008e\3\2\2\2\f\u0091\3\2\2\2\16"+ - "\u0097\3\2\2\2\20\u00a8\3\2\2\2\22\u00aa\3\2\2\2\24\u00b0\3\2\2\2\26\u00b8"+ - "\3\2\2\2\30\u00bb\3\2\2\2\32\u00be\3\2\2\2\34\u00c0\3\2\2\2\36\u00c8\3"+ - "\2\2\2 \u00cc\3\2\2\2\"\u00d3\3\2\2\2$\u00d5\3\2\2\2&\u00e6\3\2\2\2(\u0119"+ - "\3\2\2\2*\u0123\3\2\2\2,\u012b\3\2\2\2.\u0133\3\2\2\2\60\u0137\3\2\2\2"+ - "\62\u0139\3\2\2\2\64\u013b\3\2\2\2\66\u013d\3\2\2\28\u0144\3\2\2\2:\u0146"+ - "\3\2\2\2<\u0148\3\2\2\2>\u014c\3\2\2\2@\u014e\3\2\2\2B\u0150\3\2\2\2D"+ - "\u015b\3\2\2\2F\u015d\3\2\2\2H\u0164\3\2\2\2J\u0166\3\2\2\2L\u0169\3\2"+ - "\2\2N\u017c\3\2\2\2P\u0187\3\2\2\2R\u018a\3\2\2\2T\u0192\3\2\2\2V\u01a1"+ - "\3\2\2\2X\u01a5\3\2\2\2Z\u01aa\3\2\2\2\\\u01bd\3\2\2\2^\u01c5\3\2\2\2"+ - "`\u01d5\3\2\2\2b\u01d7\3\2\2\2dg\5\4\3\2eg\7i\2\2fd\3\2\2\2fe\3\2\2\2"+ - "gj\3\2\2\2hf\3\2\2\2hi\3\2\2\2ik\3\2\2\2jh\3\2\2\2kl\7\2\2\3l\3\3\2\2"+ - "\2mp\5\16\b\2np\5\6\4\2om\3\2\2\2on\3\2\2\2p\5\3\2\2\2qr\7\3\2\2rt\5\64"+ - "\33\2su\5<\37\2ts\3\2\2\2tu\3\2\2\2uv\3\2\2\2vw\5N(\2wx\7i\2\2x\7\3\2"+ - "\2\2y\u008d\5\16\b\2z\u008d\5\24\13\2{\u008d\5\22\n\2|\u008d\5\26\f\2"+ - "}\u008d\5\30\r\2~\u008d\5\36\20\2\177\u008d\5 \21\2\u0080\u008d\5\f\7"+ - "\2\u0081\u008d\5$\23\2\u0082\u008d\5*\26\2\u0083\u008d\5Z.\2\u0084\u008d"+ - "\5^\60\2\u0085\u008d\5L\'\2\u0086\u008d\5J&\2\u0087\u008d\5.\30\2\u0088"+ - "\u008d\5b\62\2\u0089\u008d\5\60\31\2\u008a\u008d\5\62\32\2\u008b\u008d"+ - "\5\n\6\2\u008cy\3\2\2\2\u008cz\3\2\2\2\u008c{\3\2\2\2\u008c|\3\2\2\2\u008c"+ - "}\3\2\2\2\u008c~\3\2\2\2\u008c\177\3\2\2\2\u008c\u0080\3\2\2\2\u008c\u0081"+ - "\3\2\2\2\u008c\u0082\3\2\2\2\u008c\u0083\3\2\2\2\u008c\u0084\3\2\2\2\u008c"+ - "\u0085\3\2\2\2\u008c\u0086\3\2\2\2\u008c\u0087\3\2\2\2\u008c\u0088\3\2"+ - "\2\2\u008c\u0089\3\2\2\2\u008c\u008a\3\2\2\2\u008c\u008b\3\2\2\2\u008d"+ - "\t\3\2\2\2\u008e\u008f\5\64\33\2\u008f\u0090\7\4\2\2\u0090\13\3\2\2\2"+ - "\u0091\u0095\7\5\2\2\u0092\u0096\5<\37\2\u0093\u0096\5\64\33\2\u0094\u0096"+ - "\5\66\34\2\u0095\u0092\3\2\2\2\u0095\u0093\3\2\2\2\u0095\u0094\3\2\2\2"+ - "\u0096\r\3\2\2\2\u0097\u00a3\t\2\2\2\u0098\u009a\5\20\t\2\u0099\u0098"+ - "\3\2\2\2\u0099\u009a\3\2\2\2\u009a\u00a4\3\2\2\2\u009b\u00a0\5\20\t\2"+ - "\u009c\u009d\7\17\2\2\u009d\u009f\5\20\t\2\u009e\u009c\3\2\2\2\u009f\u00a2"+ - "\3\2\2\2\u00a0\u009e\3\2\2\2\u00a0\u00a1\3\2\2\2\u00a1\u00a4\3\2\2\2\u00a2"+ - "\u00a0\3\2\2\2\u00a3\u0099\3\2\2\2\u00a3\u009b\3\2\2\2\u00a4\17\3\2\2"+ - "\2\u00a5\u00a9\5D#\2\u00a6\u00a9\5\64\33\2\u00a7\u00a9\5<\37\2\u00a8\u00a5"+ - "\3\2\2\2\u00a8\u00a6\3\2\2\2\u00a8\u00a7\3\2\2\2\u00a9\21\3\2\2\2\u00aa"+ - "\u00ac\5\32\16\2\u00ab\u00ad\5\34\17\2\u00ac\u00ab\3\2\2\2\u00ac\u00ad"+ - "\3\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\u00af\5\64\33\2\u00af\23\3\2\2\2\u00b0"+ - "\u00b2\5\32\16\2\u00b1\u00b3\5\34\17\2\u00b2\u00b1\3\2\2\2\u00b2\u00b3"+ - "\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b4\u00b5\5\64\33\2\u00b5\u00b6\7\20\2"+ - "\2\u00b6\u00b7\5&\24\2\u00b7\25\3\2\2\2\u00b8\u00b9\7\21\2\2\u00b9\u00ba"+ - "\5\24\13\2\u00ba\27\3\2\2\2\u00bb\u00bc\7\22\2\2\u00bc\u00bd\5\24\13\2"+ - "\u00bd\31\3\2\2\2\u00be\u00bf\t\3\2\2\u00bf\33\3\2\2\2\u00c0\u00c1\7\32"+ - "\2\2\u00c1\u00c4\5&\24\2\u00c2\u00c3\7\17\2\2\u00c3\u00c5\5&\24\2\u00c4"+ - "\u00c2\3\2\2\2\u00c4\u00c5\3\2\2\2\u00c5\u00c6\3\2\2\2\u00c6\u00c7\7\33"+ - "\2\2\u00c7\35\3\2\2\2\u00c8\u00c9\5\"\22\2\u00c9\u00ca\7\20\2\2\u00ca"+ - "\u00cb\5&\24\2\u00cb\37\3\2\2\2\u00cc\u00cd\5\"\22\2\u00cd\u00ce\t\4\2"+ - "\2\u00ce\u00cf\5&\24\2\u00cf!\3\2\2\2\u00d0\u00d4\58\35\2\u00d1\u00d4"+ - "\5\64\33\2\u00d2\u00d4\5\66\34\2\u00d3\u00d0\3\2\2\2\u00d3\u00d1\3\2\2"+ - "\2\u00d3\u00d2\3\2\2\2\u00d4#\3\2\2\2\u00d5\u00d6\5\"\22\2\u00d6\u00d7"+ - "\t\5\2\2\u00d7%\3\2\2\2\u00d8\u00d9\b\24\1\2\u00d9\u00da\7\'\2\2\u00da"+ - "\u00db\5&\24\2\u00db\u00dc\7(\2\2\u00dc\u00e7\3\2\2\2\u00dd\u00e7\5(\25"+ - "\2\u00de\u00df\t\6\2\2\u00df\u00e7\5&\24\24\u00e0\u00e1\7>\2\2\u00e1\u00e7"+ - "\5&\24\7\u00e2\u00e7\5H%\2\u00e3\u00e7\58\35\2\u00e4\u00e7\5\64\33\2\u00e5"+ - "\u00e7\5\66\34\2\u00e6\u00d8\3\2\2\2\u00e6\u00dd\3\2\2\2\u00e6\u00de\3"+ - "\2\2\2\u00e6\u00e0\3\2\2\2\u00e6\u00e2\3\2\2\2\u00e6\u00e3\3\2\2\2\u00e6"+ - "\u00e4\3\2\2\2\u00e6\u00e5\3\2\2\2\u00e7\u0114\3\2\2\2\u00e8\u00e9\f\23"+ - "\2\2\u00e9\u00ea\7+\2\2\u00ea\u0113\5&\24\24\u00eb\u00ec\f\22\2\2\u00ec"+ - "\u00ed\t\7\2\2\u00ed\u0113\5&\24\23\u00ee\u00ef\f\21\2\2\u00ef\u00f0\t"+ - "\b\2\2\u00f0\u0113\5&\24\22\u00f1\u00f2\f\20\2\2\u00f2\u00f3\t\t\2\2\u00f3"+ - "\u0113\5&\24\21\u00f4\u00f5\f\17\2\2\u00f5\u00f6\t\n\2\2\u00f6\u0113\5"+ - "&\24\20\u00f7\u00f8\f\16\2\2\u00f8\u00f9\7\66\2\2\u00f9\u0113\5&\24\17"+ - "\u00fa\u00fb\f\r\2\2\u00fb\u00fc\7\67\2\2\u00fc\u0113\5&\24\16\u00fd\u00fe"+ - "\f\f\2\2\u00fe\u00ff\78\2\2\u00ff\u0113\5&\24\r\u0100\u0101\f\n\2\2\u0101"+ - "\u0102\7;\2\2\u0102\u0113\5&\24\13\u0103\u0104\f\t\2\2\u0104\u0105\7<"+ - "\2\2\u0105\u0113\5&\24\n\u0106\u0107\f\b\2\2\u0107\u0108\7=\2\2\u0108"+ - "\u0113\5&\24\t\u0109\u010a\f\26\2\2\u010a\u0113\5\34\17\2\u010b\u010c"+ - "\f\13\2\2\u010c\u010d\79\2\2\u010d\u0110\5&\24\2\u010e\u010f\7:\2\2\u010f"+ - "\u0111\5&\24\2\u0110\u010e\3\2\2\2\u0110\u0111\3\2\2\2\u0111\u0113\3\2"+ - "\2\2\u0112\u00e8\3\2\2\2\u0112\u00eb\3\2\2\2\u0112\u00ee\3\2\2\2\u0112"+ - "\u00f1\3\2\2\2\u0112\u00f4\3\2\2\2\u0112\u00f7\3\2\2\2\u0112\u00fa\3\2"+ - "\2\2\u0112\u00fd\3\2\2\2\u0112\u0100\3\2\2\2\u0112\u0103\3\2\2\2\u0112"+ - "\u0106\3\2\2\2\u0112\u0109\3\2\2\2\u0112\u010b\3\2\2\2\u0113\u0116\3\2"+ - "\2\2\u0114\u0112\3\2\2\2\u0114\u0115\3\2\2\2\u0115\'\3\2\2\2\u0116\u0114"+ - "\3\2\2\2\u0117\u011a\5\64\33\2\u0118\u011a\5\66\34\2\u0119\u0117\3\2\2"+ - "\2\u0119\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011b\u011d\7\'\2\2\u011c\u011e"+ - "\5,\27\2\u011d\u011c\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u011f\3\2\2\2\u011f"+ - "\u0120\7(\2\2\u0120)\3\2\2\2\u0121\u0124\5\64\33\2\u0122\u0124\5\66\34"+ - "\2\u0123\u0121\3\2\2\2\u0123\u0122\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0127"+ - "\7\'\2\2\u0126\u0128\5,\27\2\u0127\u0126\3\2\2\2\u0127\u0128\3\2\2\2\u0128"+ - "\u0129\3\2\2\2\u0129\u012a\7(\2\2\u012a+\3\2\2\2\u012b\u0130\5&\24\2\u012c"+ - "\u012d\7\17\2\2\u012d\u012f\5&\24\2\u012e\u012c\3\2\2\2\u012f\u0132\3"+ - "\2\2\2\u0130\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131-\3\2\2\2\u0132\u0130"+ - "\3\2\2\2\u0133\u0135\7?\2\2\u0134\u0136\5,\27\2\u0135\u0134\3\2\2\2\u0135"+ - "\u0136\3\2\2\2\u0136/\3\2\2\2\u0137\u0138\7@\2\2\u0138\61\3\2\2\2\u0139"+ - "\u013a\7A\2\2\u013a\63\3\2\2\2\u013b\u013c\7j\2\2\u013c\65\3\2\2\2\u013d"+ - "\u0140\7j\2\2\u013e\u013f\7B\2\2\u013f\u0141\7j\2\2\u0140\u013e\3\2\2"+ - "\2\u0141\u0142\3\2\2\2\u0142\u0140\3\2\2\2\u0142\u0143\3\2\2\2\u0143\67"+ - "\3\2\2\2\u0144\u0145\t\13\2\2\u01459\3\2\2\2\u0146\u0147\t\f\2\2\u0147"+ - ";\3\2\2\2\u0148\u014a\t\r\2\2\u0149\u014b\5> \2\u014a\u0149\3\2\2\2\u014a"+ - "\u014b\3\2\2\2\u014b=\3\2\2\2\u014c\u014d\7M\2\2\u014d?\3\2\2\2\u014e"+ - "\u014f\t\16\2\2\u014fA\3\2\2\2\u0150\u0151\7\32\2\2\u0151\u0156\5&\24"+ - "\2\u0152\u0153\7\17\2\2\u0153\u0155\5&\24\2\u0154\u0152\3\2\2\2\u0155"+ - "\u0158\3\2\2\2\u0156\u0154\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0159\3\2"+ - "\2\2\u0158\u0156\3\2\2\2\u0159\u015a\7\33\2\2\u015aC\3\2\2\2\u015b\u015c"+ - "\7o\2\2\u015cE\3\2\2\2\u015d\u015e\7n\2\2\u015eG\3\2\2\2\u015f\u0165\5"+ - "<\37\2\u0160\u0165\5@!\2\u0161\u0165\5B\"\2\u0162\u0165\5D#\2\u0163\u0165"+ - "\5F$\2\u0164\u015f\3\2\2\2\u0164\u0160\3\2\2\2\u0164\u0161\3\2\2\2\u0164"+ - "\u0162\3\2\2\2\u0164\u0163\3\2\2\2\u0165I\3\2\2\2\u0166\u0167\7P\2\2\u0167"+ - "\u0168\7p\2\2\u0168K\3\2\2\2\u0169\u016a\7Q\2\2\u016a\u016b\5\64\33\2"+ - "\u016b\u016d\7\'\2\2\u016c\u016e\5R*\2\u016d\u016c\3\2\2\2\u016d\u016e"+ - "\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0170\7(\2\2\u0170\u0171\7R\2\2\u0171"+ - "\u0173\7\'\2\2\u0172\u0174\5V,\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2"+ - "\2\u0174\u0175\3\2\2\2\u0175\u017a\7(\2\2\u0176\u017b\5P)\2\u0177\u0178"+ - "\5N(\2\u0178\u0179\7i\2\2\u0179\u017b\3\2\2\2\u017a\u0176\3\2\2\2\u017a"+ - "\u0177\3\2\2\2\u017bM\3\2\2\2\u017c\u017d\7S\2\2\u017d\u0182\7i\2\2\u017e"+ - "\u0181\5\b\5\2\u017f\u0181\7i\2\2\u0180\u017e\3\2\2\2\u0180\u017f\3\2"+ - "\2\2\u0181\u0184\3\2\2\2\u0182\u0180\3\2\2\2\u0182\u0183\3\2\2\2\u0183"+ - "\u0185\3\2\2\2\u0184\u0182\3\2\2\2\u0185\u0186\7T\2\2\u0186O\3\2\2\2\u0187"+ - "\u0188\7\20\2\2\u0188\u0189\5<\37\2\u0189Q\3\2\2\2\u018a\u018f\5T+\2\u018b"+ - "\u018c\7\17\2\2\u018c\u018e\5T+\2\u018d\u018b\3\2\2\2\u018e\u0191\3\2"+ - "\2\2\u018f\u018d\3\2\2\2\u018f\u0190\3\2\2\2\u0190S\3\2\2\2\u0191\u018f"+ - "\3\2\2\2\u0192\u0193\5\64\33\2\u0193\u0196\7\4\2\2\u0194\u0197\58\35\2"+ - "\u0195\u0197\5:\36\2\u0196\u0194\3\2\2\2\u0196\u0195\3\2\2\2\u0197U\3"+ - "\2\2\2\u0198\u01a2\7U\2\2\u0199\u019e\5X-\2\u019a\u019b\7\17\2\2\u019b"+ - "\u019d\5X-\2\u019c\u019a\3\2\2\2\u019d\u01a0\3\2\2\2\u019e\u019c\3\2\2"+ - "\2\u019e\u019f\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u019e\3\2\2\2\u01a1\u0198"+ - "\3\2\2\2\u01a1\u0199\3\2\2\2\u01a2W\3\2\2\2\u01a3\u01a6\58\35\2\u01a4"+ - "\u01a6\5:\36\2\u01a5\u01a3\3\2\2\2\u01a5\u01a4\3\2\2\2\u01a6\u01a8\3\2"+ - "\2\2\u01a7\u01a9\7U\2\2\u01a8\u01a7\3\2\2\2\u01a8\u01a9\3\2\2\2\u01a9"+ - "Y\3\2\2\2\u01aa\u01ab\7V\2\2\u01ab\u01ac\7\'\2\2\u01ac\u01ad\5&\24\2\u01ad"+ - "\u01af\7(\2\2\u01ae\u01b0\7i\2\2\u01af\u01ae\3\2\2\2\u01af\u01b0\3\2\2"+ - "\2\u01b0\u01b3\3\2\2\2\u01b1\u01b4\5\b\5\2\u01b2\u01b4\5N(\2\u01b3\u01b1"+ - "\3\2\2\2\u01b3\u01b2\3\2\2\2\u01b4\u01b6\3\2\2\2\u01b5\u01b7\7i\2\2\u01b6"+ - "\u01b5\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b7\u01b9\3\2\2\2\u01b8\u01ba\5\\"+ - "/\2\u01b9\u01b8\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bb\3\2\2\2\u01bb"+ - "\u01bc\7i\2\2\u01bc[\3\2\2\2\u01bd\u01bf\7W\2\2\u01be\u01c0\7i\2\2\u01bf"+ - "\u01be\3\2\2\2\u01bf\u01c0\3\2\2\2\u01c0\u01c3\3\2\2\2\u01c1\u01c4\5\b"+ - "\5\2\u01c2\u01c4\5N(\2\u01c3\u01c1\3\2\2\2\u01c3\u01c2\3\2\2\2\u01c4]"+ - "\3\2\2\2\u01c5\u01c7\5`\61\2\u01c6\u01c8\7i\2\2\u01c7\u01c6\3\2\2\2\u01c7"+ - "\u01c8\3\2\2\2\u01c8\u01cb\3\2\2\2\u01c9\u01cc\5\b\5\2\u01ca\u01cc\5N"+ - "(\2\u01cb\u01c9\3\2\2\2\u01cb\u01ca\3\2\2\2\u01cc\u01ce\3\2\2\2\u01cd"+ - "\u01cf\7i\2\2\u01ce\u01cd\3\2\2\2\u01ce\u01cf\3\2\2\2\u01cf\u01d1\3\2"+ - "\2\2\u01d0\u01d2\5\\/\2\u01d1\u01d0\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2"+ - "\u01d3\3\2\2\2\u01d3\u01d4\7i\2\2\u01d4_\3\2\2\2\u01d5\u01d6\t\17\2\2"+ - "\u01d6a\3\2\2\2\u01d7\u01da\7d\2\2\u01d8\u01db\58\35\2\u01d9\u01db\5\64"+ - "\33\2\u01da\u01d8\3\2\2\2\u01da\u01d9\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc"+ - "\u01dd\7e\2\2\u01dd\u01df\5&\24\2\u01de\u01e0\7i\2\2\u01df\u01de\3\2\2"+ - "\2\u01df\u01e0\3\2\2\2\u01e0\u01e1\3\2\2\2\u01e1\u01e2\5N(\2\u01e2\u01e3"+ - "\7i\2\2\u01e3c\3\2\2\2\65fhot\u008c\u0095\u0099\u00a0\u00a3\u00a8\u00ac"+ - "\u00b2\u00c4\u00d3\u00e6\u0110\u0112\u0114\u0119\u011d\u0123\u0127\u0130"+ - "\u0135\u0142\u014a\u0156\u0164\u016d\u0173\u017a\u0180\u0182\u018f\u0196"+ - "\u019e\u01a1\u01a5\u01a8\u01af\u01b3\u01b6\u01b9\u01bf\u01c3\u01c7\u01cb"+ - "\u01ce\u01d1\u01da\u01df"; + "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ + "\3\24\3\24\3\24\3\24\3\24\5\24\u0117\n\24\7\24\u0119\n\24\f\24\16\24\u011c"+ + "\13\24\3\25\3\25\5\25\u0120\n\25\3\25\3\25\5\25\u0124\n\25\3\25\3\25\3"+ + "\26\3\26\5\26\u012a\n\26\3\26\3\26\5\26\u012e\n\26\3\26\3\26\3\27\3\27"+ + "\3\27\7\27\u0135\n\27\f\27\16\27\u0138\13\27\3\30\3\30\5\30\u013c\n\30"+ + "\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\34\6\34\u0147\n\34\r\34\16"+ + "\34\u0148\3\35\3\35\3\36\3\36\3\37\3\37\5\37\u0151\n\37\3 \3 \3!\3!\3"+ + "\"\3\"\3\"\3\"\7\"\u015b\n\"\f\"\16\"\u015e\13\"\3\"\3\"\3#\3#\3$\3$\3"+ + "%\3%\3%\3%\3%\5%\u016b\n%\3&\3&\3&\3\'\3\'\3\'\3\'\5\'\u0174\n\'\3\'\3"+ + "\'\3\'\3\'\5\'\u017a\n\'\3\'\3\'\3\'\3\'\3\'\5\'\u0181\n\'\3(\3(\3(\3"+ + "(\7(\u0187\n(\f(\16(\u018a\13(\3(\3(\3)\3)\3)\3*\3*\3*\7*\u0194\n*\f*"+ + "\16*\u0197\13*\3+\3+\3+\3+\5+\u019d\n+\3,\3,\3,\3,\7,\u01a3\n,\f,\16,"+ + "\u01a6\13,\5,\u01a8\n,\3-\3-\5-\u01ac\n-\3-\5-\u01af\n-\3.\3.\3.\5.\u01b4"+ + "\n.\3.\3.\5.\u01b8\n.\3.\5.\u01bb\n.\3.\5.\u01be\n.\3.\3.\3/\3/\5/\u01c4"+ + "\n/\3/\3/\5/\u01c8\n/\3\60\3\60\5\60\u01cc\n\60\3\60\3\60\5\60\u01d0\n"+ + "\60\3\60\5\60\u01d3\n\60\3\60\5\60\u01d6\n\60\3\60\3\60\3\61\3\61\3\62"+ + "\3\62\3\62\5\62\u01df\n\62\3\62\3\62\3\62\5\62\u01e4\n\62\3\62\3\62\3"+ + "\63\3\63\3\63\5\63\u01eb\n\63\3\63\3\63\5\63\u01ef\n\63\3\64\3\64\3\64"+ + "\5\64\u01f4\n\64\3\64\5\64\u01f7\n\64\3\64\3\64\3\64\3\64\2\3&\65\2\4"+ + "\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNP"+ + "RTVXZ\\^`bdf\2\20\3\2\6\16\3\2\23\31\3\2\34$\3\2%&\4\2\3\3)*\3\2,/\3\2"+ + ")*\3\2\60\63\3\2\64\65\3\2CH\3\2IL\3\2np\3\2NO\3\2Xc\2\u0229\2l\3\2\2"+ + "\2\4s\3\2\2\2\6u\3\2\2\2\b\u0092\3\2\2\2\n\u0094\3\2\2\2\f\u0097\3\2\2"+ + "\2\16\u009d\3\2\2\2\20\u00ae\3\2\2\2\22\u00b0\3\2\2\2\24\u00b6\3\2\2\2"+ + "\26\u00be\3\2\2\2\30\u00c1\3\2\2\2\32\u00c4\3\2\2\2\34\u00c6\3\2\2\2\36"+ + "\u00ce\3\2\2\2 \u00d2\3\2\2\2\"\u00d9\3\2\2\2$\u00db\3\2\2\2&\u00ec\3"+ + "\2\2\2(\u011f\3\2\2\2*\u0129\3\2\2\2,\u0131\3\2\2\2.\u0139\3\2\2\2\60"+ + "\u013d\3\2\2\2\62\u013f\3\2\2\2\64\u0141\3\2\2\2\66\u0143\3\2\2\28\u014a"+ + "\3\2\2\2:\u014c\3\2\2\2<\u014e\3\2\2\2>\u0152\3\2\2\2@\u0154\3\2\2\2B"+ + "\u0156\3\2\2\2D\u0161\3\2\2\2F\u0163\3\2\2\2H\u016a\3\2\2\2J\u016c\3\2"+ + "\2\2L\u016f\3\2\2\2N\u0182\3\2\2\2P\u018d\3\2\2\2R\u0190\3\2\2\2T\u0198"+ + "\3\2\2\2V\u01a7\3\2\2\2X\u01ab\3\2\2\2Z\u01b0\3\2\2\2\\\u01c1\3\2\2\2"+ + "^\u01c9\3\2\2\2`\u01d9\3\2\2\2b\u01db\3\2\2\2d\u01e7\3\2\2\2f\u01f0\3"+ + "\2\2\2hk\5\4\3\2ik\7l\2\2jh\3\2\2\2ji\3\2\2\2kn\3\2\2\2lj\3\2\2\2lm\3"+ + "\2\2\2mo\3\2\2\2nl\3\2\2\2op\7\2\2\3p\3\3\2\2\2qt\5\16\b\2rt\5\6\4\2s"+ + "q\3\2\2\2sr\3\2\2\2t\5\3\2\2\2uv\7\3\2\2vx\5\64\33\2wy\5<\37\2xw\3\2\2"+ + "\2xy\3\2\2\2yz\3\2\2\2z{\5N(\2{|\7l\2\2|\7\3\2\2\2}\u0093\5\16\b\2~\u0093"+ + "\5\24\13\2\177\u0093\5\22\n\2\u0080\u0093\5\26\f\2\u0081\u0093\5\30\r"+ + "\2\u0082\u0093\5\36\20\2\u0083\u0093\5 \21\2\u0084\u0093\5\f\7\2\u0085"+ + "\u0093\5$\23\2\u0086\u0093\5*\26\2\u0087\u0093\5Z.\2\u0088\u0093\5^\60"+ + "\2\u0089\u0093\5L\'\2\u008a\u0093\5J&\2\u008b\u0093\5.\30\2\u008c\u0093"+ + "\5b\62\2\u008d\u0093\5d\63\2\u008e\u0093\5f\64\2\u008f\u0093\5\60\31\2"+ + "\u0090\u0093\5\62\32\2\u0091\u0093\5\n\6\2\u0092}\3\2\2\2\u0092~\3\2\2"+ + "\2\u0092\177\3\2\2\2\u0092\u0080\3\2\2\2\u0092\u0081\3\2\2\2\u0092\u0082"+ + "\3\2\2\2\u0092\u0083\3\2\2\2\u0092\u0084\3\2\2\2\u0092\u0085\3\2\2\2\u0092"+ + "\u0086\3\2\2\2\u0092\u0087\3\2\2\2\u0092\u0088\3\2\2\2\u0092\u0089\3\2"+ + "\2\2\u0092\u008a\3\2\2\2\u0092\u008b\3\2\2\2\u0092\u008c\3\2\2\2\u0092"+ + "\u008d\3\2\2\2\u0092\u008e\3\2\2\2\u0092\u008f\3\2\2\2\u0092\u0090\3\2"+ + "\2\2\u0092\u0091\3\2\2\2\u0093\t\3\2\2\2\u0094\u0095\5\64\33\2\u0095\u0096"+ + "\7\4\2\2\u0096\13\3\2\2\2\u0097\u009b\7\5\2\2\u0098\u009c\5<\37\2\u0099"+ + "\u009c\5\64\33\2\u009a\u009c\5\66\34\2\u009b\u0098\3\2\2\2\u009b\u0099"+ + "\3\2\2\2\u009b\u009a\3\2\2\2\u009c\r\3\2\2\2\u009d\u00a9\t\2\2\2\u009e"+ + "\u00a0\5\20\t\2\u009f\u009e\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0\u00aa\3"+ + "\2\2\2\u00a1\u00a6\5\20\t\2\u00a2\u00a3\7\17\2\2\u00a3\u00a5\5\20\t\2"+ + "\u00a4\u00a2\3\2\2\2\u00a5\u00a8\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a6\u00a7"+ + "\3\2\2\2\u00a7\u00aa\3\2\2\2\u00a8\u00a6\3\2\2\2\u00a9\u009f\3\2\2\2\u00a9"+ + "\u00a1\3\2\2\2\u00aa\17\3\2\2\2\u00ab\u00af\5D#\2\u00ac\u00af\5\64\33"+ + "\2\u00ad\u00af\5<\37\2\u00ae\u00ab\3\2\2\2\u00ae\u00ac\3\2\2\2\u00ae\u00ad"+ + "\3\2\2\2\u00af\21\3\2\2\2\u00b0\u00b2\5\32\16\2\u00b1\u00b3\5\34\17\2"+ + "\u00b2\u00b1\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b4\u00b5"+ + "\5\64\33\2\u00b5\23\3\2\2\2\u00b6\u00b8\5\32\16\2\u00b7\u00b9\5\34\17"+ + "\2\u00b8\u00b7\3\2\2\2\u00b8\u00b9\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\u00bb"+ + "\5\64\33\2\u00bb\u00bc\7\20\2\2\u00bc\u00bd\5&\24\2\u00bd\25\3\2\2\2\u00be"+ + "\u00bf\7\21\2\2\u00bf\u00c0\5\24\13\2\u00c0\27\3\2\2\2\u00c1\u00c2\7\22"+ + "\2\2\u00c2\u00c3\5\24\13\2\u00c3\31\3\2\2\2\u00c4\u00c5\t\3\2\2\u00c5"+ + "\33\3\2\2\2\u00c6\u00c7\7\32\2\2\u00c7\u00ca\5&\24\2\u00c8\u00c9\7\17"+ + "\2\2\u00c9\u00cb\5&\24\2\u00ca\u00c8\3\2\2\2\u00ca\u00cb\3\2\2\2\u00cb"+ + "\u00cc\3\2\2\2\u00cc\u00cd\7\33\2\2\u00cd\35\3\2\2\2\u00ce\u00cf\5\"\22"+ + "\2\u00cf\u00d0\7\20\2\2\u00d0\u00d1\5&\24\2\u00d1\37\3\2\2\2\u00d2\u00d3"+ + "\5\"\22\2\u00d3\u00d4\t\4\2\2\u00d4\u00d5\5&\24\2\u00d5!\3\2\2\2\u00d6"+ + "\u00da\58\35\2\u00d7\u00da\5\64\33\2\u00d8\u00da\5\66\34\2\u00d9\u00d6"+ + "\3\2\2\2\u00d9\u00d7\3\2\2\2\u00d9\u00d8\3\2\2\2\u00da#\3\2\2\2\u00db"+ + "\u00dc\5\"\22\2\u00dc\u00dd\t\5\2\2\u00dd%\3\2\2\2\u00de\u00df\b\24\1"+ + "\2\u00df\u00e0\7\'\2\2\u00e0\u00e1\5&\24\2\u00e1\u00e2\7(\2\2\u00e2\u00ed"+ + "\3\2\2\2\u00e3\u00ed\5(\25\2\u00e4\u00e5\t\6\2\2\u00e5\u00ed\5&\24\24"+ + "\u00e6\u00e7\7>\2\2\u00e7\u00ed\5&\24\7\u00e8\u00ed\5H%\2\u00e9\u00ed"+ + "\58\35\2\u00ea\u00ed\5\64\33\2\u00eb\u00ed\5\66\34\2\u00ec\u00de\3\2\2"+ + "\2\u00ec\u00e3\3\2\2\2\u00ec\u00e4\3\2\2\2\u00ec\u00e6\3\2\2\2\u00ec\u00e8"+ + "\3\2\2\2\u00ec\u00e9\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ec\u00eb\3\2\2\2\u00ed"+ + "\u011a\3\2\2\2\u00ee\u00ef\f\23\2\2\u00ef\u00f0\7+\2\2\u00f0\u0119\5&"+ + "\24\24\u00f1\u00f2\f\22\2\2\u00f2\u00f3\t\7\2\2\u00f3\u0119\5&\24\23\u00f4"+ + "\u00f5\f\21\2\2\u00f5\u00f6\t\b\2\2\u00f6\u0119\5&\24\22\u00f7\u00f8\f"+ + "\20\2\2\u00f8\u00f9\t\t\2\2\u00f9\u0119\5&\24\21\u00fa\u00fb\f\17\2\2"+ + "\u00fb\u00fc\t\n\2\2\u00fc\u0119\5&\24\20\u00fd\u00fe\f\16\2\2\u00fe\u00ff"+ + "\7\66\2\2\u00ff\u0119\5&\24\17\u0100\u0101\f\r\2\2\u0101\u0102\7\67\2"+ + "\2\u0102\u0119\5&\24\16\u0103\u0104\f\f\2\2\u0104\u0105\78\2\2\u0105\u0119"+ + "\5&\24\r\u0106\u0107\f\n\2\2\u0107\u0108\7;\2\2\u0108\u0119\5&\24\13\u0109"+ + "\u010a\f\t\2\2\u010a\u010b\7<\2\2\u010b\u0119\5&\24\n\u010c\u010d\f\b"+ + "\2\2\u010d\u010e\7=\2\2\u010e\u0119\5&\24\t\u010f\u0110\f\26\2\2\u0110"+ + "\u0119\5\34\17\2\u0111\u0112\f\13\2\2\u0112\u0113\79\2\2\u0113\u0116\5"+ + "&\24\2\u0114\u0115\7:\2\2\u0115\u0117\5&\24\2\u0116\u0114\3\2\2\2\u0116"+ + "\u0117\3\2\2\2\u0117\u0119\3\2\2\2\u0118\u00ee\3\2\2\2\u0118\u00f1\3\2"+ + "\2\2\u0118\u00f4\3\2\2\2\u0118\u00f7\3\2\2\2\u0118\u00fa\3\2\2\2\u0118"+ + "\u00fd\3\2\2\2\u0118\u0100\3\2\2\2\u0118\u0103\3\2\2\2\u0118\u0106\3\2"+ + "\2\2\u0118\u0109\3\2\2\2\u0118\u010c\3\2\2\2\u0118\u010f\3\2\2\2\u0118"+ + "\u0111\3\2\2\2\u0119\u011c\3\2\2\2\u011a\u0118\3\2\2\2\u011a\u011b\3\2"+ + "\2\2\u011b\'\3\2\2\2\u011c\u011a\3\2\2\2\u011d\u0120\5\64\33\2\u011e\u0120"+ + "\5\66\34\2\u011f\u011d\3\2\2\2\u011f\u011e\3\2\2\2\u0120\u0121\3\2\2\2"+ + "\u0121\u0123\7\'\2\2\u0122\u0124\5,\27\2\u0123\u0122\3\2\2\2\u0123\u0124"+ + "\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0126\7(\2\2\u0126)\3\2\2\2\u0127\u012a"+ + "\5\64\33\2\u0128\u012a\5\66\34\2\u0129\u0127\3\2\2\2\u0129\u0128\3\2\2"+ + "\2\u012a\u012b\3\2\2\2\u012b\u012d\7\'\2\2\u012c\u012e\5,\27\2\u012d\u012c"+ + "\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012f\3\2\2\2\u012f\u0130\7(\2\2\u0130"+ + "+\3\2\2\2\u0131\u0136\5&\24\2\u0132\u0133\7\17\2\2\u0133\u0135\5&\24\2"+ + "\u0134\u0132\3\2\2\2\u0135\u0138\3\2\2\2\u0136\u0134\3\2\2\2\u0136\u0137"+ + "\3\2\2\2\u0137-\3\2\2\2\u0138\u0136\3\2\2\2\u0139\u013b\7?\2\2\u013a\u013c"+ + "\5,\27\2\u013b\u013a\3\2\2\2\u013b\u013c\3\2\2\2\u013c/\3\2\2\2\u013d"+ + "\u013e\7@\2\2\u013e\61\3\2\2\2\u013f\u0140\7A\2\2\u0140\63\3\2\2\2\u0141"+ + "\u0142\7m\2\2\u0142\65\3\2\2\2\u0143\u0146\7m\2\2\u0144\u0145\7B\2\2\u0145"+ + "\u0147\7m\2\2\u0146\u0144\3\2\2\2\u0147\u0148\3\2\2\2\u0148\u0146\3\2"+ + "\2\2\u0148\u0149\3\2\2\2\u0149\67\3\2\2\2\u014a\u014b\t\13\2\2\u014b9"+ + "\3\2\2\2\u014c\u014d\t\f\2\2\u014d;\3\2\2\2\u014e\u0150\t\r\2\2\u014f"+ + "\u0151\5> \2\u0150\u014f\3\2\2\2\u0150\u0151\3\2\2\2\u0151=\3\2\2\2\u0152"+ + "\u0153\7M\2\2\u0153?\3\2\2\2\u0154\u0155\t\16\2\2\u0155A\3\2\2\2\u0156"+ + "\u0157\7\32\2\2\u0157\u015c\5&\24\2\u0158\u0159\7\17\2\2\u0159\u015b\5"+ + "&\24\2\u015a\u0158\3\2\2\2\u015b\u015e\3\2\2\2\u015c\u015a\3\2\2\2\u015c"+ + "\u015d\3\2\2\2\u015d\u015f\3\2\2\2\u015e\u015c\3\2\2\2\u015f\u0160\7\33"+ + "\2\2\u0160C\3\2\2\2\u0161\u0162\7r\2\2\u0162E\3\2\2\2\u0163\u0164\7q\2"+ + "\2\u0164G\3\2\2\2\u0165\u016b\5<\37\2\u0166\u016b\5@!\2\u0167\u016b\5"+ + "B\"\2\u0168\u016b\5D#\2\u0169\u016b\5F$\2\u016a\u0165\3\2\2\2\u016a\u0166"+ + "\3\2\2\2\u016a\u0167\3\2\2\2\u016a\u0168\3\2\2\2\u016a\u0169\3\2\2\2\u016b"+ + "I\3\2\2\2\u016c\u016d\7P\2\2\u016d\u016e\7s\2\2\u016eK\3\2\2\2\u016f\u0170"+ + "\7Q\2\2\u0170\u0171\5\64\33\2\u0171\u0173\7\'\2\2\u0172\u0174\5R*\2\u0173"+ + "\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176\7("+ + "\2\2\u0176\u0177\7R\2\2\u0177\u0179\7\'\2\2\u0178\u017a\5V,\2\u0179\u0178"+ + "\3\2\2\2\u0179\u017a\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u0180\7(\2\2\u017c"+ + "\u0181\5P)\2\u017d\u017e\5N(\2\u017e\u017f\7l\2\2\u017f\u0181\3\2\2\2"+ + "\u0180\u017c\3\2\2\2\u0180\u017d\3\2\2\2\u0181M\3\2\2\2\u0182\u0183\7"+ + "S\2\2\u0183\u0188\7l\2\2\u0184\u0187\5\b\5\2\u0185\u0187\7l\2\2\u0186"+ + "\u0184\3\2\2\2\u0186\u0185\3\2\2\2\u0187\u018a\3\2\2\2\u0188\u0186\3\2"+ + "\2\2\u0188\u0189\3\2\2\2\u0189\u018b\3\2\2\2\u018a\u0188\3\2\2\2\u018b"+ + "\u018c\7T\2\2\u018cO\3\2\2\2\u018d\u018e\7\20\2\2\u018e\u018f\5<\37\2"+ + "\u018fQ\3\2\2\2\u0190\u0195\5T+\2\u0191\u0192\7\17\2\2\u0192\u0194\5T"+ + "+\2\u0193\u0191\3\2\2\2\u0194\u0197\3\2\2\2\u0195\u0193\3\2\2\2\u0195"+ + "\u0196\3\2\2\2\u0196S\3\2\2\2\u0197\u0195\3\2\2\2\u0198\u0199\5\64\33"+ + "\2\u0199\u019c\7\4\2\2\u019a\u019d\58\35\2\u019b\u019d\5:\36\2\u019c\u019a"+ + "\3\2\2\2\u019c\u019b\3\2\2\2\u019dU\3\2\2\2\u019e\u01a8\7U\2\2\u019f\u01a4"+ + "\5X-\2\u01a0\u01a1\7\17\2\2\u01a1\u01a3\5X-\2\u01a2\u01a0\3\2\2\2\u01a3"+ + "\u01a6\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a8\3\2"+ + "\2\2\u01a6\u01a4\3\2\2\2\u01a7\u019e\3\2\2\2\u01a7\u019f\3\2\2\2\u01a8"+ + "W\3\2\2\2\u01a9\u01ac\58\35\2\u01aa\u01ac\5:\36\2\u01ab\u01a9\3\2\2\2"+ + "\u01ab\u01aa\3\2\2\2\u01ac\u01ae\3\2\2\2\u01ad\u01af\7U\2\2\u01ae\u01ad"+ + "\3\2\2\2\u01ae\u01af\3\2\2\2\u01afY\3\2\2\2\u01b0\u01b1\7V\2\2\u01b1\u01b3"+ + "\5&\24\2\u01b2\u01b4\7l\2\2\u01b3\u01b2\3\2\2\2\u01b3\u01b4\3\2\2\2\u01b4"+ + "\u01b7\3\2\2\2\u01b5\u01b8\5\b\5\2\u01b6\u01b8\5N(\2\u01b7\u01b5\3\2\2"+ + "\2\u01b7\u01b6\3\2\2\2\u01b8\u01ba\3\2\2\2\u01b9\u01bb\7l\2\2\u01ba\u01b9"+ + "\3\2\2\2\u01ba\u01bb\3\2\2\2\u01bb\u01bd\3\2\2\2\u01bc\u01be\5\\/\2\u01bd"+ + "\u01bc\3\2\2\2\u01bd\u01be\3\2\2\2\u01be\u01bf\3\2\2\2\u01bf\u01c0\7l"+ + "\2\2\u01c0[\3\2\2\2\u01c1\u01c3\7W\2\2\u01c2\u01c4\7l\2\2\u01c3\u01c2"+ + "\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c7\3\2\2\2\u01c5\u01c8\5\b\5\2\u01c6"+ + "\u01c8\5N(\2\u01c7\u01c5\3\2\2\2\u01c7\u01c6\3\2\2\2\u01c8]\3\2\2\2\u01c9"+ + "\u01cb\5`\61\2\u01ca\u01cc\7l\2\2\u01cb\u01ca\3\2\2\2\u01cb\u01cc\3\2"+ + "\2\2\u01cc\u01cf\3\2\2\2\u01cd\u01d0\5\b\5\2\u01ce\u01d0\5N(\2\u01cf\u01cd"+ + "\3\2\2\2\u01cf\u01ce\3\2\2\2\u01d0\u01d2\3\2\2\2\u01d1\u01d3\7l\2\2\u01d2"+ + "\u01d1\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d5\3\2\2\2\u01d4\u01d6\5\\"+ + "/\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7"+ + "\u01d8\7l\2\2\u01d8_\3\2\2\2\u01d9\u01da\t\17\2\2\u01daa\3\2\2\2\u01db"+ + "\u01de\7d\2\2\u01dc\u01df\58\35\2\u01dd\u01df\5\64\33\2\u01de\u01dc\3"+ + "\2\2\2\u01de\u01dd\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0\u01e1\7e\2\2\u01e1"+ + "\u01e3\5&\24\2\u01e2\u01e4\7l\2\2\u01e3\u01e2\3\2\2\2\u01e3\u01e4\3\2"+ + "\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e6\5N(\2\u01e6c\3\2\2\2\u01e7\u01e8"+ + "\7f\2\2\u01e8\u01ea\5&\24\2\u01e9\u01eb\7l\2\2\u01ea\u01e9\3\2\2\2\u01ea"+ + "\u01eb\3\2\2\2\u01eb\u01ee\3\2\2\2\u01ec\u01ef\5\b\5\2\u01ed\u01ef\5N"+ + "(\2\u01ee\u01ec\3\2\2\2\u01ee\u01ed\3\2\2\2\u01efe\3\2\2\2\u01f0\u01f3"+ + "\7g\2\2\u01f1\u01f4\5\b\5\2\u01f2\u01f4\5N(\2\u01f3\u01f1\3\2\2\2\u01f3"+ + "\u01f2\3\2\2\2\u01f4\u01f6\3\2\2\2\u01f5\u01f7\7l\2\2\u01f6\u01f5\3\2"+ + "\2\2\u01f6\u01f7\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8\u01f9\7h\2\2\u01f9"+ + "\u01fa\5&\24\2\u01fag\3\2\2\29jlsx\u0092\u009b\u009f\u00a6\u00a9\u00ae"+ + "\u00b2\u00b8\u00ca\u00d9\u00ec\u0116\u0118\u011a\u011f\u0123\u0129\u012d"+ + "\u0136\u013b\u0148\u0150\u015c\u016a\u0173\u0179\u0180\u0186\u0188\u0195"+ + "\u019c\u01a4\u01a7\u01ab\u01ae\u01b3\u01b7\u01ba\u01bd\u01c3\u01c7\u01cb"+ + "\u01cf\u01d2\u01d5\u01de\u01e3\u01ea\u01ee\u01f3\u01f6"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/docs/source/programming.rst b/docs/source/programming.rst index 9ae5cd55e..53e3e8bce 100644 --- a/docs/source/programming.rst +++ b/docs/source/programming.rst @@ -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) diff --git a/docs/source/syntaxreference.rst b/docs/source/syntaxreference.rst index be74bdfc7..32784b37b 100644 --- a/docs/source/syntaxreference.rst +++ b/docs/source/syntaxreference.rst @@ -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 in [ step ] { ; 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 { ; 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 ( ) [else ] + if [else ] where can be just a single statement for instance just a ``goto``, or it can be a block such as this:: - if ( ) { + if { } else {