asmsubs can now specify params and return values to be on the stack.

implemented fast integer fixed-point sin and cosine functions.
This commit is contained in:
Irmen de Jong
2019-01-04 22:11:46 +01:00
parent 526b28caa7
commit 32d82e8e56
12 changed files with 759 additions and 544 deletions

View File

@@ -235,13 +235,13 @@ asmsub_address : '=' address=integerliteral ;
asmsub_params : asmsub_param (',' EOL? asmsub_param)* ; asmsub_params : asmsub_param (',' EOL? asmsub_param)* ;
asmsub_param : vardecl '@' (registerorpair | statusregister); asmsub_param : vardecl '@' (registerorpair | statusregister | stack='stack');
clobber : register (',' register)* ; clobber : register (',' register)* ;
asmsub_returns : asmsub_return (',' EOL? asmsub_return)* ; asmsub_returns : asmsub_return (',' EOL? asmsub_return)* ;
asmsub_return : datatype '@' (registerorpair | statusregister) ; asmsub_return : datatype '@' (registerorpair | statusregister | stack='stack') ;
if_stmt : 'if' expression EOL? (statement | statement_block) EOL? else_part? ; // statement is constrained later if_stmt : 'if' expression EOL? (statement | statement_block) EOL? else_part? ; // statement is constrained later

View File

@@ -7,63 +7,146 @@
sub start() { sub start() {
ubyte i=0 ubyte i=0
vm_write_str("sin 0 ")
i=0
vm_write_num(sin8(0))
vm_write_char(':')
vm_write_num(sin8(i))
vm_write_char('\n')
vm_write_str("sin 50 ")
i=50
vm_write_num(sin8(50))
vm_write_char(':')
vm_write_num(sin8(i))
vm_write_char('\n')
vm_write_str("sin 128 ")
i=128
vm_write_num(sin8(128))
vm_write_char(':')
vm_write_num(sin8(i))
vm_write_char('\n')
vm_write_str("sin 140 ")
i=140
vm_write_num(sin8(140))
vm_write_char(':')
vm_write_num(sin8(i))
vm_write_char('\n')
vm_write_str("sin 250 ")
i=250
vm_write_num(sin8(250))
vm_write_char(':')
vm_write_num(sin8(i))
vm_write_char('\n')
vm_write_str("cos 0 ")
i=0
vm_write_num(cos8(0))
vm_write_char(':')
vm_write_num(cos8(i))
vm_write_char('\n')
vm_write_str("cos 50 ")
i=50
vm_write_num(cos8(50))
vm_write_char(':')
vm_write_num(cos8(i))
vm_write_char('\n')
vm_write_str("cos 128 ")
i=128
vm_write_num(cos8(128))
vm_write_char(':')
vm_write_num(cos8(i))
vm_write_char('\n')
vm_write_str("cos 140 ")
i=140
vm_write_num(cos8(140))
vm_write_char(':')
vm_write_num(cos8(i))
vm_write_char('\n')
vm_write_str("cos 250 ")
i=250
vm_write_num(cos8(250))
vm_write_char(':')
vm_write_num(cos8(i))
vm_write_char('\n')
vm_write_char('\n')
vm_write_str("sin16 0 ")
i=0
vm_write_num(sin16(0))
vm_write_char(':')
vm_write_num(sin16(i))
vm_write_char('\n')
vm_write_str("sin16 50 ")
i=50
vm_write_num(sin16(50))
vm_write_char(':')
vm_write_num(sin16(i))
vm_write_char('\n')
vm_write_str("sin16 128 ")
i=128
vm_write_num(sin16(128))
vm_write_char(':')
vm_write_num(sin16(i))
vm_write_char('\n')
vm_write_str("sin16 140 ")
i=140
vm_write_num(sin16(140))
vm_write_char(':')
vm_write_num(sin16(i))
vm_write_char('\n')
vm_write_str("sin16 250 ")
i=250
vm_write_num(sin16(250))
vm_write_char(':')
vm_write_num(sin16(i))
vm_write_char('\n')
vm_write_str("cos16 0 ")
i=0
vm_write_num(cos16(0))
vm_write_char(':')
vm_write_num(cos16(i))
vm_write_char('\n')
vm_write_str("cos16 50 ")
i=50
vm_write_num(cos16(50))
vm_write_char(':')
vm_write_num(cos16(i))
vm_write_char('\n')
vm_write_str("cos16 128 ")
i=128
vm_write_num(cos16(128))
vm_write_char(':')
vm_write_num(cos16(i))
vm_write_char('\n')
vm_write_str("cos16 140 ")
i=140
vm_write_num(cos16(140))
vm_write_char(':')
vm_write_num(cos16(i))
vm_write_char('\n')
vm_write_str("cos16 250 ")
i=250
vm_write_num(cos16(250))
vm_write_char(':')
vm_write_num(cos16(i))
vm_write_char('\n')
repeat {
c64scr.print_ub(X)
c64.CHROUT('\n')
ubyte ubx = fastsin8(i) as ubyte
c64scr.print_ub(X)
c64.CHROUT('\n')
;c64scr.print_ub(X)
;byte y = fastcos8(i)
c64scr.print_ub(ubx)
;c64.CHROUT(',')
;c64scr.print_b(y)
c64.CHROUT('\n')
i++
} until i==0
} }
asmsub fastsin8(ubyte angle8 @ Y) -> clobbers() -> (byte @ A) {
%asm {{
lda sinecos8hi,y
;sta prog8_lib.ESTACK_LO,x
;dex
rts
}}
}
asmsub fastcos8(ubyte angle8 @ Y) -> clobbers() -> (byte @ A) {
%asm {{
lda sinecos8hi+64,y
rts
}}
}
asmsub fastsin16(ubyte angle8 @ Y) -> clobbers() -> (word @ AY) {
%asm {{
lda sinecos8lo,y
pha
lda sinecos8hi,y
tay
pla
rts
}}
}
asmsub fastcos16(ubyte angle8 @ Y) -> clobbers() -> (word @ AY) {
%asm {{
lda sinecos8lo+64,y
pha
lda sinecos8hi+64,y
tay
pla
rts
}}
}
%asm {{
_ := 32767.5 * sin(range(256+64) * rad(360.0/256.0))
sinecos8lo .byte <_
sinecos8hi .byte >_
}}
} }

View File

@@ -1607,7 +1607,7 @@ class InlineAssembly(val assembly: String, override val position: Position) : IS
} }
data class RegisterOrStatusflag(val registerOrPair: RegisterOrPair?, val statusflag: Statusflag?) data class RegisterOrStatusflag(val registerOrPair: RegisterOrPair?, val statusflag: Statusflag?, val stack: Boolean?)
class AnonymousScope(override var statements: MutableList<IStatement>, class AnonymousScope(override var statements: MutableList<IStatement>,
override val position: Position) : INameScope, IStatement { override val position: Position) : INameScope, IStatement {
@@ -1911,8 +1911,8 @@ private fun prog8Parser.AsmsubroutineContext.toAst(): IStatement {
val returns = asmsub_returns()?.toAst() ?: emptyList() val returns = asmsub_returns()?.toAst() ?: emptyList()
val normalParameters = params.map { SubroutineParameter(it.name, it.type, it.position) } val normalParameters = params.map { SubroutineParameter(it.name, it.type, it.position) }
val normalReturnvalues = returns.map { it.type } val normalReturnvalues = returns.map { it.type }
val paramRegisters = params.map { RegisterOrStatusflag(it.registerOrPair, it.statusflag) } val paramRegisters = params.map { RegisterOrStatusflag(it.registerOrPair, it.statusflag, it.stack) }
val returnRegisters = returns.map { RegisterOrStatusflag(it.registerOrPair, it.statusflag) } val returnRegisters = returns.map { RegisterOrStatusflag(it.registerOrPair, it.statusflag, it.stack) }
val clobbers = clobber()?.toAst() ?: emptySet() val clobbers = clobber()?.toAst() ?: emptySet()
val statements = statement_block()?.toAst() ?: mutableListOf() val statements = statement_block()?.toAst() ?: mutableListOf()
return Subroutine(name, normalParameters, normalReturnvalues, return Subroutine(name, normalParameters, normalReturnvalues,
@@ -1923,23 +1923,26 @@ private class AsmSubroutineParameter(name: String,
type: DataType, type: DataType,
val registerOrPair: RegisterOrPair?, val registerOrPair: RegisterOrPair?,
val statusflag: Statusflag?, val statusflag: Statusflag?,
val stack: Boolean,
position: Position) : SubroutineParameter(name, type, position) position: Position) : SubroutineParameter(name, type, position)
private class AsmSubroutineReturn(val type: DataType, private class AsmSubroutineReturn(val type: DataType,
val registerOrPair: RegisterOrPair?, val registerOrPair: RegisterOrPair?,
val statusflag: Statusflag?, val statusflag: Statusflag?,
val position: Position) val stack: Boolean,
val position: Position) {
}
private fun prog8Parser.ClobberContext.toAst(): Set<Register> private fun prog8Parser.ClobberContext.toAst(): Set<Register>
= this.register().asSequence().map { it.toAst() }.toSet() = this.register().asSequence().map { it.toAst() }.toSet()
private fun prog8Parser.Asmsub_returnsContext.toAst(): List<AsmSubroutineReturn> private fun prog8Parser.Asmsub_returnsContext.toAst(): List<AsmSubroutineReturn>
= asmsub_return().map { AsmSubroutineReturn(it.datatype().toAst(), it.registerorpair()?.toAst(), it.statusregister()?.toAst(), toPosition()) } = asmsub_return().map { AsmSubroutineReturn(it.datatype().toAst(), it.registerorpair()?.toAst(), it.statusregister()?.toAst(), !it.stack?.text.isNullOrEmpty(), toPosition()) }
private fun prog8Parser.Asmsub_paramsContext.toAst(): List<AsmSubroutineParameter> private fun prog8Parser.Asmsub_paramsContext.toAst(): List<AsmSubroutineParameter>
= asmsub_param().map { AsmSubroutineParameter(it.vardecl().identifier().text, it.vardecl().datatype().toAst(), it.registerorpair()?.toAst(), it.statusregister()?.toAst(), toPosition()) } = asmsub_param().map { AsmSubroutineParameter(it.vardecl().identifier().text, it.vardecl().datatype().toAst(),
it.registerorpair()?.toAst(), it.statusregister()?.toAst(), !it.stack?.text.isNullOrEmpty(), toPosition()) }
private fun prog8Parser.StatusregisterContext.toAst() = Statusflag.valueOf(text) private fun prog8Parser.StatusregisterContext.toAst() = Statusflag.valueOf(text)

View File

@@ -714,7 +714,9 @@ class AstChecker(private val namespace: INameScope,
override fun process(typecast: TypecastExpression): IExpression { override fun process(typecast: TypecastExpression): IExpression {
val funcTarget = (typecast.expression as? IFunctionCall)?.target?.targetStatement(namespace) val funcTarget = (typecast.expression as? IFunctionCall)?.target?.targetStatement(namespace)
if(funcTarget is Subroutine && funcTarget.asmReturnvaluesRegisters.isNotEmpty()) { if(funcTarget is Subroutine &&
funcTarget.asmReturnvaluesRegisters.isNotEmpty() &&
funcTarget.asmReturnvaluesRegisters.all { it.stack!=true }) {
checkResult.add(ExpressionError("cannot type cast a call to an asmsub that returns value in register - use a variable to store it first", typecast.position)) checkResult.add(ExpressionError("cannot type cast a call to an asmsub that returns value in register - use a variable to store it first", typecast.position))
} }
return super.process(typecast) return super.process(typecast)

View File

@@ -2045,7 +2045,9 @@ private class StatementTranslator(private val prog: IntermediateProgram,
private fun translate(expr: TypecastExpression) { private fun translate(expr: TypecastExpression) {
val funcTarget = (expr.expression as? IFunctionCall)?.target?.targetStatement(namespace) val funcTarget = (expr.expression as? IFunctionCall)?.target?.targetStatement(namespace)
if(funcTarget is Subroutine && funcTarget.asmReturnvaluesRegisters.isNotEmpty()) { if(funcTarget is Subroutine &&
funcTarget.asmReturnvaluesRegisters.isNotEmpty() &&
funcTarget.asmReturnvaluesRegisters.all { it.stack!=true }) {
throw CompilerException("cannot type cast a call to an asmsub that returns value in register - use a variable to store it first") throw CompilerException("cannot type cast a call to an asmsub that returns value in register - use a variable to store it first")
} }

View File

@@ -2,7 +2,10 @@ package prog8.functions
import prog8.ast.* import prog8.ast.*
import prog8.compiler.HeapValues import prog8.compiler.HeapValues
import kotlin.math.PI
import kotlin.math.cos
import kotlin.math.log2 import kotlin.math.log2
import kotlin.math.sin
class BuiltinFunctionParam(val name: String, val possibleDatatypes: Set<DataType>) class BuiltinFunctionParam(val name: String, val possibleDatatypes: Set<DataType>)
@@ -28,7 +31,11 @@ val BuiltinFunctions = mapOf(
"abs" to FunctionSignature(true, listOf(BuiltinFunctionParam("value", NumericDatatypes)), null, ::builtinAbs), // type depends on argument "abs" to FunctionSignature(true, listOf(BuiltinFunctionParam("value", NumericDatatypes)), null, ::builtinAbs), // type depends on argument
// normal functions follow: // normal functions follow:
"sin" to FunctionSignature(true, listOf(BuiltinFunctionParam("rads", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::sin) }, "sin" to FunctionSignature(true, listOf(BuiltinFunctionParam("rads", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::sin) },
"sin8" to FunctionSignature(true, listOf(BuiltinFunctionParam("angle8", setOf(DataType.UBYTE))), DataType.BYTE, ::builtinSin8 ),
"sin16" to FunctionSignature(true, listOf(BuiltinFunctionParam("angle8", setOf(DataType.UBYTE))), DataType.WORD, ::builtinSin16 ),
"cos" to FunctionSignature(true, listOf(BuiltinFunctionParam("rads", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::cos) }, "cos" to FunctionSignature(true, listOf(BuiltinFunctionParam("rads", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::cos) },
"cos8" to FunctionSignature(true, listOf(BuiltinFunctionParam("angle8", setOf(DataType.UBYTE))), DataType.BYTE, ::builtinCos8 ),
"cos16" to FunctionSignature(true, listOf(BuiltinFunctionParam("angle8", setOf(DataType.UBYTE))), DataType.WORD, ::builtinCos16 ),
"tan" to FunctionSignature(true, listOf(BuiltinFunctionParam("rads", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::tan) }, "tan" to FunctionSignature(true, listOf(BuiltinFunctionParam("rads", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::tan) },
"atan" to FunctionSignature(true, listOf(BuiltinFunctionParam("rads", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::atan) }, "atan" to FunctionSignature(true, listOf(BuiltinFunctionParam("rads", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::atan) },
"ln" to FunctionSignature(true, listOf(BuiltinFunctionParam("value", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::log) }, "ln" to FunctionSignature(true, listOf(BuiltinFunctionParam("value", setOf(DataType.FLOAT))), DataType.FLOAT) { a, p, n, h -> oneDoubleArg(a, p, n, h, Math::log) },
@@ -291,6 +298,38 @@ private fun builtinLen(args: List<IExpression>, position: Position, namespace:IN
} }
} }
private fun builtinSin8(args: List<IExpression>, position: Position, namespace:INameScope, heap: HeapValues): LiteralValue {
if (args.size != 1)
throw SyntaxError("sin8 requires one argument", position)
val constval = args[0].constValue(namespace, heap) ?: throw NotConstArgumentException()
val rad = constval.asNumericValue!!.toDouble() /256.0 * 2.0 * PI
return LiteralValue(DataType.BYTE, bytevalue = (32767.5* sin(rad)).toInt().shr(8).toShort(), position = position)
}
private fun builtinCos8(args: List<IExpression>, position: Position, namespace:INameScope, heap: HeapValues): LiteralValue {
if (args.size != 1)
throw SyntaxError("cos8 requires one argument", position)
val constval = args[0].constValue(namespace, heap) ?: throw NotConstArgumentException()
val rad = constval.asNumericValue!!.toDouble() /256.0 * 2.0 * PI
return LiteralValue(DataType.BYTE, bytevalue = (32767.5* cos(rad)).toInt().shr(8).toShort(), position = position)
}
private fun builtinSin16(args: List<IExpression>, position: Position, namespace:INameScope, heap: HeapValues): LiteralValue {
if (args.size != 1)
throw SyntaxError("sin16 requires one argument", position)
val constval = args[0].constValue(namespace, heap) ?: throw NotConstArgumentException()
val rad = constval.asNumericValue!!.toDouble() /256.0 * 2.0 * PI
return LiteralValue(DataType.WORD, wordvalue = (32767.5* sin(rad)).toInt(), position = position)
}
private fun builtinCos16(args: List<IExpression>, position: Position, namespace:INameScope, heap: HeapValues): LiteralValue {
if (args.size != 1)
throw SyntaxError("cos16 requires one argument", position)
val constval = args[0].constValue(namespace, heap) ?: throw NotConstArgumentException()
val rad = constval.asNumericValue!!.toDouble() /256.0 * 2.0 * PI
return LiteralValue(DataType.WORD, wordvalue = (32767.5* cos(rad)).toInt(), position = position)
}
private fun numericLiteral(value: Number, position: Position): LiteralValue { private fun numericLiteral(value: Number, position: Position): LiteralValue {
val floatNum=value.toDouble() val floatNum=value.toDouble()
val tweakedValue: Number = val tweakedValue: Number =

View File

@@ -12,6 +12,7 @@ import prog8.functions.BuiltinFunctions
todo remove unused strings and arrays from the heap todo remove unused strings and arrays from the heap
todo remove if statements with empty statement blocks todo remove if statements with empty statement blocks
todo replace if statements with only else block todo replace if statements with only else block
todo regular subroutines that have 1 or 2 (u)byte or 1 (u)word parameters -> change to asmsub to accept these in A/Y registers instead of on stack
todo statement optimization: create augmented assignment from assignment that only refers to its lvalue (A=A+10, A=4*A, ...) todo statement optimization: create augmented assignment from assignment that only refers to its lvalue (A=A+10, A=4*A, ...)
todo statement optimization: X+=1, X-=1 --> X++/X-- (to 3? 4? incs/decs in a row after that use arithmetic) todo statement optimization: X+=1, X-=1 --> X++/X-- (to 3? 4? incs/decs in a row after that use arithmetic)
todo remove statements that have no effect X=X , X+=0, X-=0, X*=1, X/=1, X//=1, A |= 0, A ^= 0, A<<=0, etc etc todo remove statements that have no effect X=X , X+=0, X-=0, X*=1, X/=1, X//=1, A |= 0, A ^= 0, A<<=0, etc etc

View File

@@ -32,9 +32,9 @@ public class prog8Lexer extends Lexer {
T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94, T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94,
T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101, T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101,
T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107, T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107,
T__107=108, T__108=109, LINECOMMENT=110, COMMENT=111, WS=112, EOL=113, T__107=108, T__108=109, T__109=110, LINECOMMENT=111, COMMENT=112, WS=113,
NAME=114, DEC_INTEGER=115, HEX_INTEGER=116, BIN_INTEGER=117, FLOAT_NUMBER=118, EOL=114, NAME=115, DEC_INTEGER=116, HEX_INTEGER=117, BIN_INTEGER=118,
STRING=119, INLINEASMBLOCK=120, SINGLECHAR=121; FLOAT_NUMBER=119, STRING=120, INLINEASMBLOCK=121, SINGLECHAR=122;
public static String[] channelNames = { public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN" "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
}; };
@@ -58,8 +58,8 @@ public class prog8Lexer extends Lexer {
"T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "T__88", "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__89", "T__90", "T__91", "T__92", "T__93", "T__94", "T__95", "T__96",
"T__97", "T__98", "T__99", "T__100", "T__101", "T__102", "T__103", "T__104", "T__97", "T__98", "T__99", "T__100", "T__101", "T__102", "T__103", "T__104",
"T__105", "T__106", "T__107", "T__108", "LINECOMMENT", "COMMENT", "WS", "T__105", "T__106", "T__107", "T__108", "T__109", "LINECOMMENT", "COMMENT",
"EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK", "SINGLECHAR" "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK", "SINGLECHAR"
}; };
} }
@@ -78,10 +78,10 @@ public class prog8Lexer extends Lexer {
"'('", "')'", "'as'", "'@'", "'return'", "'break'", "'continue'", "'.'", "'('", "')'", "'as'", "'@'", "'return'", "'break'", "'continue'", "'.'",
"'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'",
"'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'sub'", "'->'", "'{'", "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'sub'", "'->'", "'{'",
"'}'", "'asmsub'", "'clobbers'", "'if'", "'else'", "'if_cs'", "'if_cc'", "'}'", "'asmsub'", "'clobbers'", "'stack'", "'if'", "'else'", "'if_cs'",
"'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'", "'if_mi'", "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'",
"'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'", "'repeat'", "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'",
"'until'" "'repeat'", "'until'"
}; };
} }
private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -96,7 +96,7 @@ public class prog8Lexer extends Lexer {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK",
"SINGLECHAR" "SINGLECHAR"
}; };
@@ -162,13 +162,13 @@ public class prog8Lexer extends Lexer {
@Override @Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) { switch (ruleIndex) {
case 120: case 121:
STRING_action((RuleContext)_localctx, actionIndex); STRING_action((RuleContext)_localctx, actionIndex);
break; break;
case 121: case 122:
INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex); INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex);
break; break;
case 122: case 123:
SINGLECHAR_action((RuleContext)_localctx, actionIndex); SINGLECHAR_action((RuleContext)_localctx, actionIndex);
break; break;
} }
@@ -208,7 +208,7 @@ public class prog8Lexer extends Lexer {
} }
public static final String _serializedATN = public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2{\u035a\b\1\4\2\t"+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2|\u0362\b\1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -221,277 +221,280 @@ public class prog8Lexer extends Lexer {
"\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ "\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"+ "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+
"k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+
"w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4"+ "w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3"+
"\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+ "\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+
"\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+ "\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3"+
"\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3"+ "\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n"+
"\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+ "\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
"\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3"+ "\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3"+
"\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16"+ "\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3"+
"\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22"+ "\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3"+
"\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24"+ "\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3"+
"\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27"+ "\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\27\3"+
"\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\32"+ "\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3"+
"\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34"+ "\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3"+
"\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!\3\"\3\""+ "\34\3\34\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!"+
"\3\"\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3"+ "\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3("+
")\3)\3*\3*\3+\3+\3,\3,\3,\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3\61\3\61\3\62"+ "\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\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\66\3\67"+ "\3\61\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\66\3\66"+
"\3\67\38\38\39\39\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3>\3>\3"+ "\3\66\3\67\3\67\38\38\39\39\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3<\3=\3="+
">\3>\3?\3?\3?\3?\3@\3@\3A\3A\3B\3B\3B\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3"+ "\3=\3>\3>\3>\3>\3?\3?\3?\3?\3@\3@\3A\3A\3B\3B\3B\3C\3C\3D\3D\3D\3D\3D"+
"E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3H\3H\3I\3I\3J\3J\3K\3"+ "\3D\3D\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3H\3H\3I\3I"+
"K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3R\3R\3R\3"+ "\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q"+
"S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V\3V\3V\3W\3W\3W\3"+ "\3R\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V\3V\3V"+
"X\3X\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\"+ "\3W\3W\3W\3X\3X\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3[\3[\3["+
"\3]\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`"+ "\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`"+
"\3a\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d"+ "\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d"+
"\3e\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h"+ "\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g"+
"\3h\3h\3h\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3k\3k\3k\3l\3l\3l\3l\3l\3l\3m"+ "\3g\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3k\3k\3k"+
"\3m\3m\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3o\3o\7o\u02e9\no\fo\16o\u02ec\13"+ "\3k\3l\3l\3l\3m\3m\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o"+
"o\3o\3o\3o\3o\3p\3p\7p\u02f4\np\fp\16p\u02f7\13p\3p\3p\3q\3q\3q\3q\3r"+ "\3p\3p\7p\u02f1\np\fp\16p\u02f4\13p\3p\3p\3p\3p\3q\3q\7q\u02fc\nq\fq\16"+
"\6r\u0300\nr\rr\16r\u0301\3s\3s\7s\u0306\ns\fs\16s\u0309\13s\3t\3t\3t"+ "q\u02ff\13q\3q\3q\3r\3r\3r\3r\3s\6s\u0308\ns\rs\16s\u0309\3t\3t\7t\u030e"+
"\6t\u030e\nt\rt\16t\u030f\5t\u0312\nt\3u\3u\6u\u0316\nu\ru\16u\u0317\3"+ "\nt\ft\16t\u0311\13t\3u\3u\3u\6u\u0316\nu\ru\16u\u0317\5u\u031a\nu\3v"+
"v\3v\6v\u031c\nv\rv\16v\u031d\3w\3w\3w\5w\u0323\nw\3w\5w\u0326\nw\3x\6"+ "\3v\6v\u031e\nv\rv\16v\u031f\3w\3w\6w\u0324\nw\rw\16w\u0325\3x\3x\3x\5"+
"x\u0329\nx\rx\16x\u032a\3x\3x\6x\u032f\nx\rx\16x\u0330\5x\u0333\nx\3y"+ "x\u032b\nx\3x\5x\u032e\nx\3y\6y\u0331\ny\ry\16y\u0332\3y\3y\6y\u0337\n"+
"\3y\3y\3y\5y\u0339\ny\3z\3z\3z\7z\u033e\nz\fz\16z\u0341\13z\3z\3z\3z\3"+ "y\ry\16y\u0338\5y\u033b\ny\3z\3z\3z\3z\5z\u0341\nz\3{\3{\3{\7{\u0346\n"+
"{\3{\3{\3{\6{\u034a\n{\r{\16{\u034b\3{\3{\3{\3{\3{\3|\3|\3|\5|\u0356\n"+ "{\f{\16{\u0349\13{\3{\3{\3{\3|\3|\3|\3|\6|\u0352\n|\r|\16|\u0353\3|\3"+
"|\3|\3|\3|\3\u034b\2}\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27"+ "|\3|\3|\3|\3}\3}\3}\5}\u035e\n}\3}\3}\3}\3\u0353\2~\3\3\5\4\7\5\t\6\13"+
"\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33"+ "\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'"+
"\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63"+ "\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'"+
"e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089"+ "M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177"+
"F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d"+ "A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093"+
"P\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1"+ "K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7"+
"Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5"+ "U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb"+
"d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9"+ "_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cf"+
"n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00ed"+ "i\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3"+
"x\u00ef\2\u00f1\2\u00f3y\u00f5z\u00f7{\3\2\n\4\2\f\f\17\17\4\2\13\13\""+ "s\u00e5t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1\2\u00f3\2\u00f5z\u00f7"+
"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17"+ "{\u00f9|\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5"+
"$$^^\2\u0369\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\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u0371\2\3\3\2\2\2\2\5\3"+
"\2\2\2\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"+ "\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"+
"\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"+ "\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#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2"+ "\2\2\2\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\'"+
"\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"+ "\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"+
"\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"+ "\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"+
"\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2"+ "?\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"+
"S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\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\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\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\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\2"+ "e\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"+
"y\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"+ "\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"+
"\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\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"+
"\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\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2"+
"\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\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"+
"\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\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2"+
"\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\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"+
"\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\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2"+
"\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\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"+
"\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\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2"+
"\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\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"+
"\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\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2"+
"\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2"+ "\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1"+
"\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00f3"+ "\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2"+
"\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\3\u00f9\3\2\2\2\5\u00fb\3\2\2"+ "\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7"+
"\2\7\u00fd\3\2\2\2\t\u0102\3\2\2\2\13\u010a\3\2\2\2\r\u0114\3\2\2\2\17"+ "\3\2\2\2\2\u00f9\3\2\2\2\3\u00fb\3\2\2\2\5\u00fd\3\2\2\2\7\u00ff\3\2\2"+
"\u011e\3\2\2\2\21\u012a\3\2\2\2\23\u0133\3\2\2\2\25\u013b\3\2\2\2\27\u0147"+ "\2\t\u0104\3\2\2\2\13\u010c\3\2\2\2\r\u0116\3\2\2\2\17\u0120\3\2\2\2\21"+
"\3\2\2\2\31\u0153\3\2\2\2\33\u015e\3\2\2\2\35\u0166\3\2\2\2\37\u0168\3"+ "\u012c\3\2\2\2\23\u0135\3\2\2\2\25\u013d\3\2\2\2\27\u0149\3\2\2\2\31\u0155"+
"\2\2\2!\u016a\3\2\2\2#\u0170\3\2\2\2%\u0177\3\2\2\2\'\u017d\3\2\2\2)\u0182"+ "\3\2\2\2\33\u0160\3\2\2\2\35\u0168\3\2\2\2\37\u016a\3\2\2\2!\u016c\3\2"+
"\3\2\2\2+\u0188\3\2\2\2-\u018d\3\2\2\2/\u0193\3\2\2\2\61\u0197\3\2\2\2"+ "\2\2#\u0172\3\2\2\2%\u0179\3\2\2\2\'\u017f\3\2\2\2)\u0184\3\2\2\2+\u018a"+
"\63\u019d\3\2\2\2\65\u01a3\3\2\2\2\67\u01aa\3\2\2\29\u01ac\3\2\2\2;\u01ae"+ "\3\2\2\2-\u018f\3\2\2\2/\u0195\3\2\2\2\61\u0199\3\2\2\2\63\u019f\3\2\2"+
"\3\2\2\2=\u01b1\3\2\2\2?\u01b4\3\2\2\2A\u01b7\3\2\2\2C\u01bb\3\2\2\2E"+ "\2\65\u01a5\3\2\2\2\67\u01ac\3\2\2\29\u01ae\3\2\2\2;\u01b0\3\2\2\2=\u01b3"+
"\u01be\3\2\2\2G\u01c2\3\2\2\2I\u01c5\3\2\2\2K\u01c8\3\2\2\2M\u01cb\3\2"+ "\3\2\2\2?\u01b6\3\2\2\2A\u01b9\3\2\2\2C\u01bd\3\2\2\2E\u01c0\3\2\2\2G"+
"\2\2O\u01ce\3\2\2\2Q\u01d1\3\2\2\2S\u01d4\3\2\2\2U\u01d6\3\2\2\2W\u01d8"+ "\u01c4\3\2\2\2I\u01c7\3\2\2\2K\u01ca\3\2\2\2M\u01cd\3\2\2\2O\u01d0\3\2"+
"\3\2\2\2Y\u01db\3\2\2\2[\u01dd\3\2\2\2]\u01df\3\2\2\2_\u01e2\3\2\2\2a"+ "\2\2Q\u01d3\3\2\2\2S\u01d6\3\2\2\2U\u01d8\3\2\2\2W\u01da\3\2\2\2Y\u01dd"+
"\u01e4\3\2\2\2c\u01e6\3\2\2\2e\u01e8\3\2\2\2g\u01eb\3\2\2\2i\u01ee\3\2"+ "\3\2\2\2[\u01df\3\2\2\2]\u01e1\3\2\2\2_\u01e4\3\2\2\2a\u01e6\3\2\2\2c"+
"\2\2k\u01f1\3\2\2\2m\u01f4\3\2\2\2o\u01f6\3\2\2\2q\u01f8\3\2\2\2s\u01fa"+ "\u01e8\3\2\2\2e\u01ea\3\2\2\2g\u01ed\3\2\2\2i\u01f0\3\2\2\2k\u01f3\3\2"+
"\3\2\2\2u\u01fd\3\2\2\2w\u0202\3\2\2\2y\u0206\3\2\2\2{\u0209\3\2\2\2}"+ "\2\2m\u01f6\3\2\2\2o\u01f8\3\2\2\2q\u01fa\3\2\2\2s\u01fc\3\2\2\2u\u01ff"+
"\u020d\3\2\2\2\177\u0211\3\2\2\2\u0081\u0213\3\2\2\2\u0083\u0215\3\2\2"+ "\3\2\2\2w\u0204\3\2\2\2y\u0208\3\2\2\2{\u020b\3\2\2\2}\u020f\3\2\2\2\177"+
"\2\u0085\u0218\3\2\2\2\u0087\u021a\3\2\2\2\u0089\u0221\3\2\2\2\u008b\u0227"+ "\u0213\3\2\2\2\u0081\u0215\3\2\2\2\u0083\u0217\3\2\2\2\u0085\u021a\3\2"+
"\3\2\2\2\u008d\u0230\3\2\2\2\u008f\u0232\3\2\2\2\u0091\u0234\3\2\2\2\u0093"+ "\2\2\u0087\u021c\3\2\2\2\u0089\u0223\3\2\2\2\u008b\u0229\3\2\2\2\u008d"+
"\u0236\3\2\2\2\u0095\u0238\3\2\2\2\u0097\u023b\3\2\2\2\u0099\u023e\3\2"+ "\u0232\3\2\2\2\u008f\u0234\3\2\2\2\u0091\u0236\3\2\2\2\u0093\u0238\3\2"+
"\2\2\u009b\u0241\3\2\2\2\u009d\u0244\3\2\2\2\u009f\u0247\3\2\2\2\u00a1"+ "\2\2\u0095\u023a\3\2\2\2\u0097\u023d\3\2\2\2\u0099\u0240\3\2\2\2\u009b"+
"\u024a\3\2\2\2\u00a3\u024d\3\2\2\2\u00a5\u0250\3\2\2\2\u00a7\u0255\3\2"+ "\u0243\3\2\2\2\u009d\u0246\3\2\2\2\u009f\u0249\3\2\2\2\u00a1\u024c\3\2"+
"\2\2\u00a9\u025b\3\2\2\2\u00ab\u0260\3\2\2\2\u00ad\u0264\3\2\2\2\u00af"+ "\2\2\u00a3\u024f\3\2\2\2\u00a5\u0252\3\2\2\2\u00a7\u0257\3\2\2\2\u00a9"+
"\u0267\3\2\2\2\u00b1\u0269\3\2\2\2\u00b3\u026b\3\2\2\2\u00b5\u0272\3\2"+ "\u025d\3\2\2\2\u00ab\u0262\3\2\2\2\u00ad\u0266\3\2\2\2\u00af\u0269\3\2"+
"\2\2\u00b7\u027b\3\2\2\2\u00b9\u027e\3\2\2\2\u00bb\u0283\3\2\2\2\u00bd"+ "\2\2\u00b1\u026b\3\2\2\2\u00b3\u026d\3\2\2\2\u00b5\u0274\3\2\2\2\u00b7"+
"\u0289\3\2\2\2\u00bf\u028f\3\2\2\2\u00c1\u0295\3\2\2\2\u00c3\u029a\3\2"+ "\u027d\3\2\2\2\u00b9\u0283\3\2\2\2\u00bb\u0286\3\2\2\2\u00bd\u028b\3\2"+
"\2\2\u00c5\u02a0\3\2\2\2\u00c7\u02a6\3\2\2\2\u00c9\u02ac\3\2\2\2\u00cb"+ "\2\2\u00bf\u0291\3\2\2\2\u00c1\u0297\3\2\2\2\u00c3\u029d\3\2\2\2\u00c5"+
"\u02b3\3\2\2\2\u00cd\u02b9\3\2\2\2\u00cf\u02c0\3\2\2\2\u00d1\u02c6\3\2"+ "\u02a2\3\2\2\2\u00c7\u02a8\3\2\2\2\u00c9\u02ae\3\2\2\2\u00cb\u02b4\3\2"+
"\2\2\u00d3\u02cc\3\2\2\2\u00d5\u02d0\3\2\2\2\u00d7\u02d3\3\2\2\2\u00d9"+ "\2\2\u00cd\u02bb\3\2\2\2\u00cf\u02c1\3\2\2\2\u00d1\u02c8\3\2\2\2\u00d3"+
"\u02d9\3\2\2\2\u00db\u02e0\3\2\2\2\u00dd\u02e6\3\2\2\2\u00df\u02f1\3\2"+ "\u02ce\3\2\2\2\u00d5\u02d4\3\2\2\2\u00d7\u02d8\3\2\2\2\u00d9\u02db\3\2"+
"\2\2\u00e1\u02fa\3\2\2\2\u00e3\u02ff\3\2\2\2\u00e5\u0303\3\2\2\2\u00e7"+ "\2\2\u00db\u02e1\3\2\2\2\u00dd\u02e8\3\2\2\2\u00df\u02ee\3\2\2\2\u00e1"+
"\u0311\3\2\2\2\u00e9\u0313\3\2\2\2\u00eb\u0319\3\2\2\2\u00ed\u031f\3\2"+ "\u02f9\3\2\2\2\u00e3\u0302\3\2\2\2\u00e5\u0307\3\2\2\2\u00e7\u030b\3\2"+
"\2\2\u00ef\u0328\3\2\2\2\u00f1\u0338\3\2\2\2\u00f3\u033a\3\2\2\2\u00f5"+ "\2\2\u00e9\u0319\3\2\2\2\u00eb\u031b\3\2\2\2\u00ed\u0321\3\2\2\2\u00ef"+
"\u0345\3\2\2\2\u00f7\u0352\3\2\2\2\u00f9\u00fa\7\u0080\2\2\u00fa\4\3\2"+ "\u0327\3\2\2\2\u00f1\u0330\3\2\2\2\u00f3\u0340\3\2\2\2\u00f5\u0342\3\2"+
"\2\2\u00fb\u00fc\7<\2\2\u00fc\6\3\2\2\2\u00fd\u00fe\7i\2\2\u00fe\u00ff"+ "\2\2\u00f7\u034d\3\2\2\2\u00f9\u035a\3\2\2\2\u00fb\u00fc\7\u0080\2\2\u00fc"+
"\7q\2\2\u00ff\u0100\7v\2\2\u0100\u0101\7q\2\2\u0101\b\3\2\2\2\u0102\u0103"+ "\4\3\2\2\2\u00fd\u00fe\7<\2\2\u00fe\6\3\2\2\2\u00ff\u0100\7i\2\2\u0100"+
"\7\'\2\2\u0103\u0104\7q\2\2\u0104\u0105\7w\2\2\u0105\u0106\7v\2\2\u0106"+ "\u0101\7q\2\2\u0101\u0102\7v\2\2\u0102\u0103\7q\2\2\u0103\b\3\2\2\2\u0104"+
"\u0107\7r\2\2\u0107\u0108\7w\2\2\u0108\u0109\7v\2\2\u0109\n\3\2\2\2\u010a"+ "\u0105\7\'\2\2\u0105\u0106\7q\2\2\u0106\u0107\7w\2\2\u0107\u0108\7v\2"+
"\u010b\7\'\2\2\u010b\u010c\7n\2\2\u010c\u010d\7c\2\2\u010d\u010e\7w\2"+ "\2\u0108\u0109\7r\2\2\u0109\u010a\7w\2\2\u010a\u010b\7v\2\2\u010b\n\3"+
"\2\u010e\u010f\7p\2\2\u010f\u0110\7e\2\2\u0110\u0111\7j\2\2\u0111\u0112"+ "\2\2\2\u010c\u010d\7\'\2\2\u010d\u010e\7n\2\2\u010e\u010f\7c\2\2\u010f"+
"\7g\2\2\u0112\u0113\7t\2\2\u0113\f\3\2\2\2\u0114\u0115\7\'\2\2\u0115\u0116"+ "\u0110\7w\2\2\u0110\u0111\7p\2\2\u0111\u0112\7e\2\2\u0112\u0113\7j\2\2"+
"\7|\2\2\u0116\u0117\7g\2\2\u0117\u0118\7t\2\2\u0118\u0119\7q\2\2\u0119"+ "\u0113\u0114\7g\2\2\u0114\u0115\7t\2\2\u0115\f\3\2\2\2\u0116\u0117\7\'"+
"\u011a\7r\2\2\u011a\u011b\7c\2\2\u011b\u011c\7i\2\2\u011c\u011d\7g\2\2"+ "\2\2\u0117\u0118\7|\2\2\u0118\u0119\7g\2\2\u0119\u011a\7t\2\2\u011a\u011b"+
"\u011d\16\3\2\2\2\u011e\u011f\7\'\2\2\u011f\u0120\7|\2\2\u0120\u0121\7"+ "\7q\2\2\u011b\u011c\7r\2\2\u011c\u011d\7c\2\2\u011d\u011e\7i\2\2\u011e"+
"r\2\2\u0121\u0122\7t\2\2\u0122\u0123\7g\2\2\u0123\u0124\7u\2\2\u0124\u0125"+ "\u011f\7g\2\2\u011f\16\3\2\2\2\u0120\u0121\7\'\2\2\u0121\u0122\7|\2\2"+
"\7g\2\2\u0125\u0126\7t\2\2\u0126\u0127\7x\2\2\u0127\u0128\7g\2\2\u0128"+ "\u0122\u0123\7r\2\2\u0123\u0124\7t\2\2\u0124\u0125\7g\2\2\u0125\u0126"+
"\u0129\7f\2\2\u0129\20\3\2\2\2\u012a\u012b\7\'\2\2\u012b\u012c\7c\2\2"+ "\7u\2\2\u0126\u0127\7g\2\2\u0127\u0128\7t\2\2\u0128\u0129\7x\2\2\u0129"+
"\u012c\u012d\7f\2\2\u012d\u012e\7f\2\2\u012e\u012f\7t\2\2\u012f\u0130"+ "\u012a\7g\2\2\u012a\u012b\7f\2\2\u012b\20\3\2\2\2\u012c\u012d\7\'\2\2"+
"\7g\2\2\u0130\u0131\7u\2\2\u0131\u0132\7u\2\2\u0132\22\3\2\2\2\u0133\u0134"+ "\u012d\u012e\7c\2\2\u012e\u012f\7f\2\2\u012f\u0130\7f\2\2\u0130\u0131"+
"\7\'\2\2\u0134\u0135\7k\2\2\u0135\u0136\7o\2\2\u0136\u0137\7r\2\2\u0137"+ "\7t\2\2\u0131\u0132\7g\2\2\u0132\u0133\7u\2\2\u0133\u0134\7u\2\2\u0134"+
"\u0138\7q\2\2\u0138\u0139\7t\2\2\u0139\u013a\7v\2\2\u013a\24\3\2\2\2\u013b"+ "\22\3\2\2\2\u0135\u0136\7\'\2\2\u0136\u0137\7k\2\2\u0137\u0138\7o\2\2"+
"\u013c\7\'\2\2\u013c\u013d\7d\2\2\u013d\u013e\7t\2\2\u013e\u013f\7g\2"+ "\u0138\u0139\7r\2\2\u0139\u013a\7q\2\2\u013a\u013b\7t\2\2\u013b\u013c"+
"\2\u013f\u0140\7c\2\2\u0140\u0141\7m\2\2\u0141\u0142\7r\2\2\u0142\u0143"+ "\7v\2\2\u013c\24\3\2\2\2\u013d\u013e\7\'\2\2\u013e\u013f\7d\2\2\u013f"+
"\7q\2\2\u0143\u0144\7k\2\2\u0144\u0145\7p\2\2\u0145\u0146\7v\2\2\u0146"+ "\u0140\7t\2\2\u0140\u0141\7g\2\2\u0141\u0142\7c\2\2\u0142\u0143\7m\2\2"+
"\26\3\2\2\2\u0147\u0148\7\'\2\2\u0148\u0149\7c\2\2\u0149\u014a\7u\2\2"+ "\u0143\u0144\7r\2\2\u0144\u0145\7q\2\2\u0145\u0146\7k\2\2\u0146\u0147"+
"\u014a\u014b\7o\2\2\u014b\u014c\7k\2\2\u014c\u014d\7p\2\2\u014d\u014e"+ "\7p\2\2\u0147\u0148\7v\2\2\u0148\26\3\2\2\2\u0149\u014a\7\'\2\2\u014a"+
"\7e\2\2\u014e\u014f\7n\2\2\u014f\u0150\7w\2\2\u0150\u0151\7f\2\2\u0151"+ "\u014b\7c\2\2\u014b\u014c\7u\2\2\u014c\u014d\7o\2\2\u014d\u014e\7k\2\2"+
"\u0152\7g\2\2\u0152\30\3\2\2\2\u0153\u0154\7\'\2\2\u0154\u0155\7c\2\2"+ "\u014e\u014f\7p\2\2\u014f\u0150\7e\2\2\u0150\u0151\7n\2\2\u0151\u0152"+
"\u0155\u0156\7u\2\2\u0156\u0157\7o\2\2\u0157\u0158\7d\2\2\u0158\u0159"+ "\7w\2\2\u0152\u0153\7f\2\2\u0153\u0154\7g\2\2\u0154\30\3\2\2\2\u0155\u0156"+
"\7k\2\2\u0159\u015a\7p\2\2\u015a\u015b\7c\2\2\u015b\u015c\7t\2\2\u015c"+ "\7\'\2\2\u0156\u0157\7c\2\2\u0157\u0158\7u\2\2\u0158\u0159\7o\2\2\u0159"+
"\u015d\7{\2\2\u015d\32\3\2\2\2\u015e\u015f\7\'\2\2\u015f\u0160\7q\2\2"+ "\u015a\7d\2\2\u015a\u015b\7k\2\2\u015b\u015c\7p\2\2\u015c\u015d\7c\2\2"+
"\u0160\u0161\7r\2\2\u0161\u0162\7v\2\2\u0162\u0163\7k\2\2\u0163\u0164"+ "\u015d\u015e\7t\2\2\u015e\u015f\7{\2\2\u015f\32\3\2\2\2\u0160\u0161\7"+
"\7q\2\2\u0164\u0165\7p\2\2\u0165\34\3\2\2\2\u0166\u0167\7.\2\2\u0167\36"+ "\'\2\2\u0161\u0162\7q\2\2\u0162\u0163\7r\2\2\u0163\u0164\7v\2\2\u0164"+
"\3\2\2\2\u0168\u0169\7?\2\2\u0169 \3\2\2\2\u016a\u016b\7e\2\2\u016b\u016c"+ "\u0165\7k\2\2\u0165\u0166\7q\2\2\u0166\u0167\7p\2\2\u0167\34\3\2\2\2\u0168"+
"\7q\2\2\u016c\u016d\7p\2\2\u016d\u016e\7u\2\2\u016e\u016f\7v\2\2\u016f"+ "\u0169\7.\2\2\u0169\36\3\2\2\2\u016a\u016b\7?\2\2\u016b \3\2\2\2\u016c"+
"\"\3\2\2\2\u0170\u0171\7o\2\2\u0171\u0172\7g\2\2\u0172\u0173\7o\2\2\u0173"+ "\u016d\7e\2\2\u016d\u016e\7q\2\2\u016e\u016f\7p\2\2\u016f\u0170\7u\2\2"+
"\u0174\7q\2\2\u0174\u0175\7t\2\2\u0175\u0176\7{\2\2\u0176$\3\2\2\2\u0177"+ "\u0170\u0171\7v\2\2\u0171\"\3\2\2\2\u0172\u0173\7o\2\2\u0173\u0174\7g"+
"\u0178\7w\2\2\u0178\u0179\7d\2\2\u0179\u017a\7{\2\2\u017a\u017b\7v\2\2"+ "\2\2\u0174\u0175\7o\2\2\u0175\u0176\7q\2\2\u0176\u0177\7t\2\2\u0177\u0178"+
"\u017b\u017c\7g\2\2\u017c&\3\2\2\2\u017d\u017e\7d\2\2\u017e\u017f\7{\2"+ "\7{\2\2\u0178$\3\2\2\2\u0179\u017a\7w\2\2\u017a\u017b\7d\2\2\u017b\u017c"+
"\2\u017f\u0180\7v\2\2\u0180\u0181\7g\2\2\u0181(\3\2\2\2\u0182\u0183\7"+ "\7{\2\2\u017c\u017d\7v\2\2\u017d\u017e\7g\2\2\u017e&\3\2\2\2\u017f\u0180"+
"w\2\2\u0183\u0184\7y\2\2\u0184\u0185\7q\2\2\u0185\u0186\7t\2\2\u0186\u0187"+ "\7d\2\2\u0180\u0181\7{\2\2\u0181\u0182\7v\2\2\u0182\u0183\7g\2\2\u0183"+
"\7f\2\2\u0187*\3\2\2\2\u0188\u0189\7y\2\2\u0189\u018a\7q\2\2\u018a\u018b"+ "(\3\2\2\2\u0184\u0185\7w\2\2\u0185\u0186\7y\2\2\u0186\u0187\7q\2\2\u0187"+
"\7t\2\2\u018b\u018c\7f\2\2\u018c,\3\2\2\2\u018d\u018e\7h\2\2\u018e\u018f"+ "\u0188\7t\2\2\u0188\u0189\7f\2\2\u0189*\3\2\2\2\u018a\u018b\7y\2\2\u018b"+
"\7n\2\2\u018f\u0190\7q\2\2\u0190\u0191\7c\2\2\u0191\u0192\7v\2\2\u0192"+ "\u018c\7q\2\2\u018c\u018d\7t\2\2\u018d\u018e\7f\2\2\u018e,\3\2\2\2\u018f"+
".\3\2\2\2\u0193\u0194\7u\2\2\u0194\u0195\7v\2\2\u0195\u0196\7t\2\2\u0196"+ "\u0190\7h\2\2\u0190\u0191\7n\2\2\u0191\u0192\7q\2\2\u0192\u0193\7c\2\2"+
"\60\3\2\2\2\u0197\u0198\7u\2\2\u0198\u0199\7v\2\2\u0199\u019a\7t\2\2\u019a"+ "\u0193\u0194\7v\2\2\u0194.\3\2\2\2\u0195\u0196\7u\2\2\u0196\u0197\7v\2"+
"\u019b\7a\2\2\u019b\u019c\7r\2\2\u019c\62\3\2\2\2\u019d\u019e\7u\2\2\u019e"+ "\2\u0197\u0198\7t\2\2\u0198\60\3\2\2\2\u0199\u019a\7u\2\2\u019a\u019b"+
"\u019f\7v\2\2\u019f\u01a0\7t\2\2\u01a0\u01a1\7a\2\2\u01a1\u01a2\7u\2\2"+ "\7v\2\2\u019b\u019c\7t\2\2\u019c\u019d\7a\2\2\u019d\u019e\7r\2\2\u019e"+
"\u01a2\64\3\2\2\2\u01a3\u01a4\7u\2\2\u01a4\u01a5\7v\2\2\u01a5\u01a6\7"+ "\62\3\2\2\2\u019f\u01a0\7u\2\2\u01a0\u01a1\7v\2\2\u01a1\u01a2\7t\2\2\u01a2"+
"t\2\2\u01a6\u01a7\7a\2\2\u01a7\u01a8\7r\2\2\u01a8\u01a9\7u\2\2\u01a9\66"+ "\u01a3\7a\2\2\u01a3\u01a4\7u\2\2\u01a4\64\3\2\2\2\u01a5\u01a6\7u\2\2\u01a6"+
"\3\2\2\2\u01aa\u01ab\7]\2\2\u01ab8\3\2\2\2\u01ac\u01ad\7_\2\2\u01ad:\3"+ "\u01a7\7v\2\2\u01a7\u01a8\7t\2\2\u01a8\u01a9\7a\2\2\u01a9\u01aa\7r\2\2"+
"\2\2\2\u01ae\u01af\7-\2\2\u01af\u01b0\7?\2\2\u01b0<\3\2\2\2\u01b1\u01b2"+ "\u01aa\u01ab\7u\2\2\u01ab\66\3\2\2\2\u01ac\u01ad\7]\2\2\u01ad8\3\2\2\2"+
"\7/\2\2\u01b2\u01b3\7?\2\2\u01b3>\3\2\2\2\u01b4\u01b5\7\61\2\2\u01b5\u01b6"+ "\u01ae\u01af\7_\2\2\u01af:\3\2\2\2\u01b0\u01b1\7-\2\2\u01b1\u01b2\7?\2"+
"\7?\2\2\u01b6@\3\2\2\2\u01b7\u01b8\7\61\2\2\u01b8\u01b9\7\61\2\2\u01b9"+ "\2\u01b2<\3\2\2\2\u01b3\u01b4\7/\2\2\u01b4\u01b5\7?\2\2\u01b5>\3\2\2\2"+
"\u01ba\7?\2\2\u01baB\3\2\2\2\u01bb\u01bc\7,\2\2\u01bc\u01bd\7?\2\2\u01bd"+ "\u01b6\u01b7\7\61\2\2\u01b7\u01b8\7?\2\2\u01b8@\3\2\2\2\u01b9\u01ba\7"+
"D\3\2\2\2\u01be\u01bf\7,\2\2\u01bf\u01c0\7,\2\2\u01c0\u01c1\7?\2\2\u01c1"+ "\61\2\2\u01ba\u01bb\7\61\2\2\u01bb\u01bc\7?\2\2\u01bcB\3\2\2\2\u01bd\u01be"+
"F\3\2\2\2\u01c2\u01c3\7(\2\2\u01c3\u01c4\7?\2\2\u01c4H\3\2\2\2\u01c5\u01c6"+ "\7,\2\2\u01be\u01bf\7?\2\2\u01bfD\3\2\2\2\u01c0\u01c1\7,\2\2\u01c1\u01c2"+
"\7~\2\2\u01c6\u01c7\7?\2\2\u01c7J\3\2\2\2\u01c8\u01c9\7`\2\2\u01c9\u01ca"+ "\7,\2\2\u01c2\u01c3\7?\2\2\u01c3F\3\2\2\2\u01c4\u01c5\7(\2\2\u01c5\u01c6"+
"\7?\2\2\u01caL\3\2\2\2\u01cb\u01cc\7\'\2\2\u01cc\u01cd\7?\2\2\u01cdN\3"+ "\7?\2\2\u01c6H\3\2\2\2\u01c7\u01c8\7~\2\2\u01c8\u01c9\7?\2\2\u01c9J\3"+
"\2\2\2\u01ce\u01cf\7-\2\2\u01cf\u01d0\7-\2\2\u01d0P\3\2\2\2\u01d1\u01d2"+ "\2\2\2\u01ca\u01cb\7`\2\2\u01cb\u01cc\7?\2\2\u01ccL\3\2\2\2\u01cd\u01ce"+
"\7/\2\2\u01d2\u01d3\7/\2\2\u01d3R\3\2\2\2\u01d4\u01d5\7-\2\2\u01d5T\3"+ "\7\'\2\2\u01ce\u01cf\7?\2\2\u01cfN\3\2\2\2\u01d0\u01d1\7-\2\2\u01d1\u01d2"+
"\2\2\2\u01d6\u01d7\7/\2\2\u01d7V\3\2\2\2\u01d8\u01d9\7,\2\2\u01d9\u01da"+ "\7-\2\2\u01d2P\3\2\2\2\u01d3\u01d4\7/\2\2\u01d4\u01d5\7/\2\2\u01d5R\3"+
"\7,\2\2\u01daX\3\2\2\2\u01db\u01dc\7,\2\2\u01dcZ\3\2\2\2\u01dd\u01de\7"+ "\2\2\2\u01d6\u01d7\7-\2\2\u01d7T\3\2\2\2\u01d8\u01d9\7/\2\2\u01d9V\3\2"+
"\61\2\2\u01de\\\3\2\2\2\u01df\u01e0\7\61\2\2\u01e0\u01e1\7\61\2\2\u01e1"+ "\2\2\u01da\u01db\7,\2\2\u01db\u01dc\7,\2\2\u01dcX\3\2\2\2\u01dd\u01de"+
"^\3\2\2\2\u01e2\u01e3\7\'\2\2\u01e3`\3\2\2\2\u01e4\u01e5\7>\2\2\u01e5"+ "\7,\2\2\u01deZ\3\2\2\2\u01df\u01e0\7\61\2\2\u01e0\\\3\2\2\2\u01e1\u01e2"+
"b\3\2\2\2\u01e6\u01e7\7@\2\2\u01e7d\3\2\2\2\u01e8\u01e9\7>\2\2\u01e9\u01ea"+ "\7\61\2\2\u01e2\u01e3\7\61\2\2\u01e3^\3\2\2\2\u01e4\u01e5\7\'\2\2\u01e5"+
"\7?\2\2\u01eaf\3\2\2\2\u01eb\u01ec\7@\2\2\u01ec\u01ed\7?\2\2\u01edh\3"+ "`\3\2\2\2\u01e6\u01e7\7>\2\2\u01e7b\3\2\2\2\u01e8\u01e9\7@\2\2\u01e9d"+
"\2\2\2\u01ee\u01ef\7?\2\2\u01ef\u01f0\7?\2\2\u01f0j\3\2\2\2\u01f1\u01f2"+ "\3\2\2\2\u01ea\u01eb\7>\2\2\u01eb\u01ec\7?\2\2\u01ecf\3\2\2\2\u01ed\u01ee"+
"\7#\2\2\u01f2\u01f3\7?\2\2\u01f3l\3\2\2\2\u01f4\u01f5\7(\2\2\u01f5n\3"+ "\7@\2\2\u01ee\u01ef\7?\2\2\u01efh\3\2\2\2\u01f0\u01f1\7?\2\2\u01f1\u01f2"+
"\2\2\2\u01f6\u01f7\7`\2\2\u01f7p\3\2\2\2\u01f8\u01f9\7~\2\2\u01f9r\3\2"+ "\7?\2\2\u01f2j\3\2\2\2\u01f3\u01f4\7#\2\2\u01f4\u01f5\7?\2\2\u01f5l\3"+
"\2\2\u01fa\u01fb\7v\2\2\u01fb\u01fc\7q\2\2\u01fct\3\2\2\2\u01fd\u01fe"+ "\2\2\2\u01f6\u01f7\7(\2\2\u01f7n\3\2\2\2\u01f8\u01f9\7`\2\2\u01f9p\3\2"+
"\7u\2\2\u01fe\u01ff\7v\2\2\u01ff\u0200\7g\2\2\u0200\u0201\7r\2\2\u0201"+ "\2\2\u01fa\u01fb\7~\2\2\u01fbr\3\2\2\2\u01fc\u01fd\7v\2\2\u01fd\u01fe"+
"v\3\2\2\2\u0202\u0203\7c\2\2\u0203\u0204\7p\2\2\u0204\u0205\7f\2\2\u0205"+ "\7q\2\2\u01fet\3\2\2\2\u01ff\u0200\7u\2\2\u0200\u0201\7v\2\2\u0201\u0202"+
"x\3\2\2\2\u0206\u0207\7q\2\2\u0207\u0208\7t\2\2\u0208z\3\2\2\2\u0209\u020a"+ "\7g\2\2\u0202\u0203\7r\2\2\u0203v\3\2\2\2\u0204\u0205\7c\2\2\u0205\u0206"+
"\7z\2\2\u020a\u020b\7q\2\2\u020b\u020c\7t\2\2\u020c|\3\2\2\2\u020d\u020e"+ "\7p\2\2\u0206\u0207\7f\2\2\u0207x\3\2\2\2\u0208\u0209\7q\2\2\u0209\u020a"+
"\7p\2\2\u020e\u020f\7q\2\2\u020f\u0210\7v\2\2\u0210~\3\2\2\2\u0211\u0212"+ "\7t\2\2\u020az\3\2\2\2\u020b\u020c\7z\2\2\u020c\u020d\7q\2\2\u020d\u020e"+
"\7*\2\2\u0212\u0080\3\2\2\2\u0213\u0214\7+\2\2\u0214\u0082\3\2\2\2\u0215"+ "\7t\2\2\u020e|\3\2\2\2\u020f\u0210\7p\2\2\u0210\u0211\7q\2\2\u0211\u0212"+
"\u0216\7c\2\2\u0216\u0217\7u\2\2\u0217\u0084\3\2\2\2\u0218\u0219\7B\2"+ "\7v\2\2\u0212~\3\2\2\2\u0213\u0214\7*\2\2\u0214\u0080\3\2\2\2\u0215\u0216"+
"\2\u0219\u0086\3\2\2\2\u021a\u021b\7t\2\2\u021b\u021c\7g\2\2\u021c\u021d"+ "\7+\2\2\u0216\u0082\3\2\2\2\u0217\u0218\7c\2\2\u0218\u0219\7u\2\2\u0219"+
"\7v\2\2\u021d\u021e\7w\2\2\u021e\u021f\7t\2\2\u021f\u0220\7p\2\2\u0220"+ "\u0084\3\2\2\2\u021a\u021b\7B\2\2\u021b\u0086\3\2\2\2\u021c\u021d\7t\2"+
"\u0088\3\2\2\2\u0221\u0222\7d\2\2\u0222\u0223\7t\2\2\u0223\u0224\7g\2"+ "\2\u021d\u021e\7g\2\2\u021e\u021f\7v\2\2\u021f\u0220\7w\2\2\u0220\u0221"+
"\2\u0224\u0225\7c\2\2\u0225\u0226\7m\2\2\u0226\u008a\3\2\2\2\u0227\u0228"+ "\7t\2\2\u0221\u0222\7p\2\2\u0222\u0088\3\2\2\2\u0223\u0224\7d\2\2\u0224"+
"\7e\2\2\u0228\u0229\7q\2\2\u0229\u022a\7p\2\2\u022a\u022b\7v\2\2\u022b"+ "\u0225\7t\2\2\u0225\u0226\7g\2\2\u0226\u0227\7c\2\2\u0227\u0228\7m\2\2"+
"\u022c\7k\2\2\u022c\u022d\7p\2\2\u022d\u022e\7w\2\2\u022e\u022f\7g\2\2"+ "\u0228\u008a\3\2\2\2\u0229\u022a\7e\2\2\u022a\u022b\7q\2\2\u022b\u022c"+
"\u022f\u008c\3\2\2\2\u0230\u0231\7\60\2\2\u0231\u008e\3\2\2\2\u0232\u0233"+ "\7p\2\2\u022c\u022d\7v\2\2\u022d\u022e\7k\2\2\u022e\u022f\7p\2\2\u022f"+
"\7C\2\2\u0233\u0090\3\2\2\2\u0234\u0235\7Z\2\2\u0235\u0092\3\2\2\2\u0236"+ "\u0230\7w\2\2\u0230\u0231\7g\2\2\u0231\u008c\3\2\2\2\u0232\u0233\7\60"+
"\u0237\7[\2\2\u0237\u0094\3\2\2\2\u0238\u0239\7C\2\2\u0239\u023a\7Z\2"+ "\2\2\u0233\u008e\3\2\2\2\u0234\u0235\7C\2\2\u0235\u0090\3\2\2\2\u0236"+
"\2\u023a\u0096\3\2\2\2\u023b\u023c\7C\2\2\u023c\u023d\7[\2\2\u023d\u0098"+ "\u0237\7Z\2\2\u0237\u0092\3\2\2\2\u0238\u0239\7[\2\2\u0239\u0094\3\2\2"+
"\3\2\2\2\u023e\u023f\7Z\2\2\u023f\u0240\7[\2\2\u0240\u009a\3\2\2\2\u0241"+ "\2\u023a\u023b\7C\2\2\u023b\u023c\7Z\2\2\u023c\u0096\3\2\2\2\u023d\u023e"+
"\u0242\7R\2\2\u0242\u0243\7e\2\2\u0243\u009c\3\2\2\2\u0244\u0245\7R\2"+ "\7C\2\2\u023e\u023f\7[\2\2\u023f\u0098\3\2\2\2\u0240\u0241\7Z\2\2\u0241"+
"\2\u0245\u0246\7|\2\2\u0246\u009e\3\2\2\2\u0247\u0248\7R\2\2\u0248\u0249"+ "\u0242\7[\2\2\u0242\u009a\3\2\2\2\u0243\u0244\7R\2\2\u0244\u0245\7e\2"+
"\7p\2\2\u0249\u00a0\3\2\2\2\u024a\u024b\7R\2\2\u024b\u024c\7x\2\2\u024c"+ "\2\u0245\u009c\3\2\2\2\u0246\u0247\7R\2\2\u0247\u0248\7|\2\2\u0248\u009e"+
"\u00a2\3\2\2\2\u024d\u024e\7\60\2\2\u024e\u024f\7y\2\2\u024f\u00a4\3\2"+ "\3\2\2\2\u0249\u024a\7R\2\2\u024a\u024b\7p\2\2\u024b\u00a0\3\2\2\2\u024c"+
"\2\2\u0250\u0251\7v\2\2\u0251\u0252\7t\2\2\u0252\u0253\7w\2\2\u0253\u0254"+ "\u024d\7R\2\2\u024d\u024e\7x\2\2\u024e\u00a2\3\2\2\2\u024f\u0250\7\60"+
"\7g\2\2\u0254\u00a6\3\2\2\2\u0255\u0256\7h\2\2\u0256\u0257\7c\2\2\u0257"+ "\2\2\u0250\u0251\7y\2\2\u0251\u00a4\3\2\2\2\u0252\u0253\7v\2\2\u0253\u0254"+
"\u0258\7n\2\2\u0258\u0259\7u\2\2\u0259\u025a\7g\2\2\u025a\u00a8\3\2\2"+ "\7t\2\2\u0254\u0255\7w\2\2\u0255\u0256\7g\2\2\u0256\u00a6\3\2\2\2\u0257"+
"\2\u025b\u025c\7\'\2\2\u025c\u025d\7c\2\2\u025d\u025e\7u\2\2\u025e\u025f"+ "\u0258\7h\2\2\u0258\u0259\7c\2\2\u0259\u025a\7n\2\2\u025a\u025b\7u\2\2"+
"\7o\2\2\u025f\u00aa\3\2\2\2\u0260\u0261\7u\2\2\u0261\u0262\7w\2\2\u0262"+ "\u025b\u025c\7g\2\2\u025c\u00a8\3\2\2\2\u025d\u025e\7\'\2\2\u025e\u025f"+
"\u0263\7d\2\2\u0263\u00ac\3\2\2\2\u0264\u0265\7/\2\2\u0265\u0266\7@\2"+ "\7c\2\2\u025f\u0260\7u\2\2\u0260\u0261\7o\2\2\u0261\u00aa\3\2\2\2\u0262"+
"\2\u0266\u00ae\3\2\2\2\u0267\u0268\7}\2\2\u0268\u00b0\3\2\2\2\u0269\u026a"+ "\u0263\7u\2\2\u0263\u0264\7w\2\2\u0264\u0265\7d\2\2\u0265\u00ac\3\2\2"+
"\7\177\2\2\u026a\u00b2\3\2\2\2\u026b\u026c\7c\2\2\u026c\u026d\7u\2\2\u026d"+ "\2\u0266\u0267\7/\2\2\u0267\u0268\7@\2\2\u0268\u00ae\3\2\2\2\u0269\u026a"+
"\u026e\7o\2\2\u026e\u026f\7u\2\2\u026f\u0270\7w\2\2\u0270\u0271\7d\2\2"+ "\7}\2\2\u026a\u00b0\3\2\2\2\u026b\u026c\7\177\2\2\u026c\u00b2\3\2\2\2"+
"\u0271\u00b4\3\2\2\2\u0272\u0273\7e\2\2\u0273\u0274\7n\2\2\u0274\u0275"+ "\u026d\u026e\7c\2\2\u026e\u026f\7u\2\2\u026f\u0270\7o\2\2\u0270\u0271"+
"\7q\2\2\u0275\u0276\7d\2\2\u0276\u0277\7d\2\2\u0277\u0278\7g\2\2\u0278"+ "\7u\2\2\u0271\u0272\7w\2\2\u0272\u0273\7d\2\2\u0273\u00b4\3\2\2\2\u0274"+
"\u0279\7t\2\2\u0279\u027a\7u\2\2\u027a\u00b6\3\2\2\2\u027b\u027c\7k\2"+ "\u0275\7e\2\2\u0275\u0276\7n\2\2\u0276\u0277\7q\2\2\u0277\u0278\7d\2\2"+
"\2\u027c\u027d\7h\2\2\u027d\u00b8\3\2\2\2\u027e\u027f\7g\2\2\u027f\u0280"+ "\u0278\u0279\7d\2\2\u0279\u027a\7g\2\2\u027a\u027b\7t\2\2\u027b\u027c"+
"\7n\2\2\u0280\u0281\7u\2\2\u0281\u0282\7g\2\2\u0282\u00ba\3\2\2\2\u0283"+ "\7u\2\2\u027c\u00b6\3\2\2\2\u027d\u027e\7u\2\2\u027e\u027f\7v\2\2\u027f"+
"\u0284\7k\2\2\u0284\u0285\7h\2\2\u0285\u0286\7a\2\2\u0286\u0287\7e\2\2"+ "\u0280\7c\2\2\u0280\u0281\7e\2\2\u0281\u0282\7m\2\2\u0282\u00b8\3\2\2"+
"\u0287\u0288\7u\2\2\u0288\u00bc\3\2\2\2\u0289\u028a\7k\2\2\u028a\u028b"+ "\2\u0283\u0284\7k\2\2\u0284\u0285\7h\2\2\u0285\u00ba\3\2\2\2\u0286\u0287"+
"\7h\2\2\u028b\u028c\7a\2\2\u028c\u028d\7e\2\2\u028d\u028e\7e\2\2\u028e"+ "\7g\2\2\u0287\u0288\7n\2\2\u0288\u0289\7u\2\2\u0289\u028a\7g\2\2\u028a"+
"\u00be\3\2\2\2\u028f\u0290\7k\2\2\u0290\u0291\7h\2\2\u0291\u0292\7a\2"+ "\u00bc\3\2\2\2\u028b\u028c\7k\2\2\u028c\u028d\7h\2\2\u028d\u028e\7a\2"+
"\2\u0292\u0293\7g\2\2\u0293\u0294\7s\2\2\u0294\u00c0\3\2\2\2\u0295\u0296"+ "\2\u028e\u028f\7e\2\2\u028f\u0290\7u\2\2\u0290\u00be\3\2\2\2\u0291\u0292"+
"\7k\2\2\u0296\u0297\7h\2\2\u0297\u0298\7a\2\2\u0298\u0299\7|\2\2\u0299"+ "\7k\2\2\u0292\u0293\7h\2\2\u0293\u0294\7a\2\2\u0294\u0295\7e\2\2\u0295"+
"\u00c2\3\2\2\2\u029a\u029b\7k\2\2\u029b\u029c\7h\2\2\u029c\u029d\7a\2"+ "\u0296\7e\2\2\u0296\u00c0\3\2\2\2\u0297\u0298\7k\2\2\u0298\u0299\7h\2"+
"\2\u029d\u029e\7p\2\2\u029e\u029f\7g\2\2\u029f\u00c4\3\2\2\2\u02a0\u02a1"+ "\2\u0299\u029a\7a\2\2\u029a\u029b\7g\2\2\u029b\u029c\7s\2\2\u029c\u00c2"+
"\7k\2\2\u02a1\u02a2\7h\2\2\u02a2\u02a3\7a\2\2\u02a3\u02a4\7p\2\2\u02a4"+ "\3\2\2\2\u029d\u029e\7k\2\2\u029e\u029f\7h\2\2\u029f\u02a0\7a\2\2\u02a0"+
"\u02a5\7|\2\2\u02a5\u00c6\3\2\2\2\u02a6\u02a7\7k\2\2\u02a7\u02a8\7h\2"+ "\u02a1\7|\2\2\u02a1\u00c4\3\2\2\2\u02a2\u02a3\7k\2\2\u02a3\u02a4\7h\2"+
"\2\u02a8\u02a9\7a\2\2\u02a9\u02aa\7r\2\2\u02aa\u02ab\7n\2\2\u02ab\u00c8"+ "\2\u02a4\u02a5\7a\2\2\u02a5\u02a6\7p\2\2\u02a6\u02a7\7g\2\2\u02a7\u00c6"+
"\3\2\2\2\u02ac\u02ad\7k\2\2\u02ad\u02ae\7h\2\2\u02ae\u02af\7a\2\2\u02af"+ "\3\2\2\2\u02a8\u02a9\7k\2\2\u02a9\u02aa\7h\2\2\u02aa\u02ab\7a\2\2\u02ab"+
"\u02b0\7r\2\2\u02b0\u02b1\7q\2\2\u02b1\u02b2\7u\2\2\u02b2\u00ca\3\2\2"+ "\u02ac\7p\2\2\u02ac\u02ad\7|\2\2\u02ad\u00c8\3\2\2\2\u02ae\u02af\7k\2"+
"\2\u02b3\u02b4\7k\2\2\u02b4\u02b5\7h\2\2\u02b5\u02b6\7a\2\2\u02b6\u02b7"+ "\2\u02af\u02b0\7h\2\2\u02b0\u02b1\7a\2\2\u02b1\u02b2\7r\2\2\u02b2\u02b3"+
"\7o\2\2\u02b7\u02b8\7k\2\2\u02b8\u00cc\3\2\2\2\u02b9\u02ba\7k\2\2\u02ba"+ "\7n\2\2\u02b3\u00ca\3\2\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7h\2\2\u02b6"+
"\u02bb\7h\2\2\u02bb\u02bc\7a\2\2\u02bc\u02bd\7p\2\2\u02bd\u02be\7g\2\2"+ "\u02b7\7a\2\2\u02b7\u02b8\7r\2\2\u02b8\u02b9\7q\2\2\u02b9\u02ba\7u\2\2"+
"\u02be\u02bf\7i\2\2\u02bf\u00ce\3\2\2\2\u02c0\u02c1\7k\2\2\u02c1\u02c2"+ "\u02ba\u00cc\3\2\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7h\2\2\u02bd\u02be"+
"\7h\2\2\u02c2\u02c3\7a\2\2\u02c3\u02c4\7x\2\2\u02c4\u02c5\7u\2\2\u02c5"+ "\7a\2\2\u02be\u02bf\7o\2\2\u02bf\u02c0\7k\2\2\u02c0\u00ce\3\2\2\2\u02c1"+
"\u00d0\3\2\2\2\u02c6\u02c7\7k\2\2\u02c7\u02c8\7h\2\2\u02c8\u02c9\7a\2"+ "\u02c2\7k\2\2\u02c2\u02c3\7h\2\2\u02c3\u02c4\7a\2\2\u02c4\u02c5\7p\2\2"+
"\2\u02c9\u02ca\7x\2\2\u02ca\u02cb\7e\2\2\u02cb\u00d2\3\2\2\2\u02cc\u02cd"+ "\u02c5\u02c6\7g\2\2\u02c6\u02c7\7i\2\2\u02c7\u00d0\3\2\2\2\u02c8\u02c9"+
"\7h\2\2\u02cd\u02ce\7q\2\2\u02ce\u02cf\7t\2\2\u02cf\u00d4\3\2\2\2\u02d0"+ "\7k\2\2\u02c9\u02ca\7h\2\2\u02ca\u02cb\7a\2\2\u02cb\u02cc\7x\2\2\u02cc"+
"\u02d1\7k\2\2\u02d1\u02d2\7p\2\2\u02d2\u00d6\3\2\2\2\u02d3\u02d4\7y\2"+ "\u02cd\7u\2\2\u02cd\u00d2\3\2\2\2\u02ce\u02cf\7k\2\2\u02cf\u02d0\7h\2"+
"\2\u02d4\u02d5\7j\2\2\u02d5\u02d6\7k\2\2\u02d6\u02d7\7n\2\2\u02d7\u02d8"+ "\2\u02d0\u02d1\7a\2\2\u02d1\u02d2\7x\2\2\u02d2\u02d3\7e\2\2\u02d3\u00d4"+
"\7g\2\2\u02d8\u00d8\3\2\2\2\u02d9\u02da\7t\2\2\u02da\u02db\7g\2\2\u02db"+ "\3\2\2\2\u02d4\u02d5\7h\2\2\u02d5\u02d6\7q\2\2\u02d6\u02d7\7t\2\2\u02d7"+
"\u02dc\7r\2\2\u02dc\u02dd\7g\2\2\u02dd\u02de\7c\2\2\u02de\u02df\7v\2\2"+ "\u00d6\3\2\2\2\u02d8\u02d9\7k\2\2\u02d9\u02da\7p\2\2\u02da\u00d8\3\2\2"+
"\u02df\u00da\3\2\2\2\u02e0\u02e1\7w\2\2\u02e1\u02e2\7p\2\2\u02e2\u02e3"+ "\2\u02db\u02dc\7y\2\2\u02dc\u02dd\7j\2\2\u02dd\u02de\7k\2\2\u02de\u02df"+
"\7v\2\2\u02e3\u02e4\7k\2\2\u02e4\u02e5\7n\2\2\u02e5\u00dc\3\2\2\2\u02e6"+ "\7n\2\2\u02df\u02e0\7g\2\2\u02e0\u00da\3\2\2\2\u02e1\u02e2\7t\2\2\u02e2"+
"\u02ea\t\2\2\2\u02e7\u02e9\t\3\2\2\u02e8\u02e7\3\2\2\2\u02e9\u02ec\3\2"+ "\u02e3\7g\2\2\u02e3\u02e4\7r\2\2\u02e4\u02e5\7g\2\2\u02e5\u02e6\7c\2\2"+
"\2\2\u02ea\u02e8\3\2\2\2\u02ea\u02eb\3\2\2\2\u02eb\u02ed\3\2\2\2\u02ec"+ "\u02e6\u02e7\7v\2\2\u02e7\u00dc\3\2\2\2\u02e8\u02e9\7w\2\2\u02e9\u02ea"+
"\u02ea\3\2\2\2\u02ed\u02ee\5\u00dfp\2\u02ee\u02ef\3\2\2\2\u02ef\u02f0"+ "\7p\2\2\u02ea\u02eb\7v\2\2\u02eb\u02ec\7k\2\2\u02ec\u02ed\7n\2\2\u02ed"+
"\bo\2\2\u02f0\u00de\3\2\2\2\u02f1\u02f5\7=\2\2\u02f2\u02f4\n\2\2\2\u02f3"+ "\u00de\3\2\2\2\u02ee\u02f2\t\2\2\2\u02ef\u02f1\t\3\2\2\u02f0\u02ef\3\2"+
"\u02f2\3\2\2\2\u02f4\u02f7\3\2\2\2\u02f5\u02f3\3\2\2\2\u02f5\u02f6\3\2"+ "\2\2\u02f1\u02f4\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3"+
"\2\2\u02f6\u02f8\3\2\2\2\u02f7\u02f5\3\2\2\2\u02f8\u02f9\bp\2\2\u02f9"+ "\u02f5\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f5\u02f6\5\u00e1q\2\u02f6\u02f7"+
"\u00e0\3\2\2\2\u02fa\u02fb\t\3\2\2\u02fb\u02fc\3\2\2\2\u02fc\u02fd\bq"+ "\3\2\2\2\u02f7\u02f8\bp\2\2\u02f8\u00e0\3\2\2\2\u02f9\u02fd\7=\2\2\u02fa"+
"\3\2\u02fd\u00e2\3\2\2\2\u02fe\u0300\t\2\2\2\u02ff\u02fe\3\2\2\2\u0300"+ "\u02fc\n\2\2\2\u02fb\u02fa\3\2\2\2\u02fc\u02ff\3\2\2\2\u02fd\u02fb\3\2"+
"\u0301\3\2\2\2\u0301\u02ff\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u00e4\3\2"+ "\2\2\u02fd\u02fe\3\2\2\2\u02fe\u0300\3\2\2\2\u02ff\u02fd\3\2\2\2\u0300"+
"\2\2\u0303\u0307\t\4\2\2\u0304\u0306\t\5\2\2\u0305\u0304\3\2\2\2\u0306"+ "\u0301\bq\2\2\u0301\u00e2\3\2\2\2\u0302\u0303\t\3\2\2\u0303\u0304\3\2"+
"\u0309\3\2\2\2\u0307\u0305\3\2\2\2\u0307\u0308\3\2\2\2\u0308\u00e6\3\2"+ "\2\2\u0304\u0305\br\3\2\u0305\u00e4\3\2\2\2\u0306\u0308\t\2\2\2\u0307"+
"\2\2\u0309\u0307\3\2\2\2\u030a\u0312\4\62;\2\u030b\u030d\4\63;\2\u030c"+ "\u0306\3\2\2\2\u0308\u0309\3\2\2\2\u0309\u0307\3\2\2\2\u0309\u030a\3\2"+
"\u030e\4\62;\2\u030d\u030c\3\2\2\2\u030e\u030f\3\2\2\2\u030f\u030d\3\2"+ "\2\2\u030a\u00e6\3\2\2\2\u030b\u030f\t\4\2\2\u030c\u030e\t\5\2\2\u030d"+
"\2\2\u030f\u0310\3\2\2\2\u0310\u0312\3\2\2\2\u0311\u030a\3\2\2\2\u0311"+ "\u030c\3\2\2\2\u030e\u0311\3\2\2\2\u030f\u030d\3\2\2\2\u030f\u0310\3\2"+
"\u030b\3\2\2\2\u0312\u00e8\3\2\2\2\u0313\u0315\7&\2\2\u0314\u0316\t\6"+ "\2\2\u0310\u00e8\3\2\2\2\u0311\u030f\3\2\2\2\u0312\u031a\4\62;\2\u0313"+
"\2\2\u0315\u0314\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0315\3\2\2\2\u0317"+ "\u0315\4\63;\2\u0314\u0316\4\62;\2\u0315\u0314\3\2\2\2\u0316\u0317\3\2"+
"\u0318\3\2\2\2\u0318\u00ea\3\2\2\2\u0319\u031b\7\'\2\2\u031a\u031c\4\62"+ "\2\2\u0317\u0315\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u031a\3\2\2\2\u0319"+
"\63\2\u031b\u031a\3\2\2\2\u031c\u031d\3\2\2\2\u031d\u031b\3\2\2\2\u031d"+ "\u0312\3\2\2\2\u0319\u0313\3\2\2\2\u031a\u00ea\3\2\2\2\u031b\u031d\7&"+
"\u031e\3\2\2\2\u031e\u00ec\3\2\2\2\u031f\u0325\5\u00efx\2\u0320\u0322"+ "\2\2\u031c\u031e\t\6\2\2\u031d\u031c\3\2\2\2\u031e\u031f\3\2\2\2\u031f"+
"\t\7\2\2\u0321\u0323\t\b\2\2\u0322\u0321\3\2\2\2\u0322\u0323\3\2\2\2\u0323"+ "\u031d\3\2\2\2\u031f\u0320\3\2\2\2\u0320\u00ec\3\2\2\2\u0321\u0323\7\'"+
"\u0324\3\2\2\2\u0324\u0326\5\u00efx\2\u0325\u0320\3\2\2\2\u0325\u0326"+ "\2\2\u0322\u0324\4\62\63\2\u0323\u0322\3\2\2\2\u0324\u0325\3\2\2\2\u0325"+
"\3\2\2\2\u0326\u00ee\3\2\2\2\u0327\u0329\4\62;\2\u0328\u0327\3\2\2\2\u0329"+ "\u0323\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u00ee\3\2\2\2\u0327\u032d\5\u00f1"+
"\u032a\3\2\2\2\u032a\u0328\3\2\2\2\u032a\u032b\3\2\2\2\u032b\u0332\3\2"+ "y\2\u0328\u032a\t\7\2\2\u0329\u032b\t\b\2\2\u032a\u0329\3\2\2\2\u032a"+
"\2\2\u032c\u032e\7\60\2\2\u032d\u032f\4\62;\2\u032e\u032d\3\2\2\2\u032f"+ "\u032b\3\2\2\2\u032b\u032c\3\2\2\2\u032c\u032e\5\u00f1y\2\u032d\u0328"+
"\u0330\3\2\2\2\u0330\u032e\3\2\2\2\u0330\u0331\3\2\2\2\u0331\u0333\3\2"+ "\3\2\2\2\u032d\u032e\3\2\2\2\u032e\u00f0\3\2\2\2\u032f\u0331\4\62;\2\u0330"+
"\2\2\u0332\u032c\3\2\2\2\u0332\u0333\3\2\2\2\u0333\u00f0\3\2\2\2\u0334"+ "\u032f\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u0330\3\2\2\2\u0332\u0333\3\2"+
"\u0335\7^\2\2\u0335\u0339\13\2\2\2\u0336\u0337\7^\2\2\u0337\u0339\5\u00e3"+ "\2\2\u0333\u033a\3\2\2\2\u0334\u0336\7\60\2\2\u0335\u0337\4\62;\2\u0336"+
"r\2\u0338\u0334\3\2\2\2\u0338\u0336\3\2\2\2\u0339\u00f2\3\2\2\2\u033a"+ "\u0335\3\2\2\2\u0337\u0338\3\2\2\2\u0338\u0336\3\2\2\2\u0338\u0339\3\2"+
"\u033f\7$\2\2\u033b\u033e\5\u00f1y\2\u033c\u033e\n\t\2\2\u033d\u033b\3"+ "\2\2\u0339\u033b\3\2\2\2\u033a\u0334\3\2\2\2\u033a\u033b\3\2\2\2\u033b"+
"\2\2\2\u033d\u033c\3\2\2\2\u033e\u0341\3\2\2\2\u033f\u033d\3\2\2\2\u033f"+ "\u00f2\3\2\2\2\u033c\u033d\7^\2\2\u033d\u0341\13\2\2\2\u033e\u033f\7^"+
"\u0340\3\2\2\2\u0340\u0342\3\2\2\2\u0341\u033f\3\2\2\2\u0342\u0343\7$"+ "\2\2\u033f\u0341\5\u00e5s\2\u0340\u033c\3\2\2\2\u0340\u033e\3\2\2\2\u0341"+
"\2\2\u0343\u0344\bz\4\2\u0344\u00f4\3\2\2\2\u0345\u0346\7}\2\2\u0346\u0347"+ "\u00f4\3\2\2\2\u0342\u0347\7$\2\2\u0343\u0346\5\u00f3z\2\u0344\u0346\n"+
"\7}\2\2\u0347\u0349\3\2\2\2\u0348\u034a\13\2\2\2\u0349\u0348\3\2\2\2\u034a"+ "\t\2\2\u0345\u0343\3\2\2\2\u0345\u0344\3\2\2\2\u0346\u0349\3\2\2\2\u0347"+
"\u034b\3\2\2\2\u034b\u034c\3\2\2\2\u034b\u0349\3\2\2\2\u034c\u034d\3\2"+ "\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u034a\3\2\2\2\u0349\u0347\3\2"+
"\2\2\u034d\u034e\7\177\2\2\u034e\u034f\7\177\2\2\u034f\u0350\3\2\2\2\u0350"+ "\2\2\u034a\u034b\7$\2\2\u034b\u034c\b{\4\2\u034c\u00f6\3\2\2\2\u034d\u034e"+
"\u0351\b{\5\2\u0351\u00f6\3\2\2\2\u0352\u0355\7)\2\2\u0353\u0356\5\u00f1"+ "\7}\2\2\u034e\u034f\7}\2\2\u034f\u0351\3\2\2\2\u0350\u0352\13\2\2\2\u0351"+
"y\2\u0354\u0356\n\t\2\2\u0355\u0353\3\2\2\2\u0355\u0354\3\2\2\2\u0356"+ "\u0350\3\2\2\2\u0352\u0353\3\2\2\2\u0353\u0354\3\2\2\2\u0353\u0351\3\2"+
"\u0357\3\2\2\2\u0357\u0358\7)\2\2\u0358\u0359\b|\6\2\u0359\u00f8\3\2\2"+ "\2\2\u0354\u0355\3\2\2\2\u0355\u0356\7\177\2\2\u0356\u0357\7\177\2\2\u0357"+
"\2\26\2\u02ea\u02f5\u0301\u0307\u030f\u0311\u0315\u0317\u031d\u0322\u0325"+ "\u0358\3\2\2\2\u0358\u0359\b|\5\2\u0359\u00f8\3\2\2\2\u035a\u035d\7)\2"+
"\u032a\u0330\u0332\u0338\u033d\u033f\u034b\u0355\7\2\3\2\b\2\2\3z\2\3"+ "\2\u035b\u035e\5\u00f3z\2\u035c\u035e\n\t\2\2\u035d\u035b\3\2\2\2\u035d"+
"{\3\3|\4"; "\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0360\7)\2\2\u0360\u0361\b}\6"+
"\2\u0361\u00fa\3\2\2\2\26\2\u02f2\u02fd\u0309\u030f\u0317\u0319\u031d"+
"\u031f\u0325\u032a\u032d\u0332\u0338\u033a\u0340\u0345\u0347\u0353\u035d"+
"\7\2\3\2\b\2\2\3{\2\3|\3\3}\4";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@@ -32,9 +32,9 @@ public class prog8Parser extends Parser {
T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94, T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94,
T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101, T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101,
T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107, T__101=102, T__102=103, T__103=104, T__104=105, T__105=106, T__106=107,
T__107=108, T__108=109, LINECOMMENT=110, COMMENT=111, WS=112, EOL=113, T__107=108, T__108=109, T__109=110, LINECOMMENT=111, COMMENT=112, WS=113,
NAME=114, DEC_INTEGER=115, HEX_INTEGER=116, BIN_INTEGER=117, FLOAT_NUMBER=118, EOL=114, NAME=115, DEC_INTEGER=116, HEX_INTEGER=117, BIN_INTEGER=118,
STRING=119, INLINEASMBLOCK=120, SINGLECHAR=121; FLOAT_NUMBER=119, STRING=120, INLINEASMBLOCK=121, SINGLECHAR=122;
public static final int public static final int
RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3, RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3,
RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7, RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7,
@@ -86,10 +86,10 @@ public class prog8Parser extends Parser {
"'('", "')'", "'as'", "'@'", "'return'", "'break'", "'continue'", "'.'", "'('", "')'", "'as'", "'@'", "'return'", "'break'", "'continue'", "'.'",
"'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'",
"'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'sub'", "'->'", "'{'", "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'sub'", "'->'", "'{'",
"'}'", "'asmsub'", "'clobbers'", "'if'", "'else'", "'if_cs'", "'if_cc'", "'}'", "'asmsub'", "'clobbers'", "'stack'", "'if'", "'else'", "'if_cs'",
"'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'", "'if_mi'", "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'",
"'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'", "'repeat'", "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'",
"'until'" "'repeat'", "'until'"
}; };
} }
private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -104,7 +104,7 @@ public class prog8Parser extends Parser {
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,
null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK",
"SINGLECHAR" "SINGLECHAR"
}; };
@@ -327,7 +327,7 @@ public class prog8Parser extends Parser {
setState(140); setState(140);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (((((_la - 115)) & ~0x3f) == 0 && ((1L << (_la - 115)) & ((1L << (DEC_INTEGER - 115)) | (1L << (HEX_INTEGER - 115)) | (1L << (BIN_INTEGER - 115)))) != 0)) { if (((((_la - 116)) & ~0x3f) == 0 && ((1L << (_la - 116)) & ((1L << (DEC_INTEGER - 116)) | (1L << (HEX_INTEGER - 116)) | (1L << (BIN_INTEGER - 116)))) != 0)) {
{ {
setState(139); setState(139);
integerliteral(); integerliteral();
@@ -2296,7 +2296,7 @@ public class prog8Parser extends Parser {
setState(371); setState(371);
((IntegerliteralContext)_localctx).intpart = _input.LT(1); ((IntegerliteralContext)_localctx).intpart = _input.LT(1);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(((((_la - 115)) & ~0x3f) == 0 && ((1L << (_la - 115)) & ((1L << (DEC_INTEGER - 115)) | (1L << (HEX_INTEGER - 115)) | (1L << (BIN_INTEGER - 115)))) != 0)) ) { if ( !(((((_la - 116)) & ~0x3f) == 0 && ((1L << (_la - 116)) & ((1L << (DEC_INTEGER - 116)) | (1L << (HEX_INTEGER - 116)) | (1L << (BIN_INTEGER - 116)))) != 0)) ) {
((IntegerliteralContext)_localctx).intpart = (Token)_errHandler.recoverInline(this); ((IntegerliteralContext)_localctx).intpart = (Token)_errHandler.recoverInline(this);
} }
else { else {
@@ -2829,7 +2829,7 @@ public class prog8Parser extends Parser {
setState(438); setState(438);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__67 - 66)) | (1L << (T__68 - 66)) | (1L << (T__70 - 66)) | (1L << (T__71 - 66)) | (1L << (T__72 - 66)) | (1L << (T__83 - 66)) | (1L << (T__84 - 66)) | (1L << (T__88 - 66)) | (1L << (T__90 - 66)) | (1L << (T__92 - 66)) | (1L << (T__93 - 66)) | (1L << (T__94 - 66)) | (1L << (T__95 - 66)) | (1L << (T__96 - 66)) | (1L << (T__97 - 66)) | (1L << (T__98 - 66)) | (1L << (T__99 - 66)) | (1L << (T__100 - 66)) | (1L << (T__101 - 66)) | (1L << (T__102 - 66)) | (1L << (T__103 - 66)) | (1L << (T__104 - 66)) | (1L << (T__106 - 66)) | (1L << (T__107 - 66)) | (1L << (EOL - 66)) | (1L << (NAME - 66)))) != 0)) { while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__67 - 66)) | (1L << (T__68 - 66)) | (1L << (T__70 - 66)) | (1L << (T__71 - 66)) | (1L << (T__72 - 66)) | (1L << (T__83 - 66)) | (1L << (T__84 - 66)) | (1L << (T__88 - 66)) | (1L << (T__91 - 66)) | (1L << (T__93 - 66)) | (1L << (T__94 - 66)) | (1L << (T__95 - 66)) | (1L << (T__96 - 66)) | (1L << (T__97 - 66)) | (1L << (T__98 - 66)) | (1L << (T__99 - 66)) | (1L << (T__100 - 66)) | (1L << (T__101 - 66)) | (1L << (T__102 - 66)) | (1L << (T__103 - 66)) | (1L << (T__104 - 66)) | (1L << (T__105 - 66)) | (1L << (T__107 - 66)) | (1L << (T__108 - 66)) | (1L << (EOL - 66)) | (1L << (NAME - 66)))) != 0)) {
{ {
setState(436); setState(436);
_errHandler.sync(this); _errHandler.sync(this);
@@ -2866,8 +2866,7 @@ public class prog8Parser extends Parser {
case T__83: case T__83:
case T__84: case T__84:
case T__88: case T__88:
case T__90: case T__91:
case T__92:
case T__93: case T__93:
case T__94: case T__94:
case T__95: case T__95:
@@ -2880,8 +2879,9 @@ public class prog8Parser extends Parser {
case T__102: case T__102:
case T__103: case T__103:
case T__104: case T__104:
case T__106: case T__105:
case T__107: case T__107:
case T__108:
case NAME: case NAME:
{ {
setState(434); setState(434);
@@ -3262,6 +3262,7 @@ public class prog8Parser extends Parser {
} }
public static class Asmsub_paramContext extends ParserRuleContext { public static class Asmsub_paramContext extends ParserRuleContext {
public Token stack;
public VardeclContext vardecl() { public VardeclContext vardecl() {
return getRuleContext(VardeclContext.class,0); return getRuleContext(VardeclContext.class,0);
} }
@@ -3287,7 +3288,7 @@ public class prog8Parser extends Parser {
vardecl(); vardecl();
setState(504); setState(504);
match(T__65); match(T__65);
setState(507); setState(508);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__70: case T__70:
@@ -3310,6 +3311,12 @@ public class prog8Parser extends Parser {
statusregister(); statusregister();
} }
break; break;
case T__90:
{
setState(507);
((Asmsub_paramContext)_localctx).stack = match(T__90);
}
break;
default: default:
throw new NoViableAltException(this); throw new NoViableAltException(this);
} }
@@ -3346,21 +3353,21 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(509); setState(510);
register(); register();
setState(514); setState(515);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
while (_la==T__13) { while (_la==T__13) {
{ {
{ {
setState(510);
match(T__13);
setState(511); setState(511);
match(T__13);
setState(512);
register(); register();
} }
} }
setState(516); setState(517);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
} }
@@ -3401,31 +3408,31 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(517); setState(518);
asmsub_return(); asmsub_return();
setState(525); setState(526);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
while (_la==T__13) { while (_la==T__13) {
{ {
{ {
setState(518); setState(519);
match(T__13); match(T__13);
setState(520); setState(521);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==EOL) { if (_la==EOL) {
{ {
setState(519); setState(520);
match(EOL); match(EOL);
} }
} }
setState(522); setState(523);
asmsub_return(); asmsub_return();
} }
} }
setState(527); setState(528);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
} }
@@ -3443,6 +3450,7 @@ public class prog8Parser extends Parser {
} }
public static class Asmsub_returnContext extends ParserRuleContext { public static class Asmsub_returnContext extends ParserRuleContext {
public Token stack;
public DatatypeContext datatype() { public DatatypeContext datatype() {
return getRuleContext(DatatypeContext.class,0); return getRuleContext(DatatypeContext.class,0);
} }
@@ -3464,11 +3472,11 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(528);
datatype();
setState(529); setState(529);
datatype();
setState(530);
match(T__65); match(T__65);
setState(532); setState(534);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__70: case T__70:
@@ -3478,7 +3486,7 @@ public class prog8Parser extends Parser {
case T__74: case T__74:
case T__75: case T__75:
{ {
setState(530); setState(531);
registerorpair(); registerorpair();
} }
break; break;
@@ -3487,10 +3495,16 @@ public class prog8Parser extends Parser {
case T__78: case T__78:
case T__79: case T__79:
{ {
setState(531); setState(532);
statusregister(); statusregister();
} }
break; break;
case T__90:
{
setState(533);
((Asmsub_returnContext)_localctx).stack = match(T__90);
}
break;
default: default:
throw new NoViableAltException(this); throw new NoViableAltException(this);
} }
@@ -3537,21 +3551,21 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(534); setState(536);
match(T__90); match(T__91);
setState(535);
expression(0);
setState(537); setState(537);
expression(0);
setState(539);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==EOL) { if (_la==EOL) {
{ {
setState(536); setState(538);
match(EOL); match(EOL);
} }
} }
setState(541); setState(543);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__2: case T__2:
@@ -3586,8 +3600,7 @@ public class prog8Parser extends Parser {
case T__83: case T__83:
case T__84: case T__84:
case T__88: case T__88:
case T__90: case T__91:
case T__92:
case T__93: case T__93:
case T__94: case T__94:
case T__95: case T__95:
@@ -3600,39 +3613,40 @@ public class prog8Parser extends Parser {
case T__102: case T__102:
case T__103: case T__103:
case T__104: case T__104:
case T__106: case T__105:
case T__107: case T__107:
case T__108:
case NAME: case NAME:
{ {
setState(539); setState(541);
statement(); statement();
} }
break; break;
case T__86: case T__86:
{ {
setState(540); setState(542);
statement_block(); statement_block();
} }
break; break;
default: default:
throw new NoViableAltException(this); throw new NoViableAltException(this);
} }
setState(544); setState(546);
_errHandler.sync(this); _errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) {
case 1: case 1:
{ {
setState(543); setState(545);
match(EOL); match(EOL);
} }
break; break;
} }
setState(547); setState(549);
_errHandler.sync(this); _errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
case 1: case 1:
{ {
setState(546); setState(548);
else_part(); else_part();
} }
break; break;
@@ -3671,19 +3685,19 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(549);
match(T__91);
setState(551); setState(551);
match(T__92);
setState(553);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==EOL) { if (_la==EOL) {
{ {
setState(550); setState(552);
match(EOL); match(EOL);
} }
} }
setState(555); setState(557);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__2: case T__2:
@@ -3718,8 +3732,7 @@ public class prog8Parser extends Parser {
case T__83: case T__83:
case T__84: case T__84:
case T__88: case T__88:
case T__90: case T__91:
case T__92:
case T__93: case T__93:
case T__94: case T__94:
case T__95: case T__95:
@@ -3732,17 +3745,18 @@ public class prog8Parser extends Parser {
case T__102: case T__102:
case T__103: case T__103:
case T__104: case T__104:
case T__106: case T__105:
case T__107: case T__107:
case T__108:
case NAME: case NAME:
{ {
setState(553); setState(555);
statement(); statement();
} }
break; break;
case T__86: case T__86:
{ {
setState(554); setState(556);
statement_block(); statement_block();
} }
break; break;
@@ -3792,19 +3806,19 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(557);
branchcondition();
setState(559); setState(559);
branchcondition();
setState(561);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==EOL) { if (_la==EOL) {
{ {
setState(558); setState(560);
match(EOL); match(EOL);
} }
} }
setState(563); setState(565);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__2: case T__2:
@@ -3839,8 +3853,7 @@ public class prog8Parser extends Parser {
case T__83: case T__83:
case T__84: case T__84:
case T__88: case T__88:
case T__90: case T__91:
case T__92:
case T__93: case T__93:
case T__94: case T__94:
case T__95: case T__95:
@@ -3853,44 +3866,45 @@ public class prog8Parser extends Parser {
case T__102: case T__102:
case T__103: case T__103:
case T__104: case T__104:
case T__106: case T__105:
case T__107: case T__107:
case T__108:
case NAME: case NAME:
{ {
setState(561); setState(563);
statement(); statement();
} }
break; break;
case T__86: case T__86:
{ {
setState(562); setState(564);
statement_block(); statement_block();
} }
break; break;
default: default:
throw new NoViableAltException(this); throw new NoViableAltException(this);
} }
setState(566); setState(568);
_errHandler.sync(this); _errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) {
case 1: case 1:
{ {
setState(565); setState(567);
match(EOL); match(EOL);
} }
break; break;
} }
setState(569); setState(571);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==T__91) { if (_la==T__92) {
{ {
setState(568); setState(570);
else_part(); else_part();
} }
} }
setState(571); setState(573);
match(EOL); match(EOL);
} }
} }
@@ -3919,9 +3933,9 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(573); setState(575);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(((((_la - 93)) & ~0x3f) == 0 && ((1L << (_la - 93)) & ((1L << (T__92 - 93)) | (1L << (T__93 - 93)) | (1L << (T__94 - 93)) | (1L << (T__95 - 93)) | (1L << (T__96 - 93)) | (1L << (T__97 - 93)) | (1L << (T__98 - 93)) | (1L << (T__99 - 93)) | (1L << (T__100 - 93)) | (1L << (T__101 - 93)) | (1L << (T__102 - 93)) | (1L << (T__103 - 93)))) != 0)) ) { if ( !(((((_la - 94)) & ~0x3f) == 0 && ((1L << (_la - 94)) & ((1L << (T__93 - 94)) | (1L << (T__94 - 94)) | (1L << (T__95 - 94)) | (1L << (T__96 - 94)) | (1L << (T__97 - 94)) | (1L << (T__98 - 94)) | (1L << (T__99 - 94)) | (1L << (T__100 - 94)) | (1L << (T__101 - 94)) | (1L << (T__102 - 94)) | (1L << (T__103 - 94)) | (1L << (T__104 - 94)))) != 0)) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
} }
else { else {
@@ -3972,53 +3986,53 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(575);
match(T__104);
setState(577); setState(577);
match(T__105);
setState(579);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0)) { if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25))) != 0)) {
{ {
setState(576); setState(578);
datatype(); datatype();
} }
} }
setState(581); setState(583);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__70: case T__70:
case T__71: case T__71:
case T__72: case T__72:
{ {
setState(579); setState(581);
register(); register();
} }
break; break;
case NAME: case NAME:
{ {
setState(580); setState(582);
identifier(); identifier();
} }
break; break;
default: default:
throw new NoViableAltException(this); throw new NoViableAltException(this);
} }
setState(583); setState(585);
match(T__105); match(T__106);
setState(584);
expression(0);
setState(586); setState(586);
expression(0);
setState(588);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==EOL) { if (_la==EOL) {
{ {
setState(585); setState(587);
match(EOL); match(EOL);
} }
} }
setState(588); setState(590);
statement_block(); statement_block();
} }
} }
@@ -4057,21 +4071,21 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(590); setState(592);
match(T__106); match(T__107);
setState(591);
expression(0);
setState(593); setState(593);
expression(0);
setState(595);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==EOL) { if (_la==EOL) {
{ {
setState(592); setState(594);
match(EOL); match(EOL);
} }
} }
setState(597); setState(599);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__2: case T__2:
@@ -4106,8 +4120,7 @@ public class prog8Parser extends Parser {
case T__83: case T__83:
case T__84: case T__84:
case T__88: case T__88:
case T__90: case T__91:
case T__92:
case T__93: case T__93:
case T__94: case T__94:
case T__95: case T__95:
@@ -4120,17 +4133,18 @@ public class prog8Parser extends Parser {
case T__102: case T__102:
case T__103: case T__103:
case T__104: case T__104:
case T__106: case T__105:
case T__107: case T__107:
case T__108:
case NAME: case NAME:
{ {
setState(595); setState(597);
statement(); statement();
} }
break; break;
case T__86: case T__86:
{ {
setState(596); setState(598);
statement_block(); statement_block();
} }
break; break;
@@ -4174,9 +4188,9 @@ public class prog8Parser extends Parser {
try { try {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(599); setState(601);
match(T__107); match(T__108);
setState(602); setState(604);
_errHandler.sync(this); _errHandler.sync(this);
switch (_input.LA(1)) { switch (_input.LA(1)) {
case T__2: case T__2:
@@ -4211,8 +4225,7 @@ public class prog8Parser extends Parser {
case T__83: case T__83:
case T__84: case T__84:
case T__88: case T__88:
case T__90: case T__91:
case T__92:
case T__93: case T__93:
case T__94: case T__94:
case T__95: case T__95:
@@ -4225,36 +4238,37 @@ public class prog8Parser extends Parser {
case T__102: case T__102:
case T__103: case T__103:
case T__104: case T__104:
case T__106: case T__105:
case T__107: case T__107:
case T__108:
case NAME: case NAME:
{ {
setState(600); setState(602);
statement(); statement();
} }
break; break;
case T__86: case T__86:
{ {
setState(601); setState(603);
statement_block(); statement_block();
} }
break; break;
default: default:
throw new NoViableAltException(this); throw new NoViableAltException(this);
} }
setState(605); setState(607);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _la = _input.LA(1);
if (_la==EOL) { if (_la==EOL) {
{ {
setState(604); setState(606);
match(EOL); match(EOL);
} }
} }
setState(607); setState(609);
match(T__108); match(T__109);
setState(608); setState(610);
expression(0); expression(0);
} }
} }
@@ -4309,7 +4323,7 @@ public class prog8Parser extends Parser {
} }
public static final String _serializedATN = public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3{\u0265\4\2\t\2\4"+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3|\u0267\4\2\t\2\4"+
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@@ -4345,38 +4359,38 @@ public class prog8Parser extends Parser {
"\16\61\u01d2\13\61\3\62\3\62\3\62\3\62\5\62\u01d8\n\62\3\62\3\62\3\62"+ "\16\61\u01d2\13\61\3\62\3\62\3\62\3\62\5\62\u01d8\n\62\3\62\3\62\3\62"+
"\3\62\3\62\5\62\u01df\n\62\3\62\3\62\3\62\3\62\5\62\u01e5\n\62\3\62\3"+ "\3\62\3\62\5\62\u01df\n\62\3\62\3\62\3\62\3\62\5\62\u01e5\n\62\3\62\3"+
"\62\3\62\5\62\u01ea\n\62\3\63\3\63\3\63\3\64\3\64\3\64\5\64\u01f2\n\64"+ "\62\3\62\5\62\u01ea\n\62\3\63\3\63\3\63\3\64\3\64\3\64\5\64\u01f2\n\64"+
"\3\64\7\64\u01f5\n\64\f\64\16\64\u01f8\13\64\3\65\3\65\3\65\3\65\5\65"+ "\3\64\7\64\u01f5\n\64\f\64\16\64\u01f8\13\64\3\65\3\65\3\65\3\65\3\65"+
"\u01fe\n\65\3\66\3\66\3\66\7\66\u0203\n\66\f\66\16\66\u0206\13\66\3\67"+ "\5\65\u01ff\n\65\3\66\3\66\3\66\7\66\u0204\n\66\f\66\16\66\u0207\13\66"+
"\3\67\3\67\5\67\u020b\n\67\3\67\7\67\u020e\n\67\f\67\16\67\u0211\13\67"+ "\3\67\3\67\3\67\5\67\u020c\n\67\3\67\7\67\u020f\n\67\f\67\16\67\u0212"+
"\38\38\38\38\58\u0217\n8\39\39\39\59\u021c\n9\39\39\59\u0220\n9\39\59"+ "\13\67\38\38\38\38\38\58\u0219\n8\39\39\39\59\u021e\n9\39\39\59\u0222"+
"\u0223\n9\39\59\u0226\n9\3:\3:\5:\u022a\n:\3:\3:\5:\u022e\n:\3;\3;\5;"+ "\n9\39\59\u0225\n9\39\59\u0228\n9\3:\3:\5:\u022c\n:\3:\3:\5:\u0230\n:"+
"\u0232\n;\3;\3;\5;\u0236\n;\3;\5;\u0239\n;\3;\5;\u023c\n;\3;\3;\3<\3<"+ "\3;\3;\5;\u0234\n;\3;\3;\5;\u0238\n;\3;\5;\u023b\n;\3;\5;\u023e\n;\3;"+
"\3=\3=\5=\u0244\n=\3=\3=\5=\u0248\n=\3=\3=\3=\5=\u024d\n=\3=\3=\3>\3>"+ "\3;\3<\3<\3=\3=\5=\u0246\n=\3=\3=\5=\u024a\n=\3=\3=\3=\5=\u024f\n=\3="+
"\3>\5>\u0254\n>\3>\3>\5>\u0258\n>\3?\3?\3?\5?\u025d\n?\3?\5?\u0260\n?"+ "\3=\3>\3>\3>\5>\u0256\n>\3>\3>\5>\u025a\n>\3?\3?\3?\5?\u025f\n?\3?\5?"+
"\3?\3?\3?\3?\2\3(@\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60"+ "\u0262\n?\3?\3?\3?\3?\2\3(@\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+
"\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|\2\21\3\2\6\17\3\2\24\34"+ "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|\2\21\3\2\6\17\3"+
"\3\2\37(\3\2)*\4\2\3\3+,\3\2.\61\3\2+,\3\2\62\65\3\2\66\67\3\2IK\3\2I"+ "\2\24\34\3\2\37(\3\2)*\4\2\3\3+,\3\2.\61\3\2+,\3\2\62\65\3\2\66\67\3\2"+
"N\3\2OR\3\2uw\3\2TU\3\2_j\2\u0295\2\u0082\3\2\2\2\4\u0089\3\2\2\2\6\u008b"+ "IK\3\2IN\3\2OR\3\2vx\3\2TU\3\2`k\2\u0299\2\u0082\3\2\2\2\4\u0089\3\2\2"+
"\3\2\2\2\b\u00a9\3\2\2\2\n\u00ab\3\2\2\2\f\u00ae\3\2\2\2\16\u00b3\3\2"+ "\2\6\u008b\3\2\2\2\b\u00a9\3\2\2\2\n\u00ab\3\2\2\2\f\u00ae\3\2\2\2\16"+
"\2\2\20\u00c4\3\2\2\2\22\u00c6\3\2\2\2\24\u00cc\3\2\2\2\26\u00d4\3\2\2"+ "\u00b3\3\2\2\2\20\u00c4\3\2\2\2\22\u00c6\3\2\2\2\24\u00cc\3\2\2\2\26\u00d4"+
"\2\30\u00d7\3\2\2\2\32\u00da\3\2\2\2\34\u00dc\3\2\2\2\36\u00e0\3\2\2\2"+ "\3\2\2\2\30\u00d7\3\2\2\2\32\u00da\3\2\2\2\34\u00dc\3\2\2\2\36\u00e0\3"+
" \u00e4\3\2\2\2\"\u00ec\3\2\2\2$\u00f4\3\2\2\2&\u00f6\3\2\2\2(\u0108\3"+ "\2\2\2 \u00e4\3\2\2\2\"\u00ec\3\2\2\2$\u00f4\3\2\2\2&\u00f6\3\2\2\2(\u0108"+
"\2\2\2*\u0139\3\2\2\2,\u013c\3\2\2\2.\u013f\3\2\2\2\60\u0144\3\2\2\2\62"+ "\3\2\2\2*\u0139\3\2\2\2,\u013c\3\2\2\2.\u013f\3\2\2\2\60\u0144\3\2\2\2"+
"\u014b\3\2\2\2\64\u0152\3\2\2\2\66\u015d\3\2\2\28\u0161\3\2\2\2:\u0163"+ "\62\u014b\3\2\2\2\64\u0152\3\2\2\2\66\u015d\3\2\2\28\u0161\3\2\2\2:\u0163"+
"\3\2\2\2<\u0165\3\2\2\2>\u0167\3\2\2\2@\u016f\3\2\2\2B\u0171\3\2\2\2D"+ "\3\2\2\2<\u0165\3\2\2\2>\u0167\3\2\2\2@\u016f\3\2\2\2B\u0171\3\2\2\2D"+
"\u0173\3\2\2\2F\u0175\3\2\2\2H\u0179\3\2\2\2J\u017b\3\2\2\2L\u017d\3\2"+ "\u0173\3\2\2\2F\u0175\3\2\2\2H\u0179\3\2\2\2J\u017b\3\2\2\2L\u017d\3\2"+
"\2\2N\u0191\3\2\2\2P\u0193\3\2\2\2R\u0195\3\2\2\2T\u019d\3\2\2\2V\u019f"+ "\2\2N\u0191\3\2\2\2P\u0193\3\2\2\2R\u0195\3\2\2\2T\u019d\3\2\2\2V\u019f"+
"\3\2\2\2X\u01a2\3\2\2\2Z\u01af\3\2\2\2\\\u01b2\3\2\2\2^\u01bd\3\2\2\2"+ "\3\2\2\2X\u01a2\3\2\2\2Z\u01af\3\2\2\2\\\u01b2\3\2\2\2^\u01bd\3\2\2\2"+
"`\u01c8\3\2\2\2b\u01d3\3\2\2\2d\u01eb\3\2\2\2f\u01ee\3\2\2\2h\u01f9\3"+ "`\u01c8\3\2\2\2b\u01d3\3\2\2\2d\u01eb\3\2\2\2f\u01ee\3\2\2\2h\u01f9\3"+
"\2\2\2j\u01ff\3\2\2\2l\u0207\3\2\2\2n\u0212\3\2\2\2p\u0218\3\2\2\2r\u0227"+ "\2\2\2j\u0200\3\2\2\2l\u0208\3\2\2\2n\u0213\3\2\2\2p\u021a\3\2\2\2r\u0229"+
"\3\2\2\2t\u022f\3\2\2\2v\u023f\3\2\2\2x\u0241\3\2\2\2z\u0250\3\2\2\2|"+ "\3\2\2\2t\u0231\3\2\2\2v\u0241\3\2\2\2x\u0243\3\2\2\2z\u0252\3\2\2\2|"+
"\u0259\3\2\2\2~\u0081\5\4\3\2\177\u0081\7s\2\2\u0080~\3\2\2\2\u0080\177"+ "\u025b\3\2\2\2~\u0081\5\4\3\2\177\u0081\7t\2\2\u0080~\3\2\2\2\u0080\177"+
"\3\2\2\2\u0081\u0084\3\2\2\2\u0082\u0080\3\2\2\2\u0082\u0083\3\2\2\2\u0083"+ "\3\2\2\2\u0081\u0084\3\2\2\2\u0082\u0080\3\2\2\2\u0082\u0083\3\2\2\2\u0083"+
"\u0085\3\2\2\2\u0084\u0082\3\2\2\2\u0085\u0086\7\2\2\3\u0086\3\3\2\2\2"+ "\u0085\3\2\2\2\u0084\u0082\3\2\2\2\u0085\u0086\7\2\2\3\u0086\3\3\2\2\2"+
"\u0087\u008a\5\16\b\2\u0088\u008a\5\6\4\2\u0089\u0087\3\2\2\2\u0089\u0088"+ "\u0087\u008a\5\16\b\2\u0088\u008a\5\6\4\2\u0089\u0087\3\2\2\2\u0089\u0088"+
"\3\2\2\2\u008a\5\3\2\2\2\u008b\u008c\7\3\2\2\u008c\u008e\5<\37\2\u008d"+ "\3\2\2\2\u008a\5\3\2\2\2\u008b\u008c\7\3\2\2\u008c\u008e\5<\37\2\u008d"+
"\u008f\5F$\2\u008e\u008d\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0090\3\2\2"+ "\u008f\5F$\2\u008e\u008d\3\2\2\2\u008e\u008f\3\2\2\2\u008f\u0090\3\2\2"+
"\2\u0090\u0091\5\\/\2\u0091\u0092\7s\2\2\u0092\7\3\2\2\2\u0093\u00aa\5"+ "\2\u0090\u0091\5\\/\2\u0091\u0092\7t\2\2\u0092\7\3\2\2\2\u0093\u00aa\5"+
"\16\b\2\u0094\u00aa\5\24\13\2\u0095\u00aa\5\22\n\2\u0096\u00aa\5\26\f"+ "\16\b\2\u0094\u00aa\5\24\13\2\u0095\u00aa\5\22\n\2\u0096\u00aa\5\26\f"+
"\2\u0097\u00aa\5\30\r\2\u0098\u00aa\5\36\20\2\u0099\u00aa\5\"\22\2\u009a"+ "\2\u0097\u00aa\5\30\r\2\u0098\u00aa\5\36\20\2\u0099\u00aa\5\"\22\2\u009a"+
"\u00aa\5\f\7\2\u009b\u00aa\5&\24\2\u009c\u00aa\5\62\32\2\u009d\u00aa\5"+ "\u00aa\5\f\7\2\u009b\u00aa\5&\24\2\u009c\u00aa\5\62\32\2\u009d\u00aa\5"+
@@ -4446,44 +4460,44 @@ public class prog8Parser extends Parser {
"\u0149\u014a\7B\2\2\u014a\61\3\2\2\2\u014b\u014c\5> \2\u014c\u014e\7A"+ "\u0149\u014a\7B\2\2\u014a\61\3\2\2\2\u014b\u014c\5> \2\u014c\u014e\7A"+
"\2\2\u014d\u014f\5\64\33\2\u014e\u014d\3\2\2\2\u014e\u014f\3\2\2\2\u014f"+ "\2\2\u014d\u014f\5\64\33\2\u014e\u014d\3\2\2\2\u014e\u014f\3\2\2\2\u014f"+
"\u0150\3\2\2\2\u0150\u0151\7B\2\2\u0151\63\3\2\2\2\u0152\u015a\5(\25\2"+ "\u0150\3\2\2\2\u0150\u0151\7B\2\2\u0151\63\3\2\2\2\u0152\u015a\5(\25\2"+
"\u0153\u0155\7\20\2\2\u0154\u0156\7s\2\2\u0155\u0154\3\2\2\2\u0155\u0156"+ "\u0153\u0155\7\20\2\2\u0154\u0156\7t\2\2\u0155\u0154\3\2\2\2\u0155\u0156"+
"\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0159\5(\25\2\u0158\u0153\3\2\2\2\u0159"+ "\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0159\5(\25\2\u0158\u0153\3\2\2\2\u0159"+
"\u015c\3\2\2\2\u015a\u0158\3\2\2\2\u015a\u015b\3\2\2\2\u015b\65\3\2\2"+ "\u015c\3\2\2\2\u015a\u0158\3\2\2\2\u015a\u015b\3\2\2\2\u015b\65\3\2\2"+
"\2\u015c\u015a\3\2\2\2\u015d\u015f\7E\2\2\u015e\u0160\5\64\33\2\u015f"+ "\2\u015c\u015a\3\2\2\2\u015d\u015f\7E\2\2\u015e\u0160\5\64\33\2\u015f"+
"\u015e\3\2\2\2\u015f\u0160\3\2\2\2\u0160\67\3\2\2\2\u0161\u0162\7F\2\2"+ "\u015e\3\2\2\2\u015f\u0160\3\2\2\2\u0160\67\3\2\2\2\u0161\u0162\7F\2\2"+
"\u01629\3\2\2\2\u0163\u0164\7G\2\2\u0164;\3\2\2\2\u0165\u0166\7t\2\2\u0166"+ "\u01629\3\2\2\2\u0163\u0164\7G\2\2\u0164;\3\2\2\2\u0165\u0166\7u\2\2\u0166"+
"=\3\2\2\2\u0167\u016c\7t\2\2\u0168\u0169\7H\2\2\u0169\u016b\7t\2\2\u016a"+ "=\3\2\2\2\u0167\u016c\7u\2\2\u0168\u0169\7H\2\2\u0169\u016b\7u\2\2\u016a"+
"\u0168\3\2\2\2\u016b\u016e\3\2\2\2\u016c\u016a\3\2\2\2\u016c\u016d\3\2"+ "\u0168\3\2\2\2\u016b\u016e\3\2\2\2\u016c\u016a\3\2\2\2\u016c\u016d\3\2"+
"\2\2\u016d?\3\2\2\2\u016e\u016c\3\2\2\2\u016f\u0170\t\13\2\2\u0170A\3"+ "\2\2\u016d?\3\2\2\2\u016e\u016c\3\2\2\2\u016f\u0170\t\13\2\2\u0170A\3"+
"\2\2\2\u0171\u0172\t\f\2\2\u0172C\3\2\2\2\u0173\u0174\t\r\2\2\u0174E\3"+ "\2\2\2\u0171\u0172\t\f\2\2\u0172C\3\2\2\2\u0173\u0174\t\r\2\2\u0174E\3"+
"\2\2\2\u0175\u0177\t\16\2\2\u0176\u0178\5H%\2\u0177\u0176\3\2\2\2\u0177"+ "\2\2\2\u0175\u0177\t\16\2\2\u0176\u0178\5H%\2\u0177\u0176\3\2\2\2\u0177"+
"\u0178\3\2\2\2\u0178G\3\2\2\2\u0179\u017a\7S\2\2\u017aI\3\2\2\2\u017b"+ "\u0178\3\2\2\2\u0178G\3\2\2\2\u0179\u017a\7S\2\2\u017aI\3\2\2\2\u017b"+
"\u017c\t\17\2\2\u017cK\3\2\2\2\u017d\u017f\7\35\2\2\u017e\u0180\7s\2\2"+ "\u017c\t\17\2\2\u017cK\3\2\2\2\u017d\u017f\7\35\2\2\u017e\u0180\7t\2\2"+
"\u017f\u017e\3\2\2\2\u017f\u0180\3\2\2\2\u0180\u0181\3\2\2\2\u0181\u0189"+ "\u017f\u017e\3\2\2\2\u017f\u0180\3\2\2\2\u0180\u0181\3\2\2\2\u0181\u0189"+
"\5(\25\2\u0182\u0184\7\20\2\2\u0183\u0185\7s\2\2\u0184\u0183\3\2\2\2\u0184"+ "\5(\25\2\u0182\u0184\7\20\2\2\u0183\u0185\7t\2\2\u0184\u0183\3\2\2\2\u0184"+
"\u0185\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0188\5(\25\2\u0187\u0182\3\2"+ "\u0185\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0188\5(\25\2\u0187\u0182\3\2"+
"\2\2\u0188\u018b\3\2\2\2\u0189\u0187\3\2\2\2\u0189\u018a\3\2\2\2\u018a"+ "\2\2\u0188\u018b\3\2\2\2\u0189\u0187\3\2\2\2\u0189\u018a\3\2\2\2\u018a"+
"\u018d\3\2\2\2\u018b\u0189\3\2\2\2\u018c\u018e\7s\2\2\u018d\u018c\3\2"+ "\u018d\3\2\2\2\u018b\u0189\3\2\2\2\u018c\u018e\7t\2\2\u018d\u018c\3\2"+
"\2\2\u018d\u018e\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0190\7\36\2\2\u0190"+ "\2\2\u018d\u018e\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0190\7\36\2\2\u0190"+
"M\3\2\2\2\u0191\u0192\7y\2\2\u0192O\3\2\2\2\u0193\u0194\7{\2\2\u0194Q"+ "M\3\2\2\2\u0191\u0192\7z\2\2\u0192O\3\2\2\2\u0193\u0194\7|\2\2\u0194Q"+
"\3\2\2\2\u0195\u0196\7x\2\2\u0196S\3\2\2\2\u0197\u019e\5F$\2\u0198\u019e"+ "\3\2\2\2\u0195\u0196\7y\2\2\u0196S\3\2\2\2\u0197\u019e\5F$\2\u0198\u019e"+
"\5J&\2\u0199\u019e\5L\'\2\u019a\u019e\5N(\2\u019b\u019e\5P)\2\u019c\u019e"+ "\5J&\2\u0199\u019e\5L\'\2\u019a\u019e\5N(\2\u019b\u019e\5P)\2\u019c\u019e"+
"\5R*\2\u019d\u0197\3\2\2\2\u019d\u0198\3\2\2\2\u019d\u0199\3\2\2\2\u019d"+ "\5R*\2\u019d\u0197\3\2\2\2\u019d\u0198\3\2\2\2\u019d\u0199\3\2\2\2\u019d"+
"\u019a\3\2\2\2\u019d\u019b\3\2\2\2\u019d\u019c\3\2\2\2\u019eU\3\2\2\2"+ "\u019a\3\2\2\2\u019d\u019b\3\2\2\2\u019d\u019c\3\2\2\2\u019eU\3\2\2\2"+
"\u019f\u01a0\7V\2\2\u01a0\u01a1\7z\2\2\u01a1W\3\2\2\2\u01a2\u01a3\7W\2"+ "\u019f\u01a0\7V\2\2\u01a0\u01a1\7{\2\2\u01a1W\3\2\2\2\u01a2\u01a3\7W\2"+
"\2\u01a3\u01a4\5<\37\2\u01a4\u01a6\7A\2\2\u01a5\u01a7\5^\60\2\u01a6\u01a5"+ "\2\u01a3\u01a4\5<\37\2\u01a4\u01a6\7A\2\2\u01a5\u01a7\5^\60\2\u01a6\u01a5"+
"\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01aa\7B\2\2\u01a9"+ "\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01aa\7B\2\2\u01a9"+
"\u01ab\5Z.\2\u01aa\u01a9\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01ac\3\2\2"+ "\u01ab\5Z.\2\u01aa\u01a9\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01ac\3\2\2"+
"\2\u01ac\u01ad\5\\/\2\u01ad\u01ae\7s\2\2\u01aeY\3\2\2\2\u01af\u01b0\7"+ "\2\u01ac\u01ad\5\\/\2\u01ad\u01ae\7t\2\2\u01aeY\3\2\2\2\u01af\u01b0\7"+
"X\2\2\u01b0\u01b1\5`\61\2\u01b1[\3\2\2\2\u01b2\u01b3\7Y\2\2\u01b3\u01b8"+ "X\2\2\u01b0\u01b1\5`\61\2\u01b1[\3\2\2\2\u01b2\u01b3\7Y\2\2\u01b3\u01b8"+
"\7s\2\2\u01b4\u01b7\5\b\5\2\u01b5\u01b7\7s\2\2\u01b6\u01b4\3\2\2\2\u01b6"+ "\7t\2\2\u01b4\u01b7\5\b\5\2\u01b5\u01b7\7t\2\2\u01b6\u01b4\3\2\2\2\u01b6"+
"\u01b5\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8\u01b6\3\2\2\2\u01b8\u01b9\3\2"+ "\u01b5\3\2\2\2\u01b7\u01ba\3\2\2\2\u01b8\u01b6\3\2\2\2\u01b8\u01b9\3\2"+
"\2\2\u01b9\u01bb\3\2\2\2\u01ba\u01b8\3\2\2\2\u01bb\u01bc\7Z\2\2\u01bc"+ "\2\2\u01b9\u01bb\3\2\2\2\u01ba\u01b8\3\2\2\2\u01bb\u01bc\7Z\2\2\u01bc"+
"]\3\2\2\2\u01bd\u01c5\5\22\n\2\u01be\u01c0\7\20\2\2\u01bf\u01c1\7s\2\2"+ "]\3\2\2\2\u01bd\u01c5\5\22\n\2\u01be\u01c0\7\20\2\2\u01bf\u01c1\7t\2\2"+
"\u01c0\u01bf\3\2\2\2\u01c0\u01c1\3\2\2\2\u01c1\u01c2\3\2\2\2\u01c2\u01c4"+ "\u01c0\u01bf\3\2\2\2\u01c0\u01c1\3\2\2\2\u01c1\u01c2\3\2\2\2\u01c2\u01c4"+
"\5\22\n\2\u01c3\u01be\3\2\2\2\u01c4\u01c7\3\2\2\2\u01c5\u01c3\3\2\2\2"+ "\5\22\n\2\u01c3\u01be\3\2\2\2\u01c4\u01c7\3\2\2\2\u01c5\u01c3\3\2\2\2"+
"\u01c5\u01c6\3\2\2\2\u01c6_\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c8\u01d0\5"+ "\u01c5\u01c6\3\2\2\2\u01c6_\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c8\u01d0\5"+
"\32\16\2\u01c9\u01cb\7\20\2\2\u01ca\u01cc\7s\2\2\u01cb\u01ca\3\2\2\2\u01cb"+ "\32\16\2\u01c9\u01cb\7\20\2\2\u01ca\u01cc\7t\2\2\u01cb\u01ca\3\2\2\2\u01cb"+
"\u01cc\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\u01cf\5\32\16\2\u01ce\u01c9\3"+ "\u01cc\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\u01cf\5\32\16\2\u01ce\u01c9\3"+
"\2\2\2\u01cf\u01d2\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1"+ "\2\2\2\u01cf\u01d2\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1"+
"a\3\2\2\2\u01d2\u01d0\3\2\2\2\u01d3\u01d4\7[\2\2\u01d4\u01d5\5<\37\2\u01d5"+ "a\3\2\2\2\u01d2\u01d0\3\2\2\2\u01d3\u01d4\7[\2\2\u01d4\u01d5\5<\37\2\u01d5"+
@@ -4495,50 +4509,51 @@ public class prog8Parser extends Parser {
"\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6\u01e9\7B\2\2\u01e7\u01ea\5d\63\2\u01e8"+ "\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6\u01e9\7B\2\2\u01e7\u01ea\5d\63\2\u01e8"+
"\u01ea\5\\/\2\u01e9\u01e7\3\2\2\2\u01e9\u01e8\3\2\2\2\u01eac\3\2\2\2\u01eb"+ "\u01ea\5\\/\2\u01e9\u01e7\3\2\2\2\u01e9\u01e8\3\2\2\2\u01eac\3\2\2\2\u01eb"+
"\u01ec\7\21\2\2\u01ec\u01ed\5F$\2\u01ede\3\2\2\2\u01ee\u01f6\5h\65\2\u01ef"+ "\u01ec\7\21\2\2\u01ec\u01ed\5F$\2\u01ede\3\2\2\2\u01ee\u01f6\5h\65\2\u01ef"+
"\u01f1\7\20\2\2\u01f0\u01f2\7s\2\2\u01f1\u01f0\3\2\2\2\u01f1\u01f2\3\2"+ "\u01f1\7\20\2\2\u01f0\u01f2\7t\2\2\u01f1\u01f0\3\2\2\2\u01f1\u01f2\3\2"+
"\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f5\5h\65\2\u01f4\u01ef\3\2\2\2\u01f5"+ "\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f5\5h\65\2\u01f4\u01ef\3\2\2\2\u01f5"+
"\u01f8\3\2\2\2\u01f6\u01f4\3\2\2\2\u01f6\u01f7\3\2\2\2\u01f7g\3\2\2\2"+ "\u01f8\3\2\2\2\u01f6\u01f4\3\2\2\2\u01f6\u01f7\3\2\2\2\u01f7g\3\2\2\2"+
"\u01f8\u01f6\3\2\2\2\u01f9\u01fa\5\22\n\2\u01fa\u01fd\7D\2\2\u01fb\u01fe"+ "\u01f8\u01f6\3\2\2\2\u01f9\u01fa\5\22\n\2\u01fa\u01fe\7D\2\2\u01fb\u01ff"+
"\5B\"\2\u01fc\u01fe\5D#\2\u01fd\u01fb\3\2\2\2\u01fd\u01fc\3\2\2\2\u01fe"+ "\5B\"\2\u01fc\u01ff\5D#\2\u01fd\u01ff\7]\2\2\u01fe\u01fb\3\2\2\2\u01fe"+
"i\3\2\2\2\u01ff\u0204\5@!\2\u0200\u0201\7\20\2\2\u0201\u0203\5@!\2\u0202"+ "\u01fc\3\2\2\2\u01fe\u01fd\3\2\2\2\u01ffi\3\2\2\2\u0200\u0205\5@!\2\u0201"+
"\u0200\3\2\2\2\u0203\u0206\3\2\2\2\u0204\u0202\3\2\2\2\u0204\u0205\3\2"+ "\u0202\7\20\2\2\u0202\u0204\5@!\2\u0203\u0201\3\2\2\2\u0204\u0207\3\2"+
"\2\2\u0205k\3\2\2\2\u0206\u0204\3\2\2\2\u0207\u020f\5n8\2\u0208\u020a"+ "\2\2\u0205\u0203\3\2\2\2\u0205\u0206\3\2\2\2\u0206k\3\2\2\2\u0207\u0205"+
"\7\20\2\2\u0209\u020b\7s\2\2\u020a\u0209\3\2\2\2\u020a\u020b\3\2\2\2\u020b"+ "\3\2\2\2\u0208\u0210\5n8\2\u0209\u020b\7\20\2\2\u020a\u020c\7t\2\2\u020b"+
"\u020c\3\2\2\2\u020c\u020e\5n8\2\u020d\u0208\3\2\2\2\u020e\u0211\3\2\2"+ "\u020a\3\2\2\2\u020b\u020c\3\2\2\2\u020c\u020d\3\2\2\2\u020d\u020f\5n"+
"\2\u020f\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210m\3\2\2\2\u0211\u020f"+ "8\2\u020e\u0209\3\2\2\2\u020f\u0212\3\2\2\2\u0210\u020e\3\2\2\2\u0210"+
"\3\2\2\2\u0212\u0213\5\32\16\2\u0213\u0216\7D\2\2\u0214\u0217\5B\"\2\u0215"+ "\u0211\3\2\2\2\u0211m\3\2\2\2\u0212\u0210\3\2\2\2\u0213\u0214\5\32\16"+
"\u0217\5D#\2\u0216\u0214\3\2\2\2\u0216\u0215\3\2\2\2\u0217o\3\2\2\2\u0218"+ "\2\u0214\u0218\7D\2\2\u0215\u0219\5B\"\2\u0216\u0219\5D#\2\u0217\u0219"+
"\u0219\7]\2\2\u0219\u021b\5(\25\2\u021a\u021c\7s\2\2\u021b\u021a\3\2\2"+ "\7]\2\2\u0218\u0215\3\2\2\2\u0218\u0216\3\2\2\2\u0218\u0217\3\2\2\2\u0219"+
"\2\u021b\u021c\3\2\2\2\u021c\u021f\3\2\2\2\u021d\u0220\5\b\5\2\u021e\u0220"+ "o\3\2\2\2\u021a\u021b\7^\2\2\u021b\u021d\5(\25\2\u021c\u021e\7t\2\2\u021d"+
"\5\\/\2\u021f\u021d\3\2\2\2\u021f\u021e\3\2\2\2\u0220\u0222\3\2\2\2\u0221"+ "\u021c\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u0221\3\2\2\2\u021f\u0222\5\b"+
"\u0223\7s\2\2\u0222\u0221\3\2\2\2\u0222\u0223\3\2\2\2\u0223\u0225\3\2"+ "\5\2\u0220\u0222\5\\/\2\u0221\u021f\3\2\2\2\u0221\u0220\3\2\2\2\u0222"+
"\2\2\u0224\u0226\5r:\2\u0225\u0224\3\2\2\2\u0225\u0226\3\2\2\2\u0226q"+ "\u0224\3\2\2\2\u0223\u0225\7t\2\2\u0224\u0223\3\2\2\2\u0224\u0225\3\2"+
"\3\2\2\2\u0227\u0229\7^\2\2\u0228\u022a\7s\2\2\u0229\u0228\3\2\2\2\u0229"+ "\2\2\u0225\u0227\3\2\2\2\u0226\u0228\5r:\2\u0227\u0226\3\2\2\2\u0227\u0228"+
"\u022a\3\2\2\2\u022a\u022d\3\2\2\2\u022b\u022e\5\b\5\2\u022c\u022e\5\\"+ "\3\2\2\2\u0228q\3\2\2\2\u0229\u022b\7_\2\2\u022a\u022c\7t\2\2\u022b\u022a"+
"/\2\u022d\u022b\3\2\2\2\u022d\u022c\3\2\2\2\u022es\3\2\2\2\u022f\u0231"+ "\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u022f\3\2\2\2\u022d\u0230\5\b\5\2\u022e"+
"\5v<\2\u0230\u0232\7s\2\2\u0231\u0230\3\2\2\2\u0231\u0232\3\2\2\2\u0232"+ "\u0230\5\\/\2\u022f\u022d\3\2\2\2\u022f\u022e\3\2\2\2\u0230s\3\2\2\2\u0231"+
"\u0235\3\2\2\2\u0233\u0236\5\b\5\2\u0234\u0236\5\\/\2\u0235\u0233\3\2"+ "\u0233\5v<\2\u0232\u0234\7t\2\2\u0233\u0232\3\2\2\2\u0233\u0234\3\2\2"+
"\2\2\u0235\u0234\3\2\2\2\u0236\u0238\3\2\2\2\u0237\u0239\7s\2\2\u0238"+ "\2\u0234\u0237\3\2\2\2\u0235\u0238\5\b\5\2\u0236\u0238\5\\/\2\u0237\u0235"+
"\u0237\3\2\2\2\u0238\u0239\3\2\2\2\u0239\u023b\3\2\2\2\u023a\u023c\5r"+ "\3\2\2\2\u0237\u0236\3\2\2\2\u0238\u023a\3\2\2\2\u0239\u023b\7t\2\2\u023a"+
":\2\u023b\u023a\3\2\2\2\u023b\u023c\3\2\2\2\u023c\u023d\3\2\2\2\u023d"+ "\u0239\3\2\2\2\u023a\u023b\3\2\2\2\u023b\u023d\3\2\2\2\u023c\u023e\5r"+
"\u023e\7s\2\2\u023eu\3\2\2\2\u023f\u0240\t\20\2\2\u0240w\3\2\2\2\u0241"+ ":\2\u023d\u023c\3\2\2\2\u023d\u023e\3\2\2\2\u023e\u023f\3\2\2\2\u023f"+
"\u0243\7k\2\2\u0242\u0244\5\32\16\2\u0243\u0242\3\2\2\2\u0243\u0244\3"+ "\u0240\7t\2\2\u0240u\3\2\2\2\u0241\u0242\t\20\2\2\u0242w\3\2\2\2\u0243"+
"\2\2\2\u0244\u0247\3\2\2\2\u0245\u0248\5@!\2\u0246\u0248\5<\37\2\u0247"+ "\u0245\7l\2\2\u0244\u0246\5\32\16\2\u0245\u0244\3\2\2\2\u0245\u0246\3"+
"\u0245\3\2\2\2\u0247\u0246\3\2\2\2\u0248\u0249\3\2\2\2\u0249\u024a\7l"+ "\2\2\2\u0246\u0249\3\2\2\2\u0247\u024a\5@!\2\u0248\u024a\5<\37\2\u0249"+
"\2\2\u024a\u024c\5(\25\2\u024b\u024d\7s\2\2\u024c\u024b\3\2\2\2\u024c"+ "\u0247\3\2\2\2\u0249\u0248\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u024c\7m"+
"\u024d\3\2\2\2\u024d\u024e\3\2\2\2\u024e\u024f\5\\/\2\u024fy\3\2\2\2\u0250"+ "\2\2\u024c\u024e\5(\25\2\u024d\u024f\7t\2\2\u024e\u024d\3\2\2\2\u024e"+
"\u0251\7m\2\2\u0251\u0253\5(\25\2\u0252\u0254\7s\2\2\u0253\u0252\3\2\2"+ "\u024f\3\2\2\2\u024f\u0250\3\2\2\2\u0250\u0251\5\\/\2\u0251y\3\2\2\2\u0252"+
"\2\u0253\u0254\3\2\2\2\u0254\u0257\3\2\2\2\u0255\u0258\5\b\5\2\u0256\u0258"+ "\u0253\7n\2\2\u0253\u0255\5(\25\2\u0254\u0256\7t\2\2\u0255\u0254\3\2\2"+
"\5\\/\2\u0257\u0255\3\2\2\2\u0257\u0256\3\2\2\2\u0258{\3\2\2\2\u0259\u025c"+ "\2\u0255\u0256\3\2\2\2\u0256\u0259\3\2\2\2\u0257\u025a\5\b\5\2\u0258\u025a"+
"\7n\2\2\u025a\u025d\5\b\5\2\u025b\u025d\5\\/\2\u025c\u025a\3\2\2\2\u025c"+ "\5\\/\2\u0259\u0257\3\2\2\2\u0259\u0258\3\2\2\2\u025a{\3\2\2\2\u025b\u025e"+
"\u025b\3\2\2\2\u025d\u025f\3\2\2\2\u025e\u0260\7s\2\2\u025f\u025e\3\2"+ "\7o\2\2\u025c\u025f\5\b\5\2\u025d\u025f\5\\/\2\u025e\u025c\3\2\2\2\u025e"+
"\2\2\u025f\u0260\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0262\7o\2\2\u0262"+ "\u025d\3\2\2\2\u025f\u0261\3\2\2\2\u0260\u0262\7t\2\2\u0261\u0260\3\2"+
"\u0263\5(\25\2\u0263}\3\2\2\2D\u0080\u0082\u0089\u008e\u00a9\u00b1\u00b5"+ "\2\2\u0261\u0262\3\2\2\2\u0262\u0263\3\2\2\2\u0263\u0264\7p\2\2\u0264"+
"\u0265\5(\25\2\u0265}\3\2\2\2D\u0080\u0082\u0089\u008e\u00a9\u00b1\u00b5"+
"\u00bc\u00bf\u00c4\u00c8\u00ce\u00e9\u00f4\u0108\u0130\u0134\u0136\u0147"+ "\u00bc\u00bf\u00c4\u00c8\u00ce\u00e9\u00f4\u0108\u0130\u0134\u0136\u0147"+
"\u014e\u0155\u015a\u015f\u016c\u0177\u017f\u0184\u0189\u018d\u019d\u01a6"+ "\u014e\u0155\u015a\u015f\u016c\u0177\u017f\u0184\u0189\u018d\u019d\u01a6"+
"\u01aa\u01b6\u01b8\u01c0\u01c5\u01cb\u01d0\u01d7\u01de\u01e4\u01e9\u01f1"+ "\u01aa\u01b6\u01b8\u01c0\u01c5\u01cb\u01d0\u01d7\u01de\u01e4\u01e9\u01f1"+
"\u01f6\u01fd\u0204\u020a\u020f\u0216\u021b\u021f\u0222\u0225\u0229\u022d"+ "\u01f6\u01fe\u0205\u020b\u0210\u0218\u021d\u0221\u0224\u0227\u022b\u022f"+
"\u0231\u0235\u0238\u023b\u0243\u0247\u024c\u0253\u0257\u025c\u025f"; "\u0233\u0237\u023a\u023d\u0245\u0249\u024e\u0255\u0259\u025e\u0261";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@@ -24,9 +24,13 @@ enum class Syscall(val callNr: Short) {
VM_GFX_TEXT(18), // write text on screen at cursor position (x,y,color,text) pushed on stack in that order (pixel pos= x*8, y*8) VM_GFX_TEXT(18), // write text on screen at cursor position (x,y,color,text) pushed on stack in that order (pixel pos= x*8, y*8)
VM_GFX_LINE(19), // draw line on screen at (x1,y1,x2,y2,color) pushed on stack in that order VM_GFX_LINE(19), // draw line on screen at (x1,y1,x2,y2,color) pushed on stack in that order
FUNC_SIN(66), FUNC_SIN(60),
FUNC_COS(67), FUNC_SIN8(61),
FUNC_ABS(68), FUNC_SIN16(62),
FUNC_COS(63),
FUNC_COS8(64),
FUNC_COS16(65),
FUNC_ABS(70),
FUNC_TAN(71), FUNC_TAN(71),
FUNC_ATAN(72), FUNC_ATAN(72),
FUNC_LN(73), FUNC_LN(73),
@@ -1523,6 +1527,22 @@ class StackVm(private var traceOutputFile: String?) {
} }
Syscall.FUNC_SIN -> evalstack.push(Value(DataType.FLOAT, sin(evalstack.pop().numericValue().toDouble()))) Syscall.FUNC_SIN -> evalstack.push(Value(DataType.FLOAT, sin(evalstack.pop().numericValue().toDouble())))
Syscall.FUNC_COS -> evalstack.push(Value(DataType.FLOAT, cos(evalstack.pop().numericValue().toDouble()))) Syscall.FUNC_COS -> evalstack.push(Value(DataType.FLOAT, cos(evalstack.pop().numericValue().toDouble())))
Syscall.FUNC_SIN8 -> {
val rad = evalstack.pop().numericValue().toDouble() /256.0 * 2.0 * PI
evalstack.push(Value(DataType.BYTE, (32767.5* sin(rad)).toInt().shr(8).toShort()))
}
Syscall.FUNC_SIN16 -> {
val rad = evalstack.pop().numericValue().toDouble() /256.0 * 2.0 * PI
evalstack.push(Value(DataType.WORD, (32767.5* sin(rad)).toInt()))
}
Syscall.FUNC_COS8 -> {
val rad = evalstack.pop().numericValue().toDouble() /256.0 * 2.0 * PI
evalstack.push(Value(DataType.BYTE, (32767.5* cos(rad)).toInt().shr(8).toShort()))
}
Syscall.FUNC_COS16 -> {
val rad = evalstack.pop().numericValue().toDouble() /256.0 * 2.0 * PI
evalstack.push(Value(DataType.WORD, (32767.5* cos(rad)).toInt()))
}
Syscall.FUNC_ROUND -> evalstack.push(Value(DataType.WORD, evalstack.pop().numericValue().toDouble().roundToInt())) Syscall.FUNC_ROUND -> evalstack.push(Value(DataType.WORD, evalstack.pop().numericValue().toDouble().roundToInt()))
Syscall.FUNC_ABS -> { Syscall.FUNC_ABS -> {
val value = evalstack.pop() val value = evalstack.pop()

View File

@@ -507,10 +507,22 @@ You can use them in expressions and the compiler will evaluate them at compile-t
sin(x) sin(x)
Sine. Sine. (floating point version)
cos(x) cos(x)
Cosine. Cosine. (floating point version)
sin8(x)
Fast 8-bit byte sine of angle 0..255
sin16(x)
Fast 16-bit word sine of angle 0..255
cos8(x)
Fast 8-bit byte cosine of angle 0..255
cos16(x)
Fast 16-bit word cosine of angle 0..255
abs(x) abs(x)
Absolute value. Absolute value.

View File

@@ -920,7 +920,27 @@ func_sin .proc
jsr c64.SIN jsr c64.SIN
jmp push_fac1_as_result jmp push_fac1_as_result
.pend .pend
func_sin8 .proc
ldy ESTACK_LO+1,x
lda func_sin16.sinecos8hi,y
sta ESTACK_LO+1,x
rts
.pend
func_sin16 .proc
ldy ESTACK_LO+1,x
lda func_sin16.sinecos8lo,y
sta ESTACK_LO+1,x
lda func_sin16.sinecos8hi,y
sta ESTACK_HI+1,x
rts
_ := 32767.5 * sin(range(256+64) * rad(360.0/256.0))
sinecos8lo .byte <_
sinecos8hi .byte >_
.pend
func_cos .proc func_cos .proc
; -- push cos(f) back onto stack ; -- push cos(f) back onto stack
jsr pop_float_fac1 jsr pop_float_fac1
@@ -929,6 +949,22 @@ func_cos .proc
jmp push_fac1_as_result jmp push_fac1_as_result
.pend .pend
func_cos8 .proc
ldy ESTACK_LO+1,x
lda func_sin16.sinecos8hi+64,y
sta ESTACK_LO+1,x
rts
.pend
func_cos16 .proc
ldy ESTACK_LO+1,x
lda func_sin16.sinecos8lo+64,y
sta ESTACK_LO+1,x
lda func_sin16.sinecos8hi+64,y
sta ESTACK_HI+1,x
rts
.pend
func_tan .proc func_tan .proc
; -- push tan(f) back onto stack ; -- push tan(f) back onto stack
jsr pop_float_fac1 jsr pop_float_fac1
@@ -1595,9 +1631,8 @@ func_memcopy .proc ; clobbers A,Y
sta SCRATCH_ZPWORD1 sta SCRATCH_ZPWORD1
lda ESTACK_HI+2,x lda ESTACK_HI+2,x
sta SCRATCH_ZPWORD1+1 sta SCRATCH_ZPWORD1+1
lda ESTACK_HI+1,x
tay
lda ESTACK_LO+1,x lda ESTACK_LO+1,x
ldy ESTACK_HI+1,x
pha pha
lda ESTACK_LO,x lda ESTACK_LO,x
tax tax